実現したいこと
ArrayList に二次元配列の要素を格納したく質問しました!
現在、学習のためにJavaで8×8の盤面のオセロを作っています。
「戻るボタン」の押下時に前回の盤面に戻す と言う仕組みを実装しているのですが、ボタンが上手く作動しないため質問した次第です。
よろしくお願いいたします。
変数 board[8][8] の配列でオセロの盤面を表現しています。
これを
ArrayList<String[][]> record に一手目、二手目と手数ごとに記録するために、
record.add(board.clone()); で追加しています。
しかし、「戻るボタン」を押下しても盤面が変わりません。
「戻るボタン」を押下すると、
record.get(cnt_turn);
が回る仕組みです。
※cnt_turnはint型の変数で、一手打つたびにインクリメントします。
recordの変数をデバッグで確認したところ、一手目二手目ごとにアドレス(ハッシュ値?)は違うのですが、格納されている要素が同じでした。
ネットで調べたところ、参照している先が同じで要素が同じになってしまうのかと思い、要素を一つ一つ格納するために、arraycopyやfor文で回したりと色々試そうとしたのですが、入れ子になっているarraylistに要素を一つ一つ格納するやり方がわかりませんでした。
ちなみに、arraylistを使用しなくてもhashmapでもなんでも、「戻るボタン」が作動すれば大丈夫なのですが、配列を3次元配列にした場合だと、配列の大きさを決めなくてはいけないので3次元配列は使わずに実装できればと考えています。
※「パスボタン」を別途作っており、パスするたびに一手カウントされる仕組みのため、終わりが何手目か予測できないのが理由です。
以上、長々と失礼いたしました。
結果、表題通りですが、arraylistの要素の複製と取得を教えていただければ幸いです。
ソースは下記に記載いたします。
よろしくお願いいたします。
ソースコード(一部抜粋しました)
Java
1 2// 8×8の盤面のデータを格納するインスタンス 3static public String[][] board = new String[8][8]; 4 5// 何手目かカウントする変数 6static public int cnt_turn = 0; 7 8// 8×8の盤面のデータを追加していくリスト 9static public ArrayList<String[][]> record = new ArrayList<String[][]>(); 10 11// 配列に格納するオセロのデータ 12static final String EMPTY = " "; 13static final String BLACK = "●"; 14static final String WHITE = "○"; 15 16 17//オセロ版の要素の初期値を作成 18for (int i = 0; i < 8; i++) { 19 for (int j = 0; j < 8; j++) { 20 board[i][j] = EMPTY; 21 } 22} 23 24board[3][3] = BLACK; 25board[3][4] = WHITE; 26board[4][3] = WHITE; 27board[4][4] = BLACK; 28 29// オセロの盤面の初期値をrecordに記録する 30record.add(board.clone()); 31 32// 一手打つごとにrecordに記録する & 何手目かカウント 33cnt_turn++; 34record.add(board.clone()); 35 36// 戻るボタンを押下した際の処理 → しかし盤面変わらず... 37cnt_turn--; 38record.get(cnt_turn); 39
更新されてしまう変数の中身です
宣言している変数 static public ArrayList<String[][]> record = new ArrayList<String[][]>(); 一手目の変数recordの内容 [[[Ljava.lang.String;@4a4fbd34] [[ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ], [ , , , ●, ○, , , ], [ , , , ○, ●, , , ], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ]] 二手目の変数recordの内容(一手目の要素が更新している!?) [[[Ljava.lang.String;@4a4fbd34, [[Ljava.lang.String;@1f31d4ae] [[ , , , , , , , ], [ , , , , , , , ], [ , , , , ●, , , ], [ , , , ●, ●, , , ], [ , , , ○, ●, , , ], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ]] [[ , , , , , , , ], [ , , , , , , , ], [ , , , , ●, , , ], [ , , , ●, ●, , , ], [ , , , ○, ●, , , ], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ]]
(参考までに)
オセロのひっくり返すロジックは下記サイトと同じです。
https://techacademy.jp/magazine/22228
不備、不明点等あればご連絡ください!
よろしくお願いいたします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/07 23:34 編集