質問編集履歴

5

BoardクラスのSystem.out.println(d+1);をd+1→dに変更

2019/11/28 07:16

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -392,7 +392,7 @@
392
392
 
393
393
  cy += direction[d].y;
394
394
 
395
- System.out.println(d+1);
395
+ System.out.println(d);
396
396
 
397
397
  ste[cx][cy].doReverse(ste[cx][cy].obverse);
398
398
 

4

手番、パス関連のコードを削除しました。

2019/11/28 07:16

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,9 @@
6
6
 
7
7
  java環境で8×8盤面のオセロを作成した。
8
8
 
9
- - 石ないマスには置けない。
9
+ - 石かれている、ひっくり返せないマスには置けない。
10
+
11
+ - 手番は考慮しない。
10
12
 
11
13
  - 石を点(x,y)に置き、ひっくり返せる周囲の石を反転させたい。
12
14
 
@@ -14,18 +16,6 @@
14
16
 
15
17
 
16
18
 
17
- ### 注釈
18
-
19
- ```
20
-
21
- 手番やパスの処理がおかしい点は無視して下さい。
22
-
23
-
24
-
25
- ```
26
-
27
-
28
-
29
19
  ### 発生している問題
30
20
 
31
21
  ```

3

StoneクラスとBoardクラスを分割しました。

2019/11/27 04:46

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -145,3 +145,463 @@
145
145
  - このことから方角を取得するgetLine(int x, int y, Point d){}に問題があると考えた。
146
146
 
147
147
  ```
