teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

追記

2018/04/29 01:29

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -9,18 +9,20 @@
9
9
 
10
10
  printデバックとして、Cell に以下のようなtoStringメソッドを追加してみてはどうでしょうか?
11
11
  ```Java
12
+ @SuppressWarnings("serial")
12
13
  class Cell extends JButton {
14
+ // 質問の本題と関係ないので、distanceとpieceをpublicで定義しましたが、本来はGetter/Setterを定義する形の方が良いです。
13
- public int[] distance;
15
+ public final int[] distance;
14
- public int j2;
16
+ public int piece;// 駒
15
17
 
16
18
  public Cell(int j, int i, int j2) {
17
- distance = new int[] { j, i };
19
+ this.distance = new int[] { j, i };
18
- this.j2 = j2;
20
+ this.piece = j2;
19
21
  }
20
22
 
21
23
  @Override
22
24
  public String toString() {
23
- return Arrays.toString(distance) + ":" + String.valueOf(j2);
25
+ return Arrays.toString(distance) + ":" + String.valueOf(this.piece);
24
26
  }
25
27
  }
26
28
  ```

5

追加

2018/04/29 01:29

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -3,11 +3,43 @@
3
3
  ブレイクポイントしたタイミングで式が評価されて結果が変わります。
4
4
 
5
5
  ---
6
+
7
+ 質問文のコードでは`c = new Cell(j,i,-1);`と`i`と`j`を逆に渡しているので、コンストラクタでそのまま設定していると仮定すると
8
+ > board.get(3).get(4) このコードで取得できるのは、4行目の3番のマスの値では?
9
+
10
+ printデバックとして、Cell に以下のようなtoStringメソッドを追加してみてはどうでしょうか?
11
+ ```Java
12
+ class Cell extends JButton {
13
+ public int[] distance;
14
+ public int j2;
15
+
16
+ public Cell(int j, int i, int j2) {
17
+ distance = new int[] { j, i };
18
+ this.j2 = j2;
19
+ }
20
+
21
+ @Override
22
+ public String toString() {
23
+ return Arrays.toString(distance) + ":" + String.valueOf(j2);
24
+ }
25
+ }
26
+ ```
27
+
28
+ `ButtonPanel`クラスに以下のコードを追加
29
+ ```Java
30
+ public void dump(ArrayList<ArrayList<Cell>> board) {
31
+ for (ArrayList<Cell> r : board) {
32
+ System.out.println(Arrays.toString(r.toArray(new Cell[0])));
33
+ }
34
+ }
35
+ ```
36
+
37
+
6
38
  気になる点
7
- 0. CheckCellsクラスのcheckOkメソッドはHashSet<int[]>で返していますが、HashSetはセットの繰り返し順序について保証しません。
39
+ 0. `CheckCells`クラスの`checkOk`メソッドは`HashSet<int[]>`値を返していますが、`HashSet`はセットの繰り返し順序について保証しません。
8
40
 
9
41
  0. > CellはJButtonを継承したもので、盤面内での座標をint[] distanceとして持っています。
10
- `JButton`は表示とボタンアクションの通知だけにして、`JPanel`と盤面の情報を管理するクラス(Boardクラス)を作成して、`JPanel`のイベントでアクションコマンドの引数を元に紐付けする形にもできるかと。
42
+ `JButton`は表示とボタンアクションの通知だけにして、`JPanel`と盤面の情報を管理するクラス(`Board`クラス)を作成して、`JPanel`のイベントでアクションコマンドの引数を元に紐付けする形にもできるかと。
11
43
 
12
44
  0. オセロなら盤面が固定(8*8)なため、生成時に要素が固定な多重配列(ジャグ配列)で管理するのも一つの手かと。これなら生成し直さない限り、要素数の変動は原理上起こりえません。
13
45
 

4

追記

2018/04/29 01:16

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,13 +1,18 @@
1
1
  質問文で引用している部分に関しては問題はないです。
2
-
3
2
  デバック実行とのことなので、ウォッチ式を設定していませんか?
4
3
  ブレイクポイントしたタイミングで式が評価されて結果が変わります。
5
4
 
6
5
  ---
7
- オセロなら盤面が固定なため、生成時要素が固定多重配列(ジャグ配列)で管理して、
6
+ になる点
8
- Boardクラスを作成して、管理してみるのも一つの手かと。これなら要素数の変動は原理上起こりえません。
9
- あとBoardクラスのメソッドで行うべき処理を別クラス(CheckCells)を作成して行ってるように見えるクラス名です。
7
+ 0. CheckCellsクラスのcheckOkメソッドはHashSet<int[]>していが、HashSetはセットの繰り返し順序について保証しません
10
8
 
