お世話になっております。現在オセロゲームを作ろうと考えています。そこで盤面を、JButton
を敷き詰めることで表現しようと考えています、具体的には次のようなコードです。Cell
はJButton
を継承したもので、盤面内での座標をint[] distance
として持っています。
<ButtonPanel> private ArrayList<ArrayList<Cell>> board = new ArrayList<ArrayList<Cell>>(8); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for(int i = 0; i < 8; i++) { ArrayList<Cell> s = new ArrayList<Cell>(8); for(int j = 0; j < 8; j++) { /* i = y座標 * j = x座標 */ Cell c; if( j == 3 && i== 3 || j == 4 && i== 4) { c = new Cell(j,i,-1); //白 }else if(j == 3 && i == 4 || j == 4 && i == 3) { c = new Cell(j,i,1); //黒 }else { c = new Cell(j,i,0); } c.addActionListener(this); c.setActionCommand(j +","+ i); this.add(c); s.add(c); } board.add(s); }
そしてこの後、盤面であるboard
を、CheckCells
というクラス(置ける石の位置を探すためのクラス)に引数で送ります。
<CheckCells> private ArrayList<ArrayList<Cell>> board = new ArrayList<ArrayList<Cell>>(8); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public CheckCells(int a,ArrayList<ArrayList<Cell>> b) { //コンストラクタ this.board.addAll(b); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public HashSet<int[]> checkOk(){ //盤面(board)をもとに石を探す処理
この一連の流れではエラーなどは出ないのですが、checkOk
で返ってくる結果がおかしいため、デバックで調べてみました。
その結果、生成時(ButtonPanel
)では何の以上もないのですが、CheckCells
で処理に使われているboard
では、特定のCell
が持つdistance
に変化が生じるのです。
具体的には、board
の3行目4番(board.get(3).get(4)
)のdistance
が[5,2]、4行目3番が[2,5]となったり
3行目4番が[3,5]、4行目3番[5,3]となったりする具合です。ほかの要素はまったく変わっていませんでした。
大変長くなってしまったのですが、簡単に言うと、生成時では問題なかったはずの二次元リストboardを、引く数として渡し処理で使ったとたんリスト内の特定の部分の要素が変化してしまう、というのが今回の問題点です。board
に対しては一貫してget
などしか使っていないため、どこかで要素の追加や置き換え、削除を行ったりはしていません。(少なくとも自分が書いたコード内では)なぜこんな現象が起こるのでしょうか?
説明が下手で大変申し訳ありません。クラスが多めで処理も長いのですべてのクラスのコードは記載しませんが、不明な点があれば追記していきたいと思います。ご助力お願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/29 11:47
2018/04/29 12:22
2018/04/29 12:30
2018/04/29 17:32