回答編集履歴

1

追記 参考コード

2020/01/13 01:01

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -97,3 +97,535 @@
97
97
  しかし`Game1Pfirst`の`BX1`と`Game2Pfirst`の`BX1`は別物なので、シーンが変わったときに値が反映されません。
98
98
 
99
99
  シーンを分けずにボタンの表示非表示で、手番を表現したほうが楽かなと思います。
100
+
101
+
102
+
103
+ ---
104
+
105
+
106
+
107
+ 追記 参考コード
108
+
109
+
110
+
111
+ * BX1をbox0に、btn1をbtn0に変更(BOXsと対応する数字に合わせる&文字数を揃える)
112
+
113
+ * 冗長なコントロールの設定をforで圧縮
114
+
115
+ * setOnActionが行数を食うので全部共通化
116
+
117
+ * Gamoveのstaticをやめて引っ張られていたメンバもインスタンスフィールドに
118
+
119
+ * Gamove.Gameをvoidに(どうせBOXsいじれちゃうので)
120
+
121
+ * ゲーム画面中で完結しそうなのでSceneは使わない(タイトル画面等全然関連しない画面ならシーンを分けるんでしょうけど、勝利画面はマスを残したいんですよね?)
122
+
123
+
124
+
125
+ LabelやButtonを配列でメンバに持てば、もうちょっとすっきりするかもしれないが、本題には関係しないのでやめた(初期化部分であまりにも面倒なところだけ、一時的に配列を使用)
126
+
127
+
128
+
129
+ Gamoveの連続移動の判定(BOXs[8])がうまく動いていないように思うが、
130
+
131
+ (「for(;move!=0;)なのでif(i==3&&move==0)は絶対来ないよ」と、IDEが教えてくれていました)
132
+
133
+ 頭がよくないので考えるのをやめたw
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+ ```Java
142
+
143
+ import javafx.application.Application;
144
+
145
+ import javafx.event.ActionEvent;
146
+
147
+ import javafx.geometry.Pos;
148
+
149
+ import javafx.scene.Parent;
150
+
151
+ import javafx.scene.Scene;
152
+
153
+ import javafx.scene.control.Button;
154
+
155
+ import javafx.scene.control.Control;
156
+
157
+ import javafx.scene.control.Label;
158
+
159
+ import javafx.scene.layout.GridPane;
160
+
161
+ import javafx.scene.layout.VBox;
162
+
163
+ import javafx.scene.text.Font;
164
+
165
+ import javafx.stage.Stage;
166
+
167
+
168
+
169
+ public class JavaFXPlactice extends Application {
170
+
171
+
172
+
173
+ private int sentcnt;
174
+
175
+ private int[] BOXs = { 3, 3, 3, 0, 3, 3, 3, 0, 0 };
176
+
177
+
178
+
179
+ private Label label = new Label();
180
+
181
+
182
+
183
+ private Label box0 = new Label();
184
+
185
+ private Label box1 = new Label();
186
+
187
+ private Label box2 = new Label();
188
+
189
+ private Label box3 = new Label();
190
+
191
+ private Label box4 = new Label();
192
+
193
+ private Label box5 = new Label();
194
+
195
+ private Label box6 = new Label();
196
+
197
+ private Label box7 = new Label();
198
+
199
+
200
+
201
+ private Button btn0 = new Button("左を動かす"); // 1P
202
+
203
+ private Button btn1 = new Button("中央を動かす");
204
+
205
+ private Button btn2 = new Button("右を動かす");
206
+
207
+ private Button btn4 = new Button("左を動かす"); // 2P
208
+
209
+ private Button btn5 = new Button("中央を動かす");
210
+
211
+ private Button btn6 = new Button("右を動かす");
212
+
213
+
214
+
215
+ private Gamove gamove = new Gamove();
216
+
217
+
218
+
219
+ class Gamove {
220
+
221
+ void Game(int bn, int move) {
222
+
223
+
224
+
225
+ //初期値設定
226
+
227
+ BOXs[8] = 0;
228
+
229
+ int i = bn;
230
+
231
+ //1マス先から置くので
232
+
233
+ i++;
234
+
235
+
236
+
237
+ //駒を進める
238
+
239
+ do {
240
+
241
+ for (; move != 0 && i < 8; move--, i++) {
242
+
243
+ BOXs[i]++;
244
+
245
+ if (i == 3 && move == 0) {
246
+
247
+ BOXs[8] = 1;
248
+
249
+ }
250
+
251
+ System.out.println("move:" + move);
252
+
253
+ System.out.println("i:" + i);
254
+
255
+ }
256
+
257
+ if (!(i == 7 && move == 0)) {
258
+
259
+ BOXs[8] = 1;
260
+
261
+ }
262
+
263
+ //一周するため
264
+
265
+ if (move >= 1) {
266
+
267
+ i = 0;
268
+
269
+ System.out.println("i,reset:" + i);
270
+
271
+ }
272
+
273
+ //もう一周?
274
+
275
+ } while (move != 0);
276
+
277
+
278
+
279
+ BOXs[bn] = 0;
280
+
281
+
282
+
283
+ //★テスト用★
284
+
285
+ for (int j = 0; j < 8; j++) {
286
+
287
+ System.out.println("box" + j + "マス:" + BOXs[j]);
288
+
289
+ }
290
+
291
+ System.out.println("bn:" + bn);
292
+
293
+ }
294
+
295
+ }
296
+
297
+
298
+
299
+
300
+
301
+ @Override
302
+
303
+ public void start(Stage stage) {
304
+
305
+
306
+
307
+ stage.setTitle("マンカラゲーム");
308
+
309
+ stage.setWidth(1000);
310
+
311
+ stage.setHeight(800);
312
+
313
+
314
+
315
+ stage.setScene(new Scene(getGamePane()));
316
+
317
+ stage.show();
318
+
319
+
320
+
321
+ updateUI();
322
+
323
+ p1Turn();
324
+
325
+ }
326
+
327
+
328
+
329
+ //★ゲームパネル★
330
+
331
+ private Parent getGamePane() {
332
+
333
+
334
+
335
+ label.setFont(new Font(30));
336
+
337
+ label.setPrefSize(1000, 30);
338
+
339
+
340
+
341
+ Label[] boxes = { box0, box1, box2, box3, box4, box5, box6, box7 };
342
+
343
+ for (Label l : boxes) { // 長くなるので一時的に配列に入れループでセット
344
+
345
+ l.setFont(new Font(25));
346
+
347
+ l.setPrefSize(150, 100);
348
+
349
+ l.setAlignment(Pos.CENTER);
350
+
351
+ }
352
+
353
+
354
+
355
+ Button[] btns = { btn0, btn1, btn2, btn4, btn5, btn6 };
356
+
357
+ for (Button b : btns) {
358
+
359
+ b.setFont(new Font(15));
360
+
361
+ b.setPrefSize(150, 50);
362
+
363
+ b.setOnAction(this::onButtonAction); // b.setOnAction(e->onButtonAction(e))
364
+
365
+ }
366
+
367
+
368
+
369
+ Control[][] controls = { // たいして短くなっていないが、場所の対応がわかりやすい
370
+
371
+ { null, btn6, btn5, btn4, null, },
372
+
373
+ { null, box6, box5, box4, null, },
374
+
375
+ { box7, null, null, null, box3, },
376
+
377
+ { null, box0, box1, box2, null, },
378
+
379
+ { null, btn0, btn1, btn2, null, },
380
+
381
+ };
382
+
383
+ for (int row = 0; row < controls.length; row++) {
384
+
385
+ for (int col = 0; col < controls[0].length; col++) {
386
+
387
+ if (controls[row][col] == null) continue;
388
+
389
+ GridPane.setConstraints(controls[row][col], col, row);
390
+
391
+ }
392
+
393
+ }
394
+
395
+
396
+
397
+ GridPane GamePane = new GridPane();
398
+
399
+ GamePane.setPrefSize(1000, 700);
400
+
401
+
402
+
403
+ GamePane.getChildren().addAll(boxes);
404
+
405
+ GamePane.getChildren().addAll(btns);
406
+
407
+
408
+
409
+ VBox root = new VBox(10);
410
+
411
+ root.getChildren().addAll(label, GamePane);
412
+
413
+
414
+
415
+ return root;
416
+
417
+ }
418
+
419
+
420
+
421
+ private void updateUI() {
422
+
423
+ box0.setText(String.valueOf(BOXs[0]));
424
+
425
+ box1.setText(String.valueOf(BOXs[1]));
426
+
427
+ box2.setText(String.valueOf(BOXs[2]));
428
+
429
+ box3.setText(String.valueOf(BOXs[3]));
430
+
431
+ box4.setText(String.valueOf(BOXs[4]));
432
+
433
+ box5.setText(String.valueOf(BOXs[5]));
434
+
435
+ box6.setText(String.valueOf(BOXs[6]));
436
+
437
+ box7.setText(String.valueOf(BOXs[7]));
438
+
439
+
440
+
441
+ btn0.setDisable(BOXs[0] == 0); // 移動できないボタンは押せないようにする
442
+
443
+ btn1.setDisable(BOXs[1] == 0);
444
+
445
+ btn2.setDisable(BOXs[2] == 0);
446
+
447
+ btn4.setDisable(BOXs[4] == 0);
448
+
449
+ btn5.setDisable(BOXs[5] == 0);
450
+
451
+ btn6.setDisable(BOXs[6] == 0);
452
+
453
+ }
454
+
455
+
456
+
457
+ // ボタンを押したとき 全部共通
458
+
459
+ private void onButtonAction(ActionEvent actionEvent) {
460
+
461
+ Button b = (Button) actionEvent.getSource(); // 押されたボタン
462
+
463
+ if (b == btn0) gamove.Game(0, BOXs[0]);
464
+
465
+ if (b == btn1) gamove.Game(1, BOXs[1]);
466
+
467
+ if (b == btn2) gamove.Game(2, BOXs[2]);
468
+
469
+ if (b == btn4) gamove.Game(4, BOXs[4]);
470
+
471
+ if (b == btn5) gamove.Game(5, BOXs[5]);
472
+
473
+ if (b == btn6) gamove.Game(6, BOXs[6]);
474
+
475
+ updateUI();
476
+
477
+
478
+
479
+ if (b == btn0 || b == btn1 || b == btn2) { // 1P
480
+
481
+ if (BOXs[0] == 0 && BOXs[1] == 0 && BOXs[2] == 0) {
482
+
483
+ p1Win();
484
+
485
+ } else if (BOXs[8] == 1) {
486
+
487
+ sentcnt++;
488
+
489
+ label.setText("1Pの番です(" + sentcnt + "回目)");
490
+
491
+ } else {
492
+
493
+ sentcnt = 1;
494
+
495
+ p2Turn();
496
+
497
+ }
498
+
499
+ } else if (b == btn4 || b == btn5 || b == btn6) { // 2P
500
+
501
+ if (BOXs[4] == 0 && BOXs[5] == 0 && BOXs[6] == 0) {
502
+
503
+ p2Win();
504
+
505
+ } else if (BOXs[8] == 1) {
506
+
507
+ sentcnt++;
508
+
509
+ label.setText("2Pの番です(" + sentcnt + "回目)");
510
+
511
+ } else {
512
+
513
+ sentcnt = 1;
514
+
515
+ p1Turn();
516
+
517
+ }
518
+
519
+ }
520
+
521
+ }
522
+
523
+
524
+
525
+ // 1Pの勝利
526
+
527
+ private void p1Win() {
528
+
529
+ label.setText("1Pが勝利しました");
530
+
531
+ btn0.setDisable(true);
532
+
533
+ btn1.setDisable(true);
534
+
535
+ btn2.setDisable(true);
536
+
537
+ btn4.setDisable(true);
538
+
539
+ btn5.setDisable(true);
540
+
541
+ btn6.setDisable(true);
542
+
543
+ }
544
+
545
+
546
+
547
+ // 2Pの勝利
548
+
549
+ private void p2Win() {
550
+
551
+ label.setText("2Pが勝利しました");
552
+
553
+ btn0.setDisable(true);
554
+
555
+ btn1.setDisable(true);
556
+
557
+ btn2.setDisable(true);
558
+
559
+ btn4.setDisable(true);
560
+
561
+ btn5.setDisable(true);
562
+
563
+ btn6.setDisable(true);
564
+
565
+ }
566
+
567
+
568
+
569
+ // 1Pのターン
570
+
571
+ private void p1Turn() {
572
+
573
+ label.setText("1Pの番です");
574
+
575
+ btn0.setVisible(true);
576
+
577
+ btn1.setVisible(true);
578
+
579
+ btn2.setVisible(true);
580
+
581
+ btn4.setVisible(false);
582
+
583
+ btn5.setVisible(false);
584
+
585
+ btn6.setVisible(false);
586
+
587
+ }
588
+
589
+
590
+
591
+ // 2Pのターン
592
+
593
+ private void p2Turn() {
594
+
595
+ label.setText("2Pの番です");
596
+
597
+ btn0.setVisible(false);
598
+
599
+ btn1.setVisible(false);
600
+
601
+ btn2.setVisible(false);
602
+
603
+ btn4.setVisible(true);
604
+
605
+ btn5.setVisible(true);
606
+
607
+ btn6.setVisible(true);
608
+
609
+ }
610
+
611
+
612
+
613
+ // public static void setScene(Stage stage, Scene changeScene) {
614
+
615
+ // stage.setScene(changeScene);
616
+
617
+ // stage.show();
618
+
619
+ // }
620
+
621
+
622
+
623
+ public static void main(String[] args) {
624
+
625
+ launch();
626
+
627
+ }
628
+
629
+ }
630
+
631
+ ```