148
+
149
+
150
+
151
+ ### Stoneクラス
152
+
153
+ ```java
154
+
155
+ class Stone {
156
+
157
+ public final static int black = 1;
158
+
159
+ public final static int white = 2;
160
+
161
+ public int obverse = 0;
162
+
163
+
164
+
165
+ Stone() {
166
+
167
+ obverse = 0;
168
+
169
+ }
170
+
171
+
172
+
173
+ //表面の色を設定
174
+
175
+ void setObverse(int color) {
176
+
177
+ if ( color == black || color == white)
178
+
179
+ obverse = color;
180
+
181
+ else
182
+
183
+ System.out.println("黒か白でなければいけません");
184
+
185
+ }
186
+
187
+
188
+
189
+ //白黒を入れ替える
190
+
191
+ void doReverse(int color) {
192
+
193
+ if ( color == black )
194
+
195
+ obverse = white;
196
+
197
+ else if ( color == white )
198
+
199
+ obverse = black;
200
+
201
+ else
202
+
203
+ System.out.println("黒か白でなければいけません");
204
+
205
+ }
206
+
207
+
208
+
209
+ //表面の色で中心p, 半径radの円を塗り潰す
210
+
211
+ void paint(Graphics g, Point p, int rad) {
212
+
213
+ if (obverse == black) {
214
+
215
+ g.setColor(Color.black);
216
+
217
+ g.fillOval(p.x - 32, p.y - 32, 2*rad, 2*rad);
218
+
219
+ }
220
+
221
+ else if (obverse == white) {
222
+
223
+ g.setColor(Color.white);
224
+
225
+ g.fillOval(p.x - 32, p.y - 32, 2*rad, 2*rad);
226
+
227
+ }
228
+
229
+ }
230
+
231
+ }
232
+
233
+ ```
234
+
235
+
236
+
237
+ ### Boardクラス
238
+
239
+ ```java
240
+
241
+ class Board {
242
+
243
+ Stone[][] ste = new Stone[8][8];
244
+
245
+ public int num_grid_black;
246
+
247
+ public int num_grid_white;
248
+
249
+ private Point[] direction = new Point[8];
250
+
251
+ public int[][] eval_black = new int[8][8];
252
+
253
+ public int[][] eval_white = new int[8][8];
254
+
255
+
256
+
257
+ //コンストラクタ初期化
258
+
259
+ Board() {
260
+
261
+
262
+
263
+ for(int i=0; i<8; i++) {
264
+
265
+ for(int j=0; j<8; j++) {
266
+
267
+ ste[i][j] = new Stone();
268
+
269
+ }
270
+
271
+ }
272
+
273
+ ste[3][3].setObverse(1);
274
+
275
+ ste[3][4].setObverse(2);
276
+
277
+ ste[4][3].setObverse(2);
278
+
279
+ ste[4][4].setObverse(1);
280
+
281
+ //方向ベクトル
282
+
283
+ direction[0] = new Point(1,0);
284
+
285
+ direction[1] = new Point(1,1);
286
+
287
+ direction[2] = new Point(0,1);
288
+
289
+ direction[3] = new Point(-1,1);
290
+
291
+ direction[4] = new Point(-1,0);
292
+
293
+ direction[5] = new Point(-1,-1);
294
+
295
+ direction[6] = new Point(0,-1);
296
+
297
+ direction[7] = new Point(1,-1);
298
+
299
+ }
300
+
301
+
302
+
303
+
304
+
305
+ //盤面の中か?
306
+
307
+ boolean isOnBoard(int x, int y) {
308
+
309
+ if ( x<0 || 7<x || y<0 || 7<y)
310
+
311
+ return false;
312
+
313
+ else
314
+
315
+ return true;
316
+
317
+ }
318
+
319
+
320
+
321
+ //盤面(x,y)から方向dに向かって石を順番に取得
322
+
323
+ ArrayList<Integer> getLine(int x, int y, Point d) {
324
+
325
+ ArrayList<Integer> line = new ArrayList<Integer>();
326
+
327
+ int cx = x + d.x;
328
+
329
+ int cy = y + d.y;
330
+
331
+ while ( isOnBoard(cx, cy) && ste[cx][cy].obverse > 0 ) {
332
+
333
+ line.add(ste[cx][cy].obverse);
334
+
335
+ cx += d.x;
336
+
337
+ cy += d.y;
338
+
339
+ }
340
+
341
+ return line;
342
+
343
+ }
344
+
345
+
346
+
347
+
348
+
349
+ //盤面(x,y)に石sを置いた場合に反転できる石の数を数える
350
+
351
+ int countReverseStone(int x, int y, int s) {
352
+
353
+ //既に石が置かれていたら、置けない
354
+
355
+ if (ste[x][y].obverse != 0) return -1;
356
+
357
+ //8方向をチェック
358
+
359
+ int cnt = 0;
360
+
361
+ for (int d=0; d<8; d++) {
362
+
363
+ ArrayList<Integer> line = new ArrayList<Integer>();
364
+
365
+ line = getLine(x, y, direction[d]);
366
+
367
+ int n = 0;
368
+
369
+ while ( n < line.size() && line.get(n) != s) n++;
370
+
371
+ if (1 <= n && n < line.size()) cnt += n;
372
+
373
+ }
374
+
375
+ return cnt;
376
+
377
+ }
378
+
379
+
380
+
381
+ //石を置き他を反転させる
382
+
383
+ void setStoneAndReverse(int x, int y, int s) {
384
+
385
+ //8方向をチェック
386
+
387
+ for (int d=0; d<8; d++) {
388
+
389
+ ArrayList<Integer> p = new ArrayList<Integer>();
390
+
391
+ p = getLine(x, y, direction[d]);
392
+
393
+ int cx = x;
394
+
395
+ int cy = y;
396
+
397
+ int n = 0;
398
+
399
+ while ( n < p.size()-1 && p.get(n) != s) {
400
+
401
+ cx += direction[d].x;
402
+
403
+ cy += direction[d].y;
404
+
405
+ System.out.println(d+1);
406
+
407
+ ste[cx][cy].doReverse(ste[cx][cy].obverse);
408
+
409
+ n++;
410
+
411
+ }
412
+
413
+ }
414
+
415
+ }
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+ //盤面を見る
424
+
425
+ void evaluateBoard()
426
+
427
+ {
428
+
429
+ num_grid_black = 0;
430
+
431
+ num_grid_white = 0;
432
+
433
+ for ( int i=0; i<8; i++) {
434
+
435
+ for (int j=0; j<8; j++) {
436
+
437
+ eval_black[i][j] = countReverseStone(i, j, 1);
438
+
439
+ if (eval_black[i][j] > 0) num_grid_black++;
440
+
441
+ eval_white[i][j] = countReverseStone(i, j, 2);
442
+
443
+ if (eval_white[i][j] > 0) num_grid_white++;
444
+
445
+ }
446
+
447
+ }
448
+
449
+ }
450
+
451
+
452
+
453
+
454
+
455
+ //盤面をコンソールに表示する
456
+
457
+ void printBoard() {
458
+
459
+ for ( int i=0; i<8; i++) {
460
+
461
+ for (int j=0; j<8; j++) {
462
+
463
+ System.out.printf("%2d ", ste[j][i].obverse);
464
+
465
+ }
466
+
467
+ System.out.println("");
468
+
469
+ }
470
+
471
+ }
472
+
473
+
474
+
475
+ //盤面の評価結果をコンソールに表示する
476
+
477
+ void printEval() {
478
+
479
+ System.out.println("Black(1):");
480
+
481
+ for ( int i=0; i<8; i++) {
482
+
483
+ for ( int j=0; j<8; j++) {
484
+
485
+ System.out.printf("%2d " , eval_black[j][i]);
486
+
487
+ }
488
+
489
+ System.out.println("");
490
+
491
+ }
492
+
493
+ System.out.println("White(2):");
494
+
495
+ for ( int i=0; i<8; i++) {
496
+
497
+ for ( int j=0; j<8; j++) {
498
+
499
+ System.out.printf("%2d " , eval_white[j][i]);
500
+
501
+ }
502
+
503
+ System.out.println("");
504
+
505
+ }
506
+
507
+ }
508
+
509
+
510
+
511
+
512
+
513
+ //画面描画
514
+
515
+ void paint(Graphics g, int unit_size) {
516
+
517
+
518
+
519
+ //背景
520
+
521
+ g.setColor(Color.black);
522
+
523
+ g.fillRect(0, 0, unit_size*10, unit_size*10);
524
+
525
+
526
+
527
+ //盤面
528
+
529
+ g.setColor(new Color(0, 85, 0));
530
+
531
+ g.fillRect(unit_size, unit_size, unit_size*8, unit_size*8);
532
+
533
+
534
+
535
+ //横線
536
+
537
+ g.setColor(Color.black);
538
+
539
+ for (int i = 0; i<9 ; i++) {
540
+
541
+ g.drawLine(unit_size*(i+1), unit_size, unit_size*(i+1), unit_size*9 );
542
+
543
+ }
544
+
545
+
546
+
547
+ //縦線
548
+
549
+ g.setColor(Color.black);
550
+
551
+ for (int i = 0; i<9 ; i++) {
552
+
553
+ g.drawLine(unit_size, unit_size*(i+1), unit_size*9, unit_size*(i+1) );
554
+
555
+ }
556
+
557
+
558
+
559
+ // 目印
560
+
561
+ for (int i=0; i<2; i++) {
562
+
563
+ for (int j=0; j<2; j++) {
564
+
565
+ g.fillRect(unit_size*(3+4*i)-(unit_size/16), unit_size*(3+4*j)-(unit_size/16), (unit_size/8), (unit_size/8));
566
+
567
+ }
568
+
569
+ }
570
+
571
+
572
+
573
+ //各マスの中心座標を計算した後描画
574
+
575
+ Point p = new Point();
576
+
577
+ int rad = ((unit_size/2) * 4 ) / 5;
578
+
579
+ for(int i=0; i<8; i++) {
580
+
581
+ for(int j=0; j<8; j++) {
582
+
583
+ p.x = (unit_size*(i+1) + unit_size*(i+2))/2;
584
+
585
+ p.y = (unit_size*(j+1) + unit_size*(j+2))/2;
586
+
587
+ ste[i][j].paint(g, p, rad);
588
+
589
+ }
590
+
591
+ }
592
+
593
+ }
594
+
595
+
596
+
597
+ //クリックされたマス(x,y)に石sを配置する
598
+
599
+ void setStone(int x, int y, int s) {
600
+
601
+ ste[x][y].setObverse(s);
602
+
603
+ }
604
+
605
+ }
606
+
607
+ ```

