回答編集履歴

6

追記

2018/04/29 01:29

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -20,19 +20,23 @@
20
20
 
21
21
  ```Java
22
22
 
23
+ @SuppressWarnings("serial")
24
+
23
25
  class Cell extends JButton {
24
26
 
27
+ // 質問の本題と関係ないので、distanceとpieceをpublicで定義しましたが、本来はGetter/Setterを定義する形の方が良いです。
28
+
25
- public int[] distance;
29
+ public final int[] distance;
26
-
30
+
27
- public int j2;
31
+ public int piece;// 駒
28
32
 
29
33
 
30
34
 
31
35
  public Cell(int j, int i, int j2) {
32
36
 
33
- distance = new int[] { j, i };
37
+ this.distance = new int[] { j, i };
34
-
38
+
35
- this.j2 = j2;
39
+ this.piece = j2;
36
40
 
37
41
  }
38
42
 
@@ -42,7 +46,7 @@
42
46
 
43
47
  public String toString() {
44
48
 
45
- return Arrays.toString(distance) + ":" + String.valueOf(j2);
49
+ return Arrays.toString(distance) + ":" + String.valueOf(this.piece);
46
50
 
47
51
  }
48
52
 

5

追加

2018/04/29 01:29

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -8,15 +8,79 @@
8
8
 
9
9
  ---
10
10
 
11
+
12
+
13
+ 質問文のコードでは`c = new Cell(j,i,-1);`と`i`と`j`を逆に渡しているので、コンストラクタでそのまま設定していると仮定すると
14
+
15
+ > board.get(3).get(4) このコードで取得できるのは、4行目の3番のマスの値では?
16
+
17
+
18
+
19
+ printデバックとして、Cell に以下のようなtoStringメソッドを追加してみてはどうでしょうか?
20
+
21
+ ```Java
22
+
23
+ class Cell extends JButton {
24
+
25
+ public int[] distance;
26
+
27
+ public int j2;
28
+
29
+
30
+
31
+ public Cell(int j, int i, int j2) {
32
+
33
+ distance = new int[] { j, i };
34
+
35
+ this.j2 = j2;
36
+
37
+ }
38
+
39
+
40
+
41
+ @Override
42
+
43
+ public String toString() {
44
+
45
+ return Arrays.toString(distance) + ":" + String.valueOf(j2);
46
+
47
+ }
48
+
49
+ }
50
+
51
+ ```
52
+
53
+
54
+
55
+ `ButtonPanel`クラスに以下のコードを追加
56
+
57
+ ```Java
58
+
59
+ public void dump(ArrayList<ArrayList<Cell>> board) {
60
+
61
+ for (ArrayList<Cell> r : board) {
62
+
63
+ System.out.println(Arrays.toString(r.toArray(new Cell[0])));
64
+
65
+ }
66
+
67
+ }
68
+
69
+ ```
70
+
71
+
72
+
73
+
74
+
11
75
  気になる点
12
76
 
13
- 0. CheckCellsクラスのcheckOkメソッドはHashSet<int[]>で返していますが、HashSetはセットの繰り返し順序について保証しません。
77
+ 0. `CheckCells`クラスの`checkOk`メソッドは`HashSet<int[]>`値を返していますが、`HashSet`はセットの繰り返し順序について保証しません。
14
78
 
15
79
 
16
80
 
17
81
  0. > CellはJButtonを継承したもので、盤面内での座標をint[] distanceとして持っています。
18
82
 
19
- `JButton`は表示とボタンアクションの通知だけにして、`JPanel`と盤面の情報を管理するクラス(Boardクラス)を作成して、`JPanel`のイベントでアクションコマンドの引数を元に紐付けする形にもできるかと。
83
+ `JButton`は表示とボタンアクションの通知だけにして、`JPanel`と盤面の情報を管理するクラス(`Board`クラス)を作成して、`JPanel`のイベントでアクションコマンドの引数を元に紐付けする形にもできるかと。
20
84
 
21
85
 
22
86
 

4

追記

2018/04/29 01:16

投稿

umyu
umyu

スコア5846

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

3

追記

2018/04/28 17:17

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  ---
12
12
 
13
- オセロなら盤面が固定なため、生成時に要素が固定な多重配列(ジャグ配列)で管理して、
13
+ オセロなら盤面が固定なため、生成時に要素が固定な多重配列(ジャグ配列)で管理して、
14
14
 
15
15
  Boardクラスを作成して、管理してみるのも一つの手かと。これなら要素数の変動は原理上起こりえません。
16
16
 
@@ -19,6 +19,10 @@
19
19
 
20
20
 
21
21
  ```Java
22
+
23
+ import java.beans.PropertyChangeListener;
24
+
25
+ import java.beans.PropertyChangeSupport;
22
26
 
23
27
  import java.util.Arrays;
24
28
 
@@ -43,6 +47,8 @@
43
47
  class Board {
44
48
 
45
49
  private final int[][] board = new int[8][8];
50
+
51
+ private final PropertyChangeSupport changes = new PropertyChangeSupport(this);
46
52
 
47
53
 
48
54
 
@@ -73,6 +79,36 @@
73
79
  // board[3][4] = Piece.Black;
74
80
 
75
81
  // board[4][3] = Piece.Black;
82
+
83
+ }
84
+
85
+
86
+
87
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
88
+
89
+ changes.addPropertyChangeListener(listener);
90
+
91
+ }
92
+
93
+
94
+
95
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
96
+
97
+ changes.removePropertyChangeListener(listener);
98
+
99
+ }
100
+
101
+
102
+
103
+ public void setPiece(int x, int y, int s) {
104
+
105
+ int oldValue = board[x][y];
106
+
107
+ board[x][y] = s;
108
+
109
+ // 変更イベントを発火
110
+
111
+ this.changes.firePropertyChange("setPiece", oldValue, s);
76
112
 
77
113
  }
78
114
 

2

追記

2018/04/28 15:37

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -7,6 +7,8 @@
7
7
  ブレイクポイントしたタイミングで式が評価されて結果が変わります。
8
8
 
9
9
 
10
+
11
+ ---
10
12
 
11
13
  オセロなら盤面が固定なため、生成時に要素が固定な多重配列(ジャグ配列)で管理して、
12
14
 

1

追記

2018/04/28 15:04

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -10,7 +10,9 @@
10
10
 
11
11
  オセロなら盤面が固定なため、生成時に要素が固定な多重配列(ジャグ配列)で管理して、
12
12
 
13
- Bordクラスを作成して、管理してみるのも一つの手かと。これなら要素数の変動は原理上起こりえません。
13
+ Boardクラスを作成して、管理してみるのも一つの手かと。これなら要素数の変動は原理上起こりえません。
14
+
15
+ あとBoardクラスのメソッドで行うべき処理を別クラス(CheckCells)を作成して行っているように見えるクラス名です。
14
16
 
15
17
 
16
18