9
+ 0. > CellはJButtonを継承したもので、盤面内での座標をint[] distanceとして持っています。
10
+ `JButton`は表示とボタンアクションの通知だけにして、`JPanel`と盤面の情報を管理するクラス(Boardクラス)を作成して、`JPanel`のイベントでアクションコマンドの引数を元に紐付けする形にもできるかと。
11
+
12
+ 0. オセロなら盤面が固定(8*8)なため、生成時に要素が固定な多重配列(ジャグ配列)で管理するのも一つの手かと。これなら生成し直さない限り、要素数の変動は原理上起こりえません。
13
+
14
+ 0. `CheckCells`という置ける石の位置を探すためのクラスで盤面情報を管理するクラスにひとまとめにしたほうがという2重管理を防げるかと。
15
+
11
16
  ```Java
12
17
  import java.beans.PropertyChangeListener;
13
18
  import java.beans.PropertyChangeSupport;

3

追記

2018/04/28 17:17

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -4,11 +4,13 @@
4
4
  ブレイクポイントしたタイミングで式が評価されて結果が変わります。
5
5
 
6
6
  ---
7
- オセロなら盤面が固定なため、生成時に要素が固定な多重配列(ジャグ配列)で管理して、
7
+ オセロなら盤面が固定なため、生成時に要素が固定な多重配列(ジャグ配列)で管理して、
8
8
  Boardクラスを作成して、管理してみるのも一つの手かと。これなら要素数の変動は原理上起こりえません。
9
9
  あとBoardクラスのメソッドで行うべき処理を別クラス(CheckCells)を作成して行っているように見えるクラス名です。
10
10
 
11
11
  ```Java
12
+ import java.beans.PropertyChangeListener;
13
+ import java.beans.PropertyChangeSupport;
12
14
  import java.util.Arrays;
13
15
 
14
16
  public class A123942 {
@@ -21,6 +23,7 @@
21
23
 
22
24
  class Board {
23
25
  private final int[][] board = new int[8][8];
26
+ private final PropertyChangeSupport changes = new PropertyChangeSupport(this);
24
27
 
25
28
  Board() {
26
29
  board[3][3] = -1;
@@ -38,6 +41,21 @@
38
41
  // board[4][3] = Piece.Black;
39
42
  }
40
43
 
44
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
45
+ changes.addPropertyChangeListener(listener);
46
+ }
47
+
48
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
49
+ changes.removePropertyChangeListener(listener);
50
+ }
51
+
52
+ public void setPiece(int x, int y, int s) {
53
+ int oldValue = board[x][y];
54
+ board[x][y] = s;
55
+ // 変更イベントを発火
56
+ this.changes.firePropertyChange("setPiece", oldValue, s);
57
+ }
58
+
41
59
  @Override
42
60
  public String toString() {
43
61
  return Arrays.deepToString(board);

2

追記

2018/04/28 15:37

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -3,6 +3,7 @@
3
3
  デバック実行とのことなので、ウォッチ式を設定していませんか?
4
4
  ブレイクポイントしたタイミングで式が評価されて結果が変わります。
5
5
 
6
+ ---
6
7
  オセロなら盤面が固定なため、生成時に要素が固定な多重配列(ジャグ配列)で管理して、
7
8
  Boardクラスを作成して、管理してみるのも一つの手かと。これなら要素数の変動は原理上起こりえません。
8
9
  あとBoardクラスのメソッドで行うべき処理を別クラス(CheckCells)を作成して行っているように見えるクラス名です。

1

追記

2018/04/28 15:04

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -4,7 +4,8 @@
4
4
  ブレイクポイントしたタイミングで式が評価されて結果が変わります。
5
5
 
6
6
  オセロなら盤面が固定なため、生成時に要素が固定な多重配列(ジャグ配列)で管理して、
7
- Bordクラスを作成して、管理してみるのも一つの手かと。これなら要素数の変動は原理上起こりえません。
7
+ Boardクラスを作成して、管理してみるのも一つの手かと。これなら要素数の変動は原理上起こりえません。
8
+ あとBoardクラスのメソッドで行うべき処理を別クラス(CheckCells)を作成して行っているように見えるクラス名です。
8
9
 
9
10
  ```Java
10
11
  import java.util.Arrays;