質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

1860閲覧

Javaでマンカラゲームのルールを作る

AGUA_Channel

総合スコア14

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/01/13 12:14

前提・実現したいこと

Eclipseを用いてマンカラというゲームを作成しています。
しかし、1,2,4は問題ないのですが3を行う際に正しく動きません。
Gamove.Gameを修正すればいいとは思うのですがどのように修正すればいいかが分かりません。
どうかご教授お願い致します。

なお、3の判断はOneMoreがTrueの時にもう一度自分のターンになることを想定しています。

###マンカラのルール
0. 手前が1Pの自陣、奥に2Pの自陣、各々3マスずつあり、その左右に1マスある(俗にいう墓地のようなもの)
最初に各陣には各マスに3個ずつ駒が置かれる
0. 自分のターンの時、自陣のマスのうち1つを総取りし、反時計回りに1マス毎に1個ずつ置く。そして相手のターンに移る。
0. もし、1個ずつ置いたときに最後の1個を左右にあるマスに置く場合はもう一度自分のターンとなる。
(複数回自分のターンになる可能性もある)
0. 2と3を繰り返して自陣のマスの駒が全て0になった方の勝利

発生している問題・エラーメッセージ

コンパイルエラーは無し
OneMoreが毎回Trueになっている。(ifの条件が良くない?)

ソースコード

java

