質問編集履歴
5
BoardクラスのSystem.out.println(d+1);をd+1→dに変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -195,7 +195,7 @@
|
|
195
195
|
while ( n < p.size()-1 && p.get(n) != s) {
|
196
196
|
cx += direction[d].x;
|
197
197
|
cy += direction[d].y;
|
198
|
-
System.out.println(d
|
198
|
+
System.out.println(d);
|
199
199
|
ste[cx][cy].doReverse(ste[cx][cy].obverse);
|
200
200
|
n++;
|
201
201
|
}
|
4
手番、パス関連のコードを削除しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,16 +2,11 @@
|
|
2
2
|
|
3
3
|
```
|
4
4
|
java環境で8×8盤面のオセロを作成した。
|
5
|
-
- 石
|
5
|
+
- 石が置かれている、ひっくり返せないマスには置けない。
|
6
|
+
- 手番は考慮しない。
|
6
7
|
- 石を点(x,y)に置き、ひっくり返せる周囲の石を反転させたい。
|
7
8
|
```
|
8
9
|
|
9
|
-
### 注釈
|
10
|
-
```
|
11
|
-
手番やパスの処理がおかしい点は無視して下さい。
|
12
|
-
|
13
|
-
```
|
14
|
-
|
15
10
|
### 発生している問題
|
16
11
|
```
|
17
12
|
石を反転させる処理に問題が生じる
|
3
StoneクラスとBoardクラスを分割しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -71,4 +71,234 @@
|
|
71
71
|
上記のsetStoneAndReverse(int x, int y, int s){}において、反転を行った方角を示すdirection[d]を出力した。
|
72
72
|
- 意図しない石が反転された際、予想外の方向にも反転を行っていることが分かった。
|
73
73
|
- このことから方角を取得するgetLine(int x, int y, Point d){}に問題があると考えた。
|
74
|
+
```
|
75
|
+
|
76
|
+
### Stoneクラス
|
77
|
+
```java
|
78
|
+
class Stone {
|
79
|
+
public final static int black = 1;
|
80
|
+
public final static int white = 2;
|
81
|
+
public int obverse = 0;
|
82
|
+
|
83
|
+
Stone() {
|
84
|
+
obverse = 0;
|
85
|
+
}
|
86
|
+
|
87
|
+
//表面の色を設定
|
88
|
+
void setObverse(int color) {
|
89
|
+
if ( color == black || color == white)
|
90
|
+
obverse = color;
|
91
|
+
else
|
92
|
+
System.out.println("黒か白でなければいけません");
|
93
|
+
}
|
94
|
+
|
95
|
+
//白黒を入れ替える
|
96
|
+
void doReverse(int color) {
|
97
|
+
if ( color == black )
|
98
|
+
obverse = white;
|
99
|
+
else if ( color == white )
|
100
|
+
obverse = black;
|
101
|
+
else
|
102
|
+
System.out.println("黒か白でなければいけません");
|
103
|
+
}
|
104
|
+
|
105
|
+
//表面の色で中心p, 半径radの円を塗り潰す
|
106
|
+
void paint(Graphics g, Point p, int rad) {
|
107
|
+
if (obverse == black) {
|
108
|
+
g.setColor(Color.black);
|
109
|
+
g.fillOval(p.x - 32, p.y - 32, 2*rad, 2*rad);
|
110
|
+
}
|
111
|
+
else if (obverse == white) {
|
112
|
+
g.setColor(Color.white);
|
113
|
+
g.fillOval(p.x - 32, p.y - 32, 2*rad, 2*rad);
|
114
|
+
}
|
115
|
+
}
|
116
|
+
}
|
117
|
+
```
|
118
|
+
|
119
|
+
### Boardクラス
|
120
|
+
```java
|
121
|
+
class Board {
|
122
|
+
Stone[][] ste = new Stone[8][8];
|
123
|
+
public int num_grid_black;
|
124
|
+
public int num_grid_white;
|
125
|
+
private Point[] direction = new Point[8];
|
126
|
+
public int[][] eval_black = new int[8][8];
|
127
|
+
public int[][] eval_white = new int[8][8];
|
128
|
+
|
129
|
+
//コンストラクタ初期化
|
130
|
+
Board() {
|
131
|
+
|
132
|
+
for(int i=0; i<8; i++) {
|
133
|
+
for(int j=0; j<8; j++) {
|
134
|
+
ste[i][j] = new Stone();
|
135
|
+
}
|
136
|
+
}
|
137
|
+
ste[3][3].setObverse(1);
|
138
|
+
ste[3][4].setObverse(2);
|
139
|
+
ste[4][3].setObverse(2);
|
140
|
+
ste[4][4].setObverse(1);
|
141
|
+
//方向ベクトル
|
142
|
+
direction[0] = new Point(1,0);
|
143
|
+
direction[1] = new Point(1,1);
|
144
|
+
direction[2] = new Point(0,1);
|
145
|
+
direction[3] = new Point(-1,1);
|
146
|
+
direction[4] = new Point(-1,0);
|
147
|
+
direction[5] = new Point(-1,-1);
|
148
|
+
direction[6] = new Point(0,-1);
|
149
|
+
direction[7] = new Point(1,-1);
|
150
|
+
}
|
151
|
+
|
152
|
+
|
153
|
+
//盤面の中か?
|
154
|
+
boolean isOnBoard(int x, int y) {
|
155
|
+
if ( x<0 || 7<x || y<0 || 7<y)
|
156
|
+
return false;
|
157
|
+
else
|
158
|
+
return true;
|
159
|
+
}
|
160
|
+
|
161
|
+
//盤面(x,y)から方向dに向かって石を順番に取得
|
162
|
+
ArrayList<Integer> getLine(int x, int y, Point d) {
|
163
|
+
ArrayList<Integer> line = new ArrayList<Integer>();
|
164
|
+
int cx = x + d.x;
|
165
|
+
int cy = y + d.y;
|
166
|
+
while ( isOnBoard(cx, cy) && ste[cx][cy].obverse > 0 ) {
|
167
|
+
line.add(ste[cx][cy].obverse);
|
168
|
+
cx += d.x;
|
169
|
+
cy += d.y;
|
170
|
+
}
|
171
|
+
return line;
|
172
|
+
}
|
173
|
+
|
174
|
+
|
175
|
+
//盤面(x,y)に石sを置いた場合に反転できる石の数を数える
|
176
|
+
int countReverseStone(int x, int y, int s) {
|
177
|
+
//既に石が置かれていたら、置けない
|
178
|
+
if (ste[x][y].obverse != 0) return -1;
|
179
|
+
//8方向をチェック
|
180
|
+
int cnt = 0;
|
181
|
+
for (int d=0; d<8; d++) {
|
182
|
+
ArrayList<Integer> line = new ArrayList<Integer>();
|
183
|
+
line = getLine(x, y, direction[d]);
|
184
|
+
int n = 0;
|
185
|
+
while ( n < line.size() && line.get(n) != s) n++;
|
186
|
+
if (1 <= n && n < line.size()) cnt += n;
|
187
|
+
}
|
188
|
+
return cnt;
|
189
|
+
}
|
190
|
+
|
191
|
+
//石を置き他を反転させる
|
192
|
+
void setStoneAndReverse(int x, int y, int s) {
|
193
|
+
//8方向をチェック
|
194
|
+
for (int d=0; d<8; d++) {
|
195
|
+
ArrayList<Integer> p = new ArrayList<Integer>();
|
196
|
+
p = getLine(x, y, direction[d]);
|
197
|
+
int cx = x;
|
198
|
+
int cy = y;
|
199
|
+
int n = 0;
|
200
|
+
while ( n < p.size()-1 && p.get(n) != s) {
|
201
|
+
cx += direction[d].x;
|
202
|
+
cy += direction[d].y;
|
203
|
+
System.out.println(d+1);
|
204
|
+
ste[cx][cy].doReverse(ste[cx][cy].obverse);
|
205
|
+
n++;
|
206
|
+
}
|
207
|
+
}
|
208
|
+
}
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
//盤面を見る
|
213
|
+
void evaluateBoard()
|
214
|
+
{
|
215
|
+
num_grid_black = 0;
|
216
|
+
num_grid_white = 0;
|
217
|
+
for ( int i=0; i<8; i++) {
|
218
|
+
for (int j=0; j<8; j++) {
|
219
|
+
eval_black[i][j] = countReverseStone(i, j, 1);
|
220
|
+
if (eval_black[i][j] > 0) num_grid_black++;
|
221
|
+
eval_white[i][j] = countReverseStone(i, j, 2);
|
222
|
+
if (eval_white[i][j] > 0) num_grid_white++;
|
223
|
+
}
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|
227
|
+
|
228
|
+
//盤面をコンソールに表示する
|
229
|
+
void printBoard() {
|
230
|
+
for ( int i=0; i<8; i++) {
|
231
|
+
for (int j=0; j<8; j++) {
|
232
|
+
System.out.printf("%2d ", ste[j][i].obverse);
|
233
|
+
}
|
234
|
+
System.out.println("");
|
235
|
+
}
|
236
|
+
}
|
237
|
+
|
238
|
+
//盤面の評価結果をコンソールに表示する
|
239
|
+
void printEval() {
|
240
|
+
System.out.println("Black(1):");
|
241
|
+
for ( int i=0; i<8; i++) {
|
242
|
+
for ( int j=0; j<8; j++) {
|
243
|
+
System.out.printf("%2d " , eval_black[j][i]);
|
244
|
+
}
|
245
|
+
System.out.println("");
|
246
|
+
}
|
247
|
+
System.out.println("White(2):");
|
248
|
+
for ( int i=0; i<8; i++) {
|
249
|
+
for ( int j=0; j<8; j++) {
|
250
|
+
System.out.printf("%2d " , eval_white[j][i]);
|
251
|
+
}
|
252
|
+
System.out.println("");
|
253
|
+
}
|
254
|
+
}
|
255
|
+
|
256
|
+
|
257
|
+
//画面描画
|
258
|
+
void paint(Graphics g, int unit_size) {
|
259
|
+
|
260
|
+
//背景
|
261
|
+
g.setColor(Color.black);
|
262
|
+
g.fillRect(0, 0, unit_size*10, unit_size*10);
|
263
|
+
|
264
|
+
//盤面
|
265
|
+
g.setColor(new Color(0, 85, 0));
|
266
|
+
g.fillRect(unit_size, unit_size, unit_size*8, unit_size*8);
|
267
|
+
|
268
|
+
//横線
|
269
|
+
g.setColor(Color.black);
|
270
|
+
for (int i = 0; i<9 ; i++) {
|
271
|
+
g.drawLine(unit_size*(i+1), unit_size, unit_size*(i+1), unit_size*9 );
|
272
|
+
}
|
273
|
+
|
274
|
+
//縦線
|
275
|
+
g.setColor(Color.black);
|
276
|
+
for (int i = 0; i<9 ; i++) {
|
277
|
+
g.drawLine(unit_size, unit_size*(i+1), unit_size*9, unit_size*(i+1) );
|
278
|
+
}
|
279
|
+
|
280
|
+
// 目印
|
281
|
+
for (int i=0; i<2; i++) {
|
282
|
+
for (int j=0; j<2; j++) {
|
283
|
+
g.fillRect(unit_size*(3+4*i)-(unit_size/16), unit_size*(3+4*j)-(unit_size/16), (unit_size/8), (unit_size/8));
|
284
|
+
}
|
285
|
+
}
|
286
|
+
|
287
|
+
//各マスの中心座標を計算した後描画
|
288
|
+
Point p = new Point();
|
289
|
+
int rad = ((unit_size/2) * 4 ) / 5;
|
290
|
+
for(int i=0; i<8; i++) {
|
291
|
+
for(int j=0; j<8; j++) {
|
292
|
+
p.x = (unit_size*(i+1) + unit_size*(i+2))/2;
|
293
|
+
p.y = (unit_size*(j+1) + unit_size*(j+2))/2;
|
294
|
+
ste[i][j].paint(g, p, rad);
|
295
|
+
}
|
296
|
+
}
|
297
|
+
}
|
298
|
+
|
299
|
+
//クリックされたマス(x,y)に石sを配置する
|
300
|
+
void setStone(int x, int y, int s) {
|
301
|
+
ste[x][y].setObverse(s);
|
302
|
+
}
|
303
|
+
}
|
74
304
|
```
|
2
line.add(ste[cx][cy].obverse); に修正しました。また質問のレイアウトを変更しました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
javaでオセロを作成したが反転が
|
1
|
+
javaでオセロを作成したが反転に問題が生じて困っている
|
body
CHANGED
@@ -1,123 +1,34 @@
|
|
1
|
-
java環境で石を反転させる時に、隣合う挟まれていない石まで反転されてしまいます。
|
2
|
-
|
1
|
+
### 前提・実現したいこと
|
3
2
|
|
4
|
-
```
|
3
|
+
```
|
5
|
-
import java.awt.*;
|
6
|
-
|
4
|
+
java環境で8×8盤面のオセロを作成した。
|
7
|
-
import java.awt.event.*;
|
8
|
-
|
5
|
+
- 石を置けないマスには置けない。
|
6
|
+
- 石を点(x,y)に置き、ひっくり返せる周囲の石を反転させたい。
|
7
|
+
```
|
9
8
|
|
10
|
-
|
9
|
+
### 注釈
|
11
|
-
|
10
|
+
```
|
12
|
-
public final static int white = 2;
|
13
|
-
|
11
|
+
手番やパスの処理がおかしい点は無視して下さい。
|
14
12
|
|
15
|
-
|
13
|
+
```
|
16
|
-
obverse = 0;
|
17
|
-
}
|
18
14
|
|
19
|
-
|
15
|
+
### 発生している問題
|
20
|
-
|
16
|
+
```
|
21
|
-
if ( color == black || color == white)
|
22
|
-
|
17
|
+
石を反転させる処理に問題が生じる
|
23
|
-
else
|
24
|
-
System.out.println("黒か白でなければいけません");
|
25
|
-
}
|
26
18
|
|
19
|
+
(例)
|
20
|
+
初期配置から
|
21
|
+
黒石[5][3]
|
27
|
-
|
22
|
+
白石[3][2]
|
23
|
+
黒石[2][4]
|
24
|
+
白石[3][5]
|
28
|
-
|
25
|
+
の順に配置すると意図してない[4][4]の黒石が反転される。
|
29
|
-
if ( color == black )
|
30
|
-
obverse = white;
|
31
|
-
else if ( color == white )
|
32
|
-
obverse = black;
|
33
|
-
else
|
34
|
-
System.out.println("黒か白でなければいけません");
|
35
|
-
}
|
36
26
|
|
37
|
-
//表面の色で中心p, 半径radの円を塗り潰す
|
38
|
-
void paint(Graphics g, Point p, int rad) {
|
39
|
-
if (obverse == black) {
|
40
|
-
g.setColor(Color.black);
|
41
|
-
g.fillOval(p.x - 32, p.y - 32, 2*rad, 2*rad);
|
42
|
-
|
27
|
+
```
|
43
|
-
else if (obverse == white) {
|
44
|
-
g.setColor(Color.white);
|
45
|
-
g.fillOval(p.x - 32, p.y - 32, 2*rad, 2*rad);
|
46
|
-
}
|
47
|
-
}
|
48
|
-
}
|
49
28
|
|
50
|
-
class Board {
|
51
|
-
Stone[][] ste = new Stone[8][8];
|
52
|
-
public int num_grid_black;
|
53
|
-
public int num_grid_white;
|
54
|
-
private Point[] direction = new Point[8];
|
55
|
-
public int[][] eval_black = new int[8][8];
|
56
|
-
public int[][] eval_white = new int[8][8];
|
57
|
-
|
58
|
-
//コンストラクタ初期化
|
59
|
-
Board() {
|
60
|
-
|
61
|
-
for(int i=0; i<8; i++) {
|
62
|
-
for(int j=0; j<8; j++) {
|
63
|
-
ste[i][j] = new Stone();
|
64
|
-
}
|
65
|
-
}
|
66
|
-
ste[3][3].setObverse(1);
|
67
|
-
ste[3][4].setObverse(2);
|
68
|
-
ste[4][3].setObverse(2);
|
69
|
-
ste[4][4].setObverse(1);
|
70
|
-
//方向ベクトル
|
71
|
-
direction[0] = new Point(1,0);
|
72
|
-
direction[1] = new Point(1,1);
|
73
|
-
direction[2] = new Point(0,1);
|
74
|
-
direction[3] = new Point(-1,1);
|
75
|
-
direction[4] = new Point(-1,0);
|
76
|
-
direction[5] = new Point(-1,-1);
|
77
|
-
direction[6] = new Point(0,-1);
|
78
|
-
direction[7] = new Point(1,-1);
|
79
|
-
}
|
80
|
-
|
81
|
-
|
82
|
-
//盤面の中か?
|
83
|
-
boolean isOnBoard(int x, int y) {
|
84
|
-
if ( x<0 || 7<x || y<0 || 7<y)
|
85
|
-
return false;
|
86
|
-
else
|
87
|
-
return true;
|
88
|
-
}
|
89
|
-
|
90
|
-
//盤面(x,y)から方向dに向かって石を順番に取得
|
91
|
-
ArrayList<Integer> getLine(int x, int y, Point d) {
|
92
|
-
ArrayList<Integer> line = new ArrayList<Integer>();
|
93
|
-
int cx = x + d.x;
|
94
|
-
int cy = y + d.y;
|
95
|
-
while ( isOnBoard(cx, cy) && ste[cx][cy].obverse != 0) {
|
96
|
-
line.add(ste[cy][cx].obverse);
|
97
|
-
cx += d.x;
|
98
|
-
cy += d.y;
|
99
|
-
}
|
100
|
-
return line;
|
101
|
-
}
|
102
|
-
|
103
|
-
|
104
|
-
//盤面(x,y)に石sを置いた場合に反転できる石の数を数える
|
105
|
-
int countReverseStone(int x, int y, int s) {
|
106
|
-
//既に石が置かれていたら、置けない
|
107
|
-
if (ste[x][y].obverse != 0) return -1;
|
108
|
-
|
29
|
+
### 問題があると思われるソースコード
|
109
|
-
int cnt = 0;
|
110
|
-
for (int d=0; d<8; d++) {
|
111
|
-
ArrayList<Integer> line = new ArrayList<Integer>();
|
112
|
-
line = getLine(x, y, direction[d]);
|
113
|
-
|
30
|
+
```java
|
114
|
-
while ( n < line.size() && line.get(n) != s) n++;
|
115
|
-
if (1 <= n && n < line.size()) cnt += n;
|
116
|
-
}
|
117
|
-
return cnt;
|
118
|
-
}
|
119
|
-
|
120
|
-
|
31
|
+
//石を置き他を反転させる
|
121
32
|
void setStoneAndReverse(int x, int y, int s) {
|
122
33
|
//8方向をチェック
|
123
34
|
for (int d=0; d<8; d++) {
|
@@ -138,233 +49,26 @@
|
|
138
49
|
}
|
139
50
|
}
|
140
51
|
}
|
52
|
+
```
|
141
53
|
|
142
|
-
|
143
|
-
|
144
|
-
//盤面を見る
|
145
|
-
|
54
|
+
```java
|
146
|
-
{
|
147
|
-
num_grid_black = 0;
|
148
|
-
num_grid_white = 0;
|
149
|
-
for ( int i=0; i<8; i++) {
|
150
|
-
for (int j=0; j<8; j++) {
|
151
|
-
eval_black[i][j] = countReverseStone(i, j, 1);
|
152
|
-
if (eval_black[i][j] > 0) num_grid_black++;
|
153
|
-
eval_white[i][j] = countReverseStone(i, j, 2);
|
154
|
-
if (eval_white[i][j] > 0) num_grid_white++;
|
155
|
-
}
|
156
|
-
}
|
157
|
-
}
|
158
|
-
|
159
|
-
|
160
|
-
|
55
|
+
//盤面(x,y)から方向dに向かって石を順番に取得
|
56
|
+
ArrayList<Integer> getLine(int x, int y, Point d) {
|
57
|
+
ArrayList<Integer> line = new ArrayList<Integer>();
|
161
|
-
|
58
|
+
int cx = x + d.x;
|
162
|
-
for ( int i=0; i<8; i++) {
|
163
|
-
|
59
|
+
int cy = y + d.y;
|
164
|
-
|
60
|
+
while ( isOnBoard(cx, cy) && ste[cx][cy].obverse != 0) {
|
165
|
-
}
|
166
|
-
|
61
|
+
line.add(ste[cx][cy].obverse);
|
167
|
-
|
62
|
+
cx += d.x;
|
63
|
+
cy += d.y;
|
168
64
|
}
|
169
|
-
|
170
|
-
//盤面の評価結果をコンソールに表示する
|
171
|
-
|
65
|
+
return line;
|
172
|
-
System.out.println("Black(1):");
|
173
|
-
for ( int i=0; i<8; i++) {
|
174
|
-
for ( int j=0; j<8; j++) {
|
175
|
-
System.out.printf("%2d " , eval_black[j][i]);
|
176
|
-
}
|
177
|
-
System.out.println("");
|
178
|
-
}
|
179
|
-
System.out.println("White(2):");
|
180
|
-
for ( int i=0; i<8; i++) {
|
181
|
-
for ( int j=0; j<8; j++) {
|
182
|
-
System.out.printf("%2d " , eval_white[j][i]);
|
183
|
-
}
|
184
|
-
System.out.println("");
|
185
|
-
}
|
186
66
|
}
|
187
|
-
|
67
|
+
```
|
188
68
|
|
189
|
-
//画面描画
|
190
|
-
void paint(Graphics g, int unit_size) {
|
191
|
-
|
192
|
-
|
69
|
+
### 試したこと
|
193
|
-
g.setColor(Color.black);
|
194
|
-
g.fillRect(0, 0, unit_size*10, unit_size*10);
|
195
|
-
|
196
|
-
|
70
|
+
```
|
197
|
-
g.setColor(new Color(0, 85, 0));
|
198
|
-
g.fillRect(unit_size, unit_size, unit_size*8, unit_size*8);
|
199
|
-
|
200
|
-
//横線
|
201
|
-
g.setColor(Color.black);
|
202
|
-
for (int i = 0; i<9 ; i++) {
|
203
|
-
|
71
|
+
上記のsetStoneAndReverse(int x, int y, int s){}において、反転を行った方角を示すdirection[d]を出力した。
|
204
|
-
}
|
205
|
-
|
206
|
-
//縦線
|
207
|
-
g.setColor(Color.black);
|
208
|
-
for (int i = 0; i<9 ; i++) {
|
209
|
-
g.drawLine(unit_size, unit_size*(i+1), unit_size*9, unit_size*(i+1) );
|
210
|
-
}
|
211
|
-
|
212
|
-
// 目印
|
213
|
-
for (int i=0; i<2; i++) {
|
214
|
-
for (int j=0; j<2; j++) {
|
215
|
-
g.fillRect(unit_size*(3+4*i)-(unit_size/16), unit_size*(3+4*j)-(unit_size/16), (unit_size/8), (unit_size/8));
|
216
|
-
}
|
217
|
-
}
|
218
|
-
|
219
|
-
//各マスの中心座標を計算した後描画
|
220
|
-
Point p = new Point();
|
221
|
-
|
72
|
+
- 意図しない石が反転された際、予想外の方向にも反転を行っていることが分かった。
|
222
|
-
for(int i=0; i<8; i++) {
|
223
|
-
for(int j=0; j<8; j++) {
|
224
|
-
p.x = (unit_size*(i+1) + unit_size*(i+2))/2;
|
225
|
-
p.y = (unit_size*(j+1) + unit_size*(j+2))/2;
|
226
|
-
ste[i][j].paint(g, p, rad);
|
227
|
-
}
|
228
|
-
}
|
229
|
-
}
|
230
|
-
|
231
|
-
//クリックされたマス(x,y)に石sを配置する
|
232
|
-
|
73
|
+
- このことから方角を取得するgetLine(int x, int y, Point d){}に問題があると考えた。
|
233
|
-
ste[x][y].setObverse(s);
|
234
|
-
}
|
235
|
-
}
|
236
|
-
|
237
|
-
public class Reversi extends JPanel{
|
238
|
-
private final static int UNIT_SIZE = 80;
|
239
|
-
private Board board = new Board();
|
240
|
-
|
241
|
-
private int turn = 1;
|
242
|
-
|
243
|
-
//コンストラクタ初期化
|
244
|
-
public Reversi() {
|
245
|
-
setPreferredSize(new Dimension(800, 800));
|
246
|
-
addMouseListener(new MouseProc());
|
247
|
-
}
|
248
|
-
|
249
|
-
public void paintComponent(Graphics g) {
|
250
|
-
board.paint(g, UNIT_SIZE);
|
251
|
-
}
|
252
|
-
|
253
|
-
|
254
|
-
//turn 1は黒の番
|
255
|
-
void changeTurn() {
|
256
|
-
if ( turn == 1 ) turn = 2;
|
257
|
-
else if ( turn == 2 ) turn = 1;
|
258
|
-
}
|
259
|
-
|
260
|
-
void MessageDialog(String str) {
|
261
|
-
JOptionPane.showMessageDialog(this, str, "情報", JOptionPane.INFORMATION_MESSAGE);
|
262
|
-
}
|
263
|
-
|
264
|
-
|
265
|
-
//黒石と白石の数を比較し終了
|
266
|
-
void EndMessageDialog(int num_black, int num_white) {
|
267
|
-
if( num_black > num_white ) {
|
268
|
-
String str = "[黒:" + num_black + ",白:" + num_white + "]で黒の勝ち";
|
269
|
-
JOptionPane.showMessageDialog(this, str, "ゲーム終了", JOptionPane.INFORMATION_MESSAGE);}
|
270
|
-
else if (num_black == num_white ) {
|
271
|
-
String str = "[黒:" + num_black + ",白:" + num_white + "]で引き分け";
|
272
|
-
JOptionPane.showMessageDialog(this, str, "ゲーム終了", JOptionPane.INFORMATION_MESSAGE);}
|
273
|
-
else {
|
274
|
-
String str = "[黒:" + num_black + ",白:" + num_white + "]で白の勝ち";
|
275
|
-
JOptionPane.showMessageDialog(this, str, "ゲーム終了", JOptionPane.INFORMATION_MESSAGE);}
|
276
|
-
|
277
|
-
System.exit(0);
|
278
|
-
}
|
279
|
-
|
280
|
-
|
281
|
-
//クリックされた時の処理用クラス
|
282
|
-
class MouseProc extends MouseAdapter {
|
283
|
-
public void mouseClicked(MouseEvent me) {
|
284
|
-
Point point = me.getPoint();
|
285
|
-
int btn = me.getButton();
|
286
|
-
System.out.println("(" + point.x + "," + point.y + ")");
|
287
|
-
board.evaluateBoard();
|
288
|
-
if ( btn == MouseEvent.BUTTON1){
|
289
|
-
int x = point.x / UNIT_SIZE - 1;
|
290
|
-
int y = point.y / UNIT_SIZE - 1;
|
291
|
-
System.out.println("[" + x + "]" + "[" + y + "]");
|
292
|
-
if( 0 <= x && x < 8 && 0 <= y && y < 8 ) {
|
293
|
-
if(board.eval_black[x][y] < 1){
|
294
|
-
System.out.println("そこに石を置けません");
|
295
|
-
}
|
296
|
-
else {
|
297
|
-
board.setStone(x, y, 1);
|
298
|
-
board.setStoneAndReverse(x, y, 1);
|
299
|
-
repaint();
|
300
|
-
board.printBoard();
|
301
|
-
board.evaluateBoard();
|
302
|
-
board.printEval();
|
303
|
-
changeTurn();
|
304
|
-
if( board.num_grid_black >= 1){
|
305
|
-
MessageDialog("白の番です");
|
306
|
-
}
|
307
|
-
else {
|
308
|
-
changeTurn();
|
309
|
-
MessageDialog("あなたはパスです");
|
310
|
-
}
|
311
|
-
}
|
312
|
-
}
|
313
|
-
}
|
314
|
-
else if ( btn == MouseEvent.BUTTON3){
|
315
|
-
int x = point.x / UNIT_SIZE - 1;
|
316
|
-
int y = point.y / UNIT_SIZE - 1;
|
317
|
-
System.out.println("[" + x + "]" + "[" + y + "]");
|
318
|
-
if( 0 <= x && x < 8 && 0 <= y && y < 8 ) {
|
319
|
-
if(board.eval_white[x][y] < 1){
|
320
|
-
System.out.println("そこに石を置けません");
|
321
|
-
}
|
322
|
-
else {
|
323
|
-
board.setStone(x, y, 2);
|
324
|
-
board.setStoneAndReverse(x, y, 2);
|
325
|
-
repaint();
|
326
|
-
board.printBoard();
|
327
|
-
board.evaluateBoard();
|
328
|
-
board.printEval();
|
329
|
-
changeTurn();
|
330
|
-
if( board.num_grid_black >= 1){
|
331
|
-
MessageDialog("黒の番です");
|
332
|
-
}
|
333
|
-
else {
|
334
|
-
changeTurn();
|
335
|
-
MessageDialog("あなたはパスです");
|
336
|
-
}
|
337
|
-
}
|
338
|
-
}
|
339
|
-
}
|
340
|
-
|
341
|
-
//白、黒石の総数と石が置けなくなる場合を考える
|
342
|
-
int num_black = 0;
|
343
|
-
int num_white = 0;
|
344
|
-
for(int i = 0; i<8; i++) {
|
345
|
-
for(int j = 0; j<8; j++) {
|
346
|
-
if( board.ste[i][j].obverse == 1 ) num_black++;
|
347
|
-
if( board.ste[i][j].obverse == 2 ) num_white++;
|
348
|
-
}
|
349
|
-
}
|
350
|
-
|
351
|
-
if( board.num_grid_black < 1 && board.num_grid_white < 1 )
|
352
|
-
{
|
353
|
-
EndMessageDialog(num_black, num_white);
|
354
|
-
}
|
355
|
-
}
|
356
|
-
}
|
357
|
-
|
358
|
-
//起動
|
359
|
-
public static void main(String[] args) {
|
360
|
-
JFrame f = new JFrame();
|
361
|
-
|
362
|
-
f.getContentPane().setLayout(new FlowLayout());
|
363
|
-
f.getContentPane().add(new Reversi());
|
364
|
-
f.pack();
|
365
|
-
f.setResizable(false);
|
366
|
-
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
367
|
-
f.setVisible(true);
|
368
|
-
}
|
369
|
-
}
|
370
74
|
```
|
1
誤字
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
java環境で石を反転させる時に、隣合う挟まれていない石まで反転されてしまいます。
|
2
|
+
修正カ所などがあれば御指摘ください。
|
3
|
+
|
1
4
|
```ここに言語を入力
|
2
5
|
import java.awt.*;
|
3
6
|
import javax.swing.*;
|