2

line.add(ste[cx][cy].obverse); に修正しました。また質問のレイアウトを変更しました。

2019/11/27 04:42

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- javaでオセロを作成したが反転が上手く行えません!
1
+ javaでオセロを作成したが反転に問題生じて困っている
test CHANGED
@@ -1,242 +1,64 @@
1
- java環境で石を反転させる時に、隣合う挟まれていない石まで反転されてしまいます。
2
-
3
- 修正カ所などがあれば御指摘くださ
1
+ ### 前提・実現したこと
4
2
 
5
3
 
6
4
 
7
- ```ここに言語を入力
5
+ ```
8
6
 
9
- import java.awt.*;
7
+ java環境で8×8盤面のオセロを作成した。
10
8
 
11
- import javax.swing.*;
9
+ - 石を置けないマスには置けない。
12
10
 
13
- import java.awt.event.*;
11
+ - 石を点(x,y)に置き、ひっくり返せる周囲の石を反転させたい。
14
12
 
15
- import java.util.*;
13
+ ```
16
14
 
17
15
 
18
16
 
19
- class Stone {
17
+ ### 注釈
20
18
 
21
- public final static int black = 1;
19
+ ```
22
20
 
23
- public final static int white = 2;
24
-
25
- public int obverse = 0;
21
+ 手番やパスの処理がおかしい点は無視して下さい。
26
22
 
27
23
 
28
24
 
29
- Stone() {
25
+ ```
30
-
31
- obverse = 0;
32
-
33
- }
34
26
 
35
27
 
36
28
 
37
- //表面の色を設定
29
+ ### 発生している問題
38
30
 
39
- void setObverse(int color) {
31
+ ```
40
32
 
41
- if ( color == black || color == white)
42
-
43
- obverse = color;
33
+ 石を反転させる処理に問題が生じる
44
-
45
- else
46
-
47
- System.out.println("黒か白でなければいけません");
48
-
49
- }
50
34
 
51
35
 
52
36
 
53
- //白黒を入れ替える
37
+ (例)
54
38
 
55
- void doReverse(int color) {
39
+ 初期配置から
56
40
 
57
- if ( color == black )
41
+ 黒石[5][3]
58
42
 
59
- obverse = white;
43
+ 白石[3][2]
60
44
 
61
- else if ( color == white )
45
+ 黒石[2][4]
62
46
 
63
- obverse = black;
47
+ 白石[3][5]
64
48
 
65
- else
66
-
67
- System.out.println("か白でなけばいけません");
49
+ の順に配置すると意図してない[4][4]の石が反転さる。
68
-
69
- }
70
50
 
71
51
 
72
52
 
73
- //表面の色で中心p, 半径radの円を塗り潰す
74
-
75
- void paint(Graphics g, Point p, int rad) {
76
-
77
- if (obverse == black) {
78
-
79
- g.setColor(Color.black);
80
-
81
- g.fillOval(p.x - 32, p.y - 32, 2*rad, 2*rad);
82
-
83
- }
53
+ ```
84
-
85
- else if (obverse == white) {
86
-
87
- g.setColor(Color.white);
88
-
89
- g.fillOval(p.x - 32, p.y - 32, 2*rad, 2*rad);
90
-
91
- }
92
-
93
- }
94
-
95
- }
96
54
 
97
55
 
98
56
 
99
- class Board {
57
+ ### 問題があると思われるソースコード
100
58
 
101
- Stone[][] ste = new Stone[8][8];
59
+ ```java
102
60
 
103
- public int num_grid_black;
104
-
105
- public int num_grid_white;
106
-
107
- private Point[] direction = new Point[8];
108
-
109
- public int[][] eval_black = new int[8][8];
110
-
111
- public int[][] eval_white = new int[8][8];
112
-
113
-
114
-
115
- //コンストラクタ初期化
116
-
117
- Board() {
118
-
119
-
120
-
121
- for(int i=0; i<8; i++) {
122
-
123
- for(int j=0; j<8; j++) {
124
-
125
- ste[i][j] = new Stone();
126
-
127
- }
128
-
129
- }
130
-
131
- ste[3][3].setObverse(1);
132
-
133
- ste[3][4].setObverse(2);
134
-
135
- ste[4][3].setObverse(2);
136
-
137
- ste[4][4].setObverse(1);
138
-
139
- //方向ベクトル
140
-
141
- direction[0] = new Point(1,0);
142
-
143
- direction[1] = new Point(1,1);
144
-
145
- direction[2] = new Point(0,1);
146
-
147
- direction[3] = new Point(-1,1);
148
-
149
- direction[4] = new Point(-1,0);
150
-
151
- direction[5] = new Point(-1,-1);
152
-
153
- direction[6] = new Point(0,-1);
154
-
155
- direction[7] = new Point(1,-1);
156
-
157
- }
158
-
159
-
160
-
161
-
162
-
163
- //盤面の中か?
164
-
165
- boolean isOnBoard(int x, int y) {
166
-
167
- if ( x<0 || 7<x || y<0 || 7<y)
168
-
169
- return false;
170
-
171
- else
172
-
173
- return true;
174
-
175
- }
176
-
177
-
178
-
179
- //盤面(x,y)から方向dに向かって石を順番に取得
180
-
181
- ArrayList<Integer> getLine(int x, int y, Point d) {
182
-
183
- ArrayList<Integer> line = new ArrayList<Integer>();
184
-
185
- int cx = x + d.x;
186
-
187
- int cy = y + d.y;
188
-
189
- while ( isOnBoard(cx, cy) && ste[cx][cy].obverse != 0) {
190
-
191
- line.add(ste[cy][cx].obverse);
192
-
193
- cx += d.x;
194
-
195
- cy += d.y;
196
-
197
- }
198
-
199
- return line;
200
-
201
- }
202
-
203
-
204
-
205
-
206
-
207
- //盤面(x,y)に石sを置いた場合に反転できる石の数を数える
208
-
209
- int countReverseStone(int x, int y, int s) {
210
-
211
- //既に石が置かれていたら、置けない
212
-
213
- if (ste[x][y].obverse != 0) return -1;
214
-
215
- //8方向をチェック
216
-
217
- int cnt = 0;
218
-
219
- for (int d=0; d<8; d++) {
220
-
221
- ArrayList<Integer> line = new ArrayList<Integer>();
222
-
223
- line = getLine(x, y, direction[d]);
224
-
225
- int n = 0;
226
-
227
- while ( n < line.size() && line.get(n) != s) n++;
228
-
229
- if (1 <= n && n < line.size()) cnt += n;
230
-
231
- }
232
-
233
- return cnt;
234
-
235
- }
236
-
237
-
238
-
239
- //石を置き他を反転させる
61
+ //石を置き他を反転させる
240
62
 
241
63
  void setStoneAndReverse(int x, int y, int s) {
242
64
 
@@ -278,462 +100,48 @@
278
100
 
279
101
  }
280
102
 
103
+ ```
281
104
 
282
105
 
283
106
 
107
+ ```java
284
108
 
285
-
109
+ //盤面(x,y)から方向dに向かって石を順番に取得
286
110
 
287
- //盤面を見る
111
+ ArrayList<Integer> getLine(int x, int y, Point d) {
288
112
 
289
- void evaluateBoard()
113
+ ArrayList<Integer> line = new ArrayList<Integer>();
290
114
 
291
- {
115
+ int cx = x + d.x;
292
116
 
293
- num_grid_black = 0;
117
+ int cy = y + d.y;
294
118
 
295
- num_grid_white = 0;
119
+ while ( isOnBoard(cx, cy) && ste[cx][cy].obverse != 0) {
296
120
 
297
- for ( int i=0; i<8; i++) {
121
+ line.add(ste[cx][cy].obverse);
298
122
 
299
- for (int j=0; j<8; j++) {
123
+ cx += d.x;
300
124
 
301
- eval_black[i][j] = countReverseStone(i, j, 1);
302
-
303
- if (eval_black[i][j] > 0) num_grid_black++;
304
-
305
- eval_white[i][j] = countReverseStone(i, j, 2);
306
-
307
- if (eval_white[i][j] > 0) num_grid_white++;
308
-
309
- }
310
-
311
- }
312
-
313
- }
314
-
315
-
316
-
317
-
318
-
319
- //盤面をコンソールに表示する
320
-
321
- void printBoard() {
125
+ cy += d.y;
322
-
323
- for ( int i=0; i<8; i++) {
324
-
325
- for (int j=0; j<8; j++) {
326
-
327
- System.out.printf("%2d ", ste[j][i].obverse);
328
-
329
- }
330
-
331
- System.out.println("");
332
-
333
- }
334
126
 
335
127
  }
336
128
 
337
-
338
-
339
- //盤面の評価結果をコンソールに表示する
340
-
341
- void printEval() {
129
+ return line;
342
-
343
- System.out.println("Black(1):");
344
-
345
- for ( int i=0; i<8; i++) {
346
-
347
- for ( int j=0; j<8; j++) {
348
-
349
- System.out.printf("%2d " , eval_black[j][i]);
350
-
351
- }
352
-
353
- System.out.println("");
354
-
355
- }
356
-
357
- System.out.println("White(2):");
358
-
359
- for ( int i=0; i<8; i++) {
360
-
361
- for ( int j=0; j<8; j++) {
362
-
363
- System.out.printf("%2d " , eval_white[j][i]);
364
-
365
- }
366
-
367
- System.out.println("");
368
-
369
- }
370
130
 
371
131
  }
372
132
 
373
-
133
+ ```
374
134
 
375
135
 
376
136
 
377
- //画面描画
378
-
379
- void paint(Graphics g, int unit_size) {
380
-
381
-
382
-
383
- //背景
384
-
385
- g.setColor(Color.black);
386
-
387
- g.fillRect(0, 0, unit_size*10, unit_size*10);
388
-
389
-
390
-
391
- //盤面
392
-
393
- g.setColor(new Color(0, 85, 0));
394
-
395
- g.fillRect(unit_size, unit_size, unit_size*8, unit_size*8);
396
-
397
-
398
-
399
- //横線
400
-
401
- g.setColor(Color.black);
402
-
403
- for (int i = 0; i<9 ; i++) {
404
-
405
- g.drawLine(unit_size*(i+1), unit_size, unit_size*(i+1), unit_size*9 );
406
-
407
- }
408
-
409
-
410
-
411
- //縦線
412
-
413
- g.setColor(Color.black);
414
-
415
- for (int i = 0; i<9 ; i++) {
416
-
417
- g.drawLine(unit_size, unit_size*(i+1), unit_size*9, unit_size*(i+1) );
418
-
419
- }
420
-
421
-
422
-
423
- // 目印
424
-
425
- for (int i=0; i<2; i++) {
426
-
427
- for (int j=0; j<2; j++) {
428
-
429
- g.fillRect(unit_size*(3+4*i)-(unit_size/16), unit_size*(3+4*j)-(unit_size/16), (unit_size/8), (unit_size/8));
430
-
431
- }
432
-
433
- }
434
-
435
-
436
-
437
- //各マスの中心座標を計算した後描画
438
-
439
- Point p = new Point();
440
-
441
- int rad = ((unit_size/2) * 4 ) / 5;
442
-
443
- for(int i=0; i<8; i++) {
444
-
445
- for(int j=0; j<8; j++) {
446
-
447
- p.x = (unit_size*(i+1) + unit_size*(i+2))/2;
448
-
449
- p.y = (unit_size*(j+1) + unit_size*(j+2))/2;
450
-
451
- ste[i][j].paint(g, p, rad);
452
-
453
- }
454
-
455
- }
456
-
457
- }
458
-
459
-
460
-
461
- //クリックされたマス(x,y)に石sを配置する
462
-
463
- void setStone(int x, int y, int s) {
464
-
465
- ste[x][y].setObverse(s);
466
-
467
- }
468
-
469
- }
470
-
471
-
472
-
473
- public class Reversi extends JPanel{
474
-
475
- private final static int UNIT_SIZE = 80;
476
-
477
- private Board board = new Board();
478
-
479
-
480
-
481
- private int turn = 1;
482
-
483
-
484
-
485
- //コンストラクタ初期化
486
-
487
- public Reversi() {
488
-
489
- setPreferredSize(new Dimension(800, 800));
490
-
491
- addMouseListener(new MouseProc());
492
-
493
- }
494
-
495
-
496
-
497
- public void paintComponent(Graphics g) {
498
-
499
- board.paint(g, UNIT_SIZE);
500
-
501
- }
502
-
503
-
504
-
505
-
506
-
507
- //turn 1は黒の番
508
-
509
- void changeTurn() {
510
-
511
- if ( turn == 1 ) turn = 2;
512
-
513
- else if ( turn == 2 ) turn = 1;
514
-
515
- }
516
-
517
-
518
-
519
- void MessageDialog(String str) {
520
-
521
- JOptionPane.showMessageDialog(this, str, "情報", JOptionPane.INFORMATION_MESSAGE);
522
-
523
- }
524
-
525
-
526
-
527
-
528
-
529
- //黒石と白石の数を比較し終了
530
-
531
- void EndMessageDialog(int num_black, int num_white) {
532
-
533
- if( num_black > num_white ) {
534
-
535
- String str = "[黒:" + num_black + ",白:" + num_white + "]で黒の勝ち";
536
-
537
- JOptionPane.showMessageDialog(this, str, "ゲーム終了", JOptionPane.INFORMATION_MESSAGE);}
538
-
539
- else if (num_black == num_white ) {
540
-
541
- String str = "[黒:" + num_black + ",白:" + num_white + "]で引き分け";
542
-
543
- JOptionPane.showMessageDialog(this, str, "ゲーム終了", JOptionPane.INFORMATION_MESSAGE);}
544
-
545
- else {
546
-
547
- String str = "[黒:" + num_black + ",白:" + num_white + "]で白の勝ち";
548
-
549
- JOptionPane.showMessageDialog(this, str, "ゲーム終了", JOptionPane.INFORMATION_MESSAGE);}
550
-
551
-
552
-
553
- System.exit(0);
554
-
555
- }
556
-
557
-
558
-
559
-
560
-
561
- //クリックされた時の処理用クラス
562
-
563
- class MouseProc extends MouseAdapter {
564
-
565
- public void mouseClicked(MouseEvent me) {
566
-
567
- Point point = me.getPoint();
568
-
569
- int btn = me.getButton();
570
-
571
- System.out.println("(" + point.x + "," + point.y + ")");
572
-
573
- board.evaluateBoard();
574
-
575
- if ( btn == MouseEvent.BUTTON1){
576
-
577
- int x = point.x / UNIT_SIZE - 1;
578
-
579
- int y = point.y / UNIT_SIZE - 1;
580
-
581
- System.out.println("[" + x + "]" + "[" + y + "]");
582
-
583
- if( 0 <= x && x < 8 && 0 <= y && y < 8 ) {
584
-
585
- if(board.eval_black[x][y] < 1){
586
-
587
- System.out.println("そこに石を置けません");
588
-
589
- }
590
-
591
- else {
592
-
593
- board.setStone(x, y, 1);
594
-
595
- board.setStoneAndReverse(x, y, 1);
596
-
597
- repaint();
598
-
599
- board.printBoard();
600
-
601
- board.evaluateBoard();
602
-
603
- board.printEval();
604
-
605
- changeTurn();
606
-
607
- if( board.num_grid_black >= 1){
608
-
609
- MessageDialog("白の番です");
610
-
611
- }
612
-
613
- else {
614
-
615
- changeTurn();
616
-
617
- MessageDialog("あなたはパスです");
618
-
619
- }
620
-
621
- }
622
-
623
- }
624
-
625
- }
626
-
627
- else if ( btn == MouseEvent.BUTTON3){
628
-
629
- int x = point.x / UNIT_SIZE - 1;
630
-
631
- int y = point.y / UNIT_SIZE - 1;
632
-
633
- System.out.println("[" + x + "]" + "[" + y + "]");
634
-
635
- if( 0 <= x && x < 8 && 0 <= y && y < 8 ) {
636
-
637
- if(board.eval_white[x][y] < 1){
638
-
639
- System.out.println("そこに石を置けません");
640
-
641
- }
642
-
643
- else {
644
-
645
- board.setStone(x, y, 2);
646
-
647
- board.setStoneAndReverse(x, y, 2);
648
-
649
- repaint();
650
-
651
- board.printBoard();
652
-
653
- board.evaluateBoard();
654
-
655
- board.printEval();
656
-
657
- changeTurn();
658
-
659
- if( board.num_grid_black >= 1){
660
-
661
- MessageDialog("黒の番です");
662
-
663
- }
664
-
665
- else {
666
-
667
- changeTurn();
668
-
669
- MessageDialog("あなたはパスです");
670
-
671
- }
672
-
673
- }
674
-
675
- }
676
-
677
- }
678
-
679
-
680
-
681
- //白、黒石の総数と石が置けなくなる場合を考える
682
-
683
- int num_black = 0;
684
-
685
- int num_white = 0;
686
-
687
- for(int i = 0; i<8; i++) {
688
-
689
- for(int j = 0; j<8; j++) {
690
-
691
- if( board.ste[i][j].obverse == 1 ) num_black++;
692
-
693
- if( board.ste[i][j].obverse == 2 ) num_white++;
694
-
695
- }
696
-
697
- }
698
-
699
-
700
-
701
- if( board.num_grid_black < 1 && board.num_grid_white < 1 )
702
-
703
- {
704
-
705
- EndMessageDialog(num_black, num_white);
706
-
707
- }
708
-
709
- }
710
-
711
- }
712
-
713
-
714
-
715
- //起動
716
-
717
- public static void main(String[] args) {
718
-
719
- JFrame f = new JFrame();
720
-
721
-
722
-
723
- f.getContentPane().setLayout(new FlowLayout());
724
-
725
- f.getContentPane().add(new Reversi());
726
-
727
- f.pack();
137
+ ### 試したこと
728
-
729
- f.setResizable(false);
730
-
731
- f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
732
-
733
- f.setVisible(true);
734
-
735
- }
736
-
737
- }
738
138
 
739
139
  ```
140
+
141
+ 上記のsetStoneAndReverse(int x, int y, int s){}において、反転を行った方角を示すdirection[d]を出力した。
142
+
143
+ - 意図しない石が反転された際、予想外の方向にも反転を行っていることが分かった。
144
+
145
+ - このことから方角を取得するgetLine(int x, int y, Point d){}に問題があると考えた。
146
+
147
+ ```

1

誤字

2019/11/27 04:33

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,9 @@
1
+ java環境で石を反転させる時に、隣合う挟まれていない石まで反転されてしまいます。
2
+
3
+ 修正カ所などがあれば御指摘ください。
4
+
5
+
6
+
1
7
  ```ここに言語を入力
2
8
 
3
9
  import java.awt.*;