1import javafx.application.Application; 2import javafx.event.ActionEvent; 3import javafx.geometry.Pos; 4import javafx.scene.Parent; 5import javafx.scene.Scene; 6import javafx.scene.control.Button; 7import javafx.scene.control.Control; 8import javafx.scene.control.Label; 9import javafx.scene.layout.GridPane; 10import javafx.scene.layout.VBox; 11import javafx.scene.text.Font; 12import javafx.stage.Stage; 13 14public class JavaFXPlactice extends Application { 15 16 private int sentcnt; 17 private int[] BOXs = { 3, 3, 3, 0, 3, 3, 3, 0 }; 18 private boolean OneMore=false; 19 20 private Label label = new Label(); 21 22 private Label box0 = new Label(); 23 private Label box1 = new Label(); 24 private Label box2 = new Label(); 25 private Label box3 = new Label(); 26 private Label box4 = new Label(); 27 private Label box5 = new Label(); 28 private Label box6 = new Label(); 29 private Label box7 = new Label(); 30 31 private Button btn0 = new Button("左を動かす"); // 1P 32 private Button btn1 = new Button("中央を動かす"); 33 private Button btn2 = new Button("右を動かす"); 34 private Button btn4 = new Button("右を動かす"); // 2P 35 private Button btn5 = new Button("中央を動かす"); 36 private Button btn6 = new Button("左を動かす"); 37 38 private Gamove gamove = new Gamove(); 39 40 class Gamove { 41 void Game(int bn, int move) { 42 43 //初期値設定 44 OneMore=false; 45 int i = bn; 46 //1マス先から置くので 47 i++; 48 49 //駒を進める 50 do { 51 for (; move != 0 && i < 7; move--, i++) { 52 BOXs[i]++; 53 if (!(i == 2 && move == 1)) { 54 OneMore=true; 55 } 56 System.out.println("move:" + move); 57 System.out.println("i:" + i); 58 } 59 if (!(i == 7 && move == 0)) { 60 OneMore=true; 61 } 62 //一周するため 63 if (move >= 1) { 64 i = 0; 65 System.out.println("i,reset:" + i); 66 } 67 //もう一周? 68 } while (move != 0); 69 70 BOXs[bn] = 0; 71 72 //★テスト用★ 73 for (int j = 0; j < 8; j++) { 74 System.out.println("box" + j + "マス:" + BOXs[j]); 75 } 76 System.out.println("bn:" + bn); 77 System.out.println("★★OneMore:" + OneMore+"★★"); 78 79 } 80 } 81 82 83 @Override 84 public void start(Stage stage) { 85 86 stage.setTitle("マンカラゲーム"); 87 stage.setWidth(1000); 88 stage.setHeight(800); 89 90 stage.setScene(new Scene(getGamePane())); 91 stage.show(); 92 93 updateUI(); 94 p1Turn(); 95 } 96 97 //★ゲームパネル★ 98 private Parent getGamePane() { 99 100 label.setFont(new Font(30)); 101 label.setPrefSize(1000, 30); 102 103 Label[] boxes = { box0, box1, box2, box3, box4, box5, box6, box7 }; 104 for (Label l : boxes) { // 長くなるので一時的に配列に入れループでセット 105 l.setFont(new Font(25)); 106 l.setPrefSize(150, 100); 107 l.setAlignment(Pos.CENTER); 108 } 109 110 Button[] btns = { btn0, btn1, btn2, btn4, btn5, btn6 }; 111 for (Button b : btns) { 112 b.setFont(new Font(15)); 113 b.setPrefSize(150, 50); 114 b.setOnAction(this::onButtonAction); // b.setOnAction(e->onButtonAction(e)) 115 } 116 117 Control[][] controls = { // たいして短くなっていないが、場所の対応がわかりやすい 118 { null, btn6, btn5, btn4, null, }, 119 { null, box6, box5, box4, null, }, 120 { box7, null, null, null, box3, }, 121 { null, box0, box1, box2, null, }, 122 { null, btn0, btn1, btn2, null, }, 123 }; 124 for (int row = 0; row < controls.length; row++) { 125 for (int col = 0; col < controls[0].length; col++) { 126 if (controls[row][col] == null) continue; 127 GridPane.setConstraints(controls[row][col], col, row); 128 } 129 } 130 131 GridPane GamePane = new GridPane(); 132 GamePane.setPrefSize(1000, 700); 133 134 GamePane.getChildren().addAll(boxes); 135 GamePane.getChildren().addAll(btns); 136 137 VBox root = new VBox(10); 138 root.getChildren().addAll(label, GamePane); 139 140 return root; 141 } 142 143 private void updateUI() { 144 box0.setText(String.valueOf(BOXs[0])); 145 box1.setText(String.valueOf(BOXs[1])); 146 box2.setText(String.valueOf(BOXs[2])); 147 box3.setText(String.valueOf(BOXs[3])); 148 box4.setText(String.valueOf(BOXs[4])); 149 box5.setText(String.valueOf(BOXs[5])); 150 box6.setText(String.valueOf(BOXs[6])); 151 box7.setText(String.valueOf(BOXs[7])); 152 153 btn0.setDisable(BOXs[0] == 0); // 移動できないボタンは押せないようにする 154 btn1.setDisable(BOXs[1] == 0); 155 btn2.setDisable(BOXs[2] == 0); 156 btn4.setDisable(BOXs[4] == 0); 157 btn5.setDisable(BOXs[5] == 0); 158 btn6.setDisable(BOXs[6] == 0); 159 } 160 161 // ボタンを押したとき 全部共通 162 private void onButtonAction(ActionEvent actionEvent) { 163 Button b = (Button) actionEvent.getSource(); // 押されたボタン 164 if (b == btn0) gamove.Game(0, BOXs[0]); 165 if (b == btn1) gamove.Game(1, BOXs[1]); 166 if (b == btn2) gamove.Game(2, BOXs[2]); 167 if (b == btn4) gamove.Game(4, BOXs[4]); 168 if (b == btn5) gamove.Game(5, BOXs[5]); 169 if (b == btn6) gamove.Game(6, BOXs[6]); 170 updateUI(); 171 172 if (b == btn0 || b == btn1 || b == btn2) { // 1P 173 if (BOXs[0] == 0 && BOXs[1] == 0 && BOXs[2] == 0) { 174 p1Win(); 175 } else if (OneMore==true) { 176 sentcnt++; 177 label.setText("1Pの番です(" + sentcnt + "回目)"); 178 } else { 179 sentcnt = 1; 180 p2Turn(); 181 } 182 } else if (b == btn4 || b == btn5 || b == btn6) { // 2P 183 if (BOXs[4] == 0 && BOXs[5] == 0 && BOXs[6] == 0) { 184 p2Win(); 185 } else if (OneMore==true) { 186 sentcnt++; 187 label.setText("2Pの番です(" + sentcnt + "回目)"); 188 } else { 189 sentcnt = 1; 190 p1Turn(); 191 } 192 } 193 } 194 195 // 1Pの勝利 196 private void p1Win() { 197 label.setText("1Pが勝利しました"); 198 btn0.setDisable(true); 199 btn1.setDisable(true); 200 btn2.setDisable(true); 201 btn4.setDisable(true); 202 btn5.setDisable(true); 203 btn6.setDisable(true); 204 } 205 206 // 2Pの勝利 207 private void p2Win() { 208 label.setText("2Pが勝利しました"); 209 btn0.setDisable(true); 210 btn1.setDisable(true); 211 btn2.setDisable(true); 212 btn4.setDisable(true); 213 btn5.setDisable(true); 214 btn6.setDisable(true); 215 } 216 217 // 1Pのターン 218 private void p1Turn() { 219 label.setText("1Pの番です"); 220 btn0.setVisible(true); 221 btn1.setVisible(true); 222 btn2.setVisible(true); 223 btn4.setVisible(false); 224 btn5.setVisible(false); 225 btn6.setVisible(false); 226 } 227 228 // 2Pのターン 229 private void p2Turn() { 230 label.setText("2Pの番です"); 231 btn0.setVisible(false); 232 btn1.setVisible(false); 233 btn2.setVisible(false); 234 btn4.setVisible(true); 235 btn5.setVisible(true); 236 btn6.setVisible(true); 237 } 238 239// public static void setScene(Stage stage, Scene changeScene) { 240// stage.setScene(changeScene); 241// stage.show(); 242// } 243 244 public static void main(String[] args) { 245 launch(); 246 } 247}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGUA_Channel

2020/01/13 12:53

小さなくぼみが各プレイヤーで3マスずつではありますが、そのとおりであります。
guest

回答3

0

java

1 if (!(i == 2 && move == 1)) { 2 OneMore=true; 3 }

こんなのあったら、ほとんどの状態でtrueになるのでは?

投稿2020/01/13 13:04

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

for (; move != 0 && i < 7; move--, i++) { BOXs[i]++; if (!(i == 2 && move == 1)) { OneMore=true; } System.out.println("move:" + move); System.out.println("i:" + i); } if (!(i == 7 && move == 0)) { OneMore=true; }

駒を配って OneMore を判定している個所ですが, まず, なぜ判定の2つの if 文が for の内と外に分かれているのでしょうか.
2か所の「墓地」と言われた場所への配置を判定するのであれば, 2つとも内か外に一緒にあるべきではないでしょうか.
そして肝心の条件も, 最後の1つかは move==1 として, 墓地の位置は i==3 と i==7 のはずです. さらにはなぜ "!" が付いているのでしょう.


以上を踏まえた上で, i の調整をしている外側の do-while 等も含めて整理すると, 以下のようにも書けます.
game メソッドの move 引数は不要になります.

java

1void Game(int bn) { 2 int i = bn; 3 int move = BOXs[bn]; 4 BOXs[bn] = 0; 5 while (--move>=0) { 6 i = (i+1) % 8; 7 BOXs[i]++; 8 } 9 OneMore = (i == 3 || i == 7); 10}

投稿2020/01/13 12:56

編集2020/01/13 13:33
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のようにGamove.Game設定したら完成できました。
jimbeさんの解答を参考にして修正をした結果完成できました。
教えていただいた2名の方々に御礼を申し上げます。

java

1class Gamove { 2 void Game(int bn, int move) { 3 4 //初期値設定 5 OneMore=false; 6 int i = bn; 7 //1マス先から置くので 8 i++; 9 10 //駒を進める 11 do { 12 for (; move != 0 && i < 8; move--, i++) { 13 BOXs[i]++; 14 if (i == 3 && move == 1) { 15 OneMore=true; 16 } 17 if (i == 7 && move == 1) { 18 OneMore=true; 19 } 20 System.out.println("move:" + move); 21 System.out.println("i:" + i); 22 } 23 //一周するため 24 if (move >= 1) { 25 i = 0; 26 System.out.println("i,reset:" + i); 27 } 28 //もう一周? 29 } while (move != 0); 30 31 BOXs[bn] = 0; 32 33 //★テスト用★ 34 for (int j = 0; j < 8; j++) { 35 System.out.println("box" + j + "マス:" + BOXs[j]); 36 } 37 System.out.println("bn:" + bn); 38 System.out.println("★★OneMore:" + OneMore+"★★"); 39 40 } 41 }

投稿2020/01/13 13:22

AGUA_Channel

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問