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

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

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

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

Eclipse

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

Q&A

解決済

1回答

691閲覧

プログラムの連結(最初の画面での結果から次のプログラムに影響させる)

AGUA_Channel

総合スコア14

Java

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

Eclipse

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

1グッド

0クリップ

投稿2020/01/13 16:51

編集2020/01/13 16:56

前提・実現したいこと

Eclipseで作成したプログラムです
最初のコードの結果に応じてp1Turn()から始めるかp2Turn()から始めるか、といったプログラムを作ろうと試みています。
最初のサイコロ画面を表示→p1が大きければp1Turn(),p2が大きければp2Turn()で始まる
といった感じにしたいのですがどのようにすればよいか分かりません。
どうかご教授お願い致します。

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

双方コンパイルエラー無し 下のコードはimport文を省略していますが正しいものが使われている前提でお答えください。

該当のソースコード

java

1public class RPSandMancala extends Application { 2 3 //シーンの宣言 4 public static Scene scene1 = null; 5 6 //グローバル変数 7 public static String ps1,ps2; 8 public static int p1=0,p2=0; 9 10 @Override 11 public void start(Stage stage)throws Exception { 12 13 //サイコロ 14 while(p1==p2) { 15 p1=(int)(Math.random()*6)+1; 16 p2=(int)(Math.random()*6)+1; 17 } 18 ps1 = String.valueOf(p1); 19 ps2 = String.valueOf(p2); 20 21 stage.setTitle("マンカラゲーム"); 22 23 // ステージの作成 24 First(stage); 25 26 stage.setScene(scene1); 27 stage.show(); 28 } 29 30 //★最初のサイコロ画面★ 31 public static void First(Stage stage) { 32 GridPane MainPane=new GridPane(); 33 34 Label lbl1=new Label("1P"); 35 lbl1.setFont(new Font(25)); 36 Label lbl2=new Label("2P"); 37 lbl2.setFont(new Font(25)); 38 39 Label pn1 = new Label(" "+ps1); 40 pn1.setFont(new Font(25)); 41 pn1.setPrefSize(100,30); 42 Label pn2 = new Label(" "+ps2); 43 pn2.setFont(new Font(25)); 44 pn2.setPrefSize(100,30); 45 46 Button btn = new Button("ゲームへ"); 47 btn.setFont(new Font(25)); 48 btn.setPrefSize(150,50); 49 50 GridPane.setConstraints(lbl1,0,0); 51 GridPane.setConstraints(lbl2,1,0); 52 GridPane.setConstraints(pn1,0,1); 53 GridPane.setConstraints(pn2,1,1); 54 GridPane.setConstraints(btn,2,2); 55 56 MainPane.getChildren().addAll(lbl1,lbl2,pn1,pn2,btn); 57 58 VBox root =new VBox(10); 59 scene1 = new Scene(root); 60 61 Label label=new Label("数値の大きいほうが先攻となります"); 62 label.setFont(new Font(30)); 63 64 label.setPrefSize(1000,30); 65 MainPane.setPrefSize(1000,700); 66 67 root.getChildren().addAll(label,MainPane); 68 } 69 //★最初のサイコロ画面★ 70 public static void setScene(Stage stage,Scene changeScene) { 71 stage.setScene(changeScene); 72 stage.show(); 73 } 74 public static void main(String[] args) { 75 // TODO 自動生成されたメソッド・スタブ 76 launch(); 77 } 78}

java

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/14 00:25

普通はパネルを切り替えますが、ウィンドウごと切り替えるのはなんの入れ知恵でしょうか?
AGUA_Channel

2020/01/14 01:06

下のコードのことでしょうか? でしたら、下のコードに関してはこのサイトにて他の方が答えてくださった案を利用しております。
guest

回答1

0

ベストアンサー

今こそsetSceneの出番じゃないでしょうか。

まずちょうどよい機会でしたので、アプリ本体・タイトルパネル・ゲームパネルの3つのクラスに分けました。

次に遷移(Button.OnAction)を誰がどうセットするかですが、すべてを把握しているアプリ本体がセットするようにしました。
その際安直にパネルの遷移用ボタンを公開して、アプリ本体から見えるようにしました。。

FXMLを使わない場合の定跡がどうなのかはよくわかりません(例えば1P勝利シーンに遷移したい場合、どういう実装がいいのか。なかなか悩ましいです)

Java

1import javafx.application.Application; 2import javafx.event.ActionEvent; 3import javafx.geometry.Pos; 4import javafx.scene.Group; 5import javafx.scene.Scene; 6import javafx.scene.control.Button; 7import javafx.scene.control.Control; 8import javafx.scene.control.Label; 9import javafx.scene.image.Image; 10import javafx.scene.image.ImageView; 11import javafx.scene.layout.GridPane; 12import javafx.scene.layout.VBox; 13import javafx.scene.text.Font; 14import javafx.stage.Stage; 15 16 17public class RPSandMancala extends Application { 18 //シーン 19 private Scene titleScene; 20 private Scene gameScene; 21 //シーンのルートになるパネル 22 private TitlePane title; 23 private GamePane game; 24 25 @Override 26 public void start(Stage stage) { 27 stage.setTitle("マンカラゲーム"); 28 stage.setWidth(800); 29 stage.setHeight(600); 30 stage.setResizable(false); 31 32 title = new TitlePane(); 33 title.gameButton.setOnAction(e -> { 34 game.init(title.p1 > title.p2); // 先手後手を与え初期化 35 stage.setScene(gameScene); 36 }); 37 titleScene = new Scene(title); 38 39 game = new GamePane(); 40 game.titleButton.setOnAction(e -> { 41 title.init(); // サイコロの振りなおし 42 stage.setScene(titleScene); 43 }); 44 gameScene = new Scene(game); 45 46 stage.setScene(titleScene); 47 stage.show(); 48 } 49 50 public static void main(String[] args) { 51 launch(); 52 } 53} 54 55class TitlePane extends VBox { 56 int p1; 57 int p2; 58 Button gameButton = new Button("ゲームへ"); 59 60 private Label pn1 = new Label(); 61 private Label pn2 = new Label(); 62 63 TitlePane() { 64 GridPane MainPane = new GridPane(); 65 Label lbl1 = new Label("1P"); 66 lbl1.setFont(new Font(25)); 67 Label lbl2 = new Label("2P"); 68 lbl2.setFont(new Font(25)); 69 70 pn1.setFont(new Font(25)); 71 pn1.setPrefSize(100, 30); 72 pn2.setFont(new Font(25)); 73 pn2.setPrefSize(100, 30); 74 75 gameButton.setFont(new Font(25)); 76 gameButton.setPrefSize(150, 50); 77 78 GridPane.setConstraints(lbl1, 0, 0); 79 GridPane.setConstraints(lbl2, 1, 0); 80 GridPane.setConstraints(pn1, 0, 1); 81 GridPane.setConstraints(pn2, 1, 1); 82 GridPane.setConstraints(gameButton, 2, 2); 83 84 MainPane.getChildren().addAll(lbl1, lbl2, pn1, pn2, gameButton); 85 86 setSpacing(10); 87 88 Label label = new Label("数値の大きいほうが先攻となります"); 89 label.setFont(new Font(30)); 90// label.setPrefSize(1000, 30); 91 92// MainPane.setPrefSize(1000, 700); 93 getChildren().addAll(label, MainPane); 94 95 init(); 96 } 97 98 void init() { 99 p1 = 0; 100 p2 = 0; 101 102 while (p1 == p2) { 103 p1 = (int) (Math.random() * 6) + 1; 104 p2 = (int) (Math.random() * 6) + 1; 105 } 106 107 pn1.setText(" " + p1); 108 pn2.setText(" " + p2); 109 } 110} 111 112class GamePane extends Group { 113 Button titleButton = new Button("タイトルに戻る"); 114 115 private int sentcnt; 116 private int[] BOXs = { 3, 3, 3, 0, 3, 3, 3, 0 }; 117 private boolean OneMore = false; 118 119 private ImageView mv1 = new ImageView(new Image("file:C:/paint.png")); 120 private ImageView mv2 = new ImageView(new Image("file:C:/paint2.png")); 121 122 private Label label = new Label(); 123 private Label[] box = new Label[8]; 124 private Button[] btn = new Button[7]; 125 126 private Gamove gamove = new Gamove(); 127 128 129 private class Gamove { 130 void Game(int bn, int move) { 131 OneMore = false; 132 int i = bn; 133 i++; 134 135 do { 136 for (; move != 0 && i < 8; move--, i++) { 137 BOXs[i]++; 138 if (i == 3 && move == 1) { 139 OneMore = true; 140 } 141 if (i == 7 && move == 1) { 142 OneMore = true; 143 } 144 } 145 if (move >= 1) { 146 i = 0; 147 } 148 } while (move != 0); 149 150 BOXs[bn] = 0; 151 } 152 } 153 154 GamePane() { 155 label.setFont(new Font(30)); 156 label.setPrefSize(800, 30); 157 158 for (int i = 0; i < box.length; i++) { 159 box[i] = new Label(); 160 box[i].setFont(new Font(25)); 161 box[i].setPrefSize(150, 100); 162 box[i].setAlignment(Pos.CENTER); 163 } 164 165 for (int i = 0; i < btn.length; i++) { 166 if (i == 3) continue; 167 String s = i % 4 == 0 ? "左を動かす" : i % 4 == 1 ? "中央を動かす" : "右を動かす"; 168 btn[i] = new Button(s); 169 btn[i].setFont(new Font(15)); 170 btn[i].setPrefSize(150, 50); 171 btn[i].setOnAction(this::onButtonAction); 172 } 173 174 Control[][] controls = { 175 { null, btn[6], btn[5], btn[4], null, }, 176 { null, box[6], box[5], box[4], null, }, 177 { box[7], null, null, null, box[3], }, 178 { null, box[0], box[1], box[2], null, }, 179 { null, btn[0], btn[1], btn[2], null, }, 180 }; 181 for (int row = 0; row < controls.length; row++) { 182 for (int col = 0; col < controls[0].length; col++) { 183 if (controls[row][col] == null) continue; 184 GridPane.setConstraints(controls[row][col], col, row); 185 } 186 } 187 188 GridPane GamePane = new GridPane(); 189// GamePane.setPrefSize(1000, 700); 190 191 GamePane.getChildren().addAll(box); 192 GamePane.getChildren().addAll(btn[0], btn[1], btn[2], btn[4], btn[5], btn[6]); 193 194 titleButton.setFont(new Font(15)); 195 titleButton.setPrefSize(150, 50); 196 197 VBox Window = new VBox(10); 198 Window.getChildren().addAll(label, GamePane, titleButton); 199 getChildren().addAll(mv1, mv2, Window); 200 201 init(true); // 通常はこの後すぐinitが呼ばれるが、念のため 202 } 203 204 void init(boolean p1First) { 205 BOXs = new int[]{ 3, 3, 3, 0, 3, 3, 3, 0 }; 206 updateUI(); 207 208 if (p1First) p1Turn(); 209 else p2Turn(); 210 } 211 212 private void updateUI() { 213 for (int i = 0; i < box.length; i++) { 214 box[i].setText(String.valueOf(BOXs[i])); 215 } 216 217 for (int i = 0; i < btn.length; i++) { 218 if (i == 3) continue; 219 btn[i].setDisable(BOXs[i] == 0); 220 } 221 } 222 223 private void onButtonAction(ActionEvent actionEvent) { 224 Button b = (Button) actionEvent.getSource(); 225 for (int i = 0; i < btn.length; i++) { 226 if (i == 3) continue; 227 if (b == btn[i]) gamove.Game(i, BOXs[i]); 228 } 229 230 updateUI(); 231 232 if (b == btn[0] || b == btn[1] || b == btn[2]) { 233 if (BOXs[0] == 0 && BOXs[1] == 0 && BOXs[2] == 0) { 234 p1Win(); 235 } else if (OneMore) { 236 sentcnt++; 237 label.setText("1Pの番です(" + sentcnt + "回目)"); 238 } else { 239 sentcnt = 1; 240 p2Turn(); 241 } 242 } else if (b == btn[4] || b == btn[5] || b == btn[6]) { 243 if (BOXs[4] == 0 && BOXs[5] == 0 && BOXs[6] == 0) { 244 p2Win(); 245 } else if (OneMore) { 246 sentcnt++; 247 label.setText("2Pの番です(" + sentcnt + "回目)"); 248 } else { 249 sentcnt = 1; 250 p1Turn(); 251 } 252 } 253 } 254 255 private void p1Win() { 256 label.setText("1Pが勝利しました"); 257 for (int i = 0; i < btn.length; i++) { 258 if (i == 3) continue; 259 btn[i].setDisable(true); 260 } 261 mv1.setVisible(true); 262 mv2.setVisible(false); 263 } 264 265 private void p2Win() { 266 label.setText("2Pが勝利しました"); 267 for (int i = 0; i < btn.length; i++) { 268 if (i == 3) continue; 269 btn[i].setDisable(true); 270 } 271 mv1.setVisible(false); 272 mv2.setVisible(true); 273 } 274 275 private void p1Turn() { 276 label.setText("1Pの番です"); 277 for (int i = 0; i < btn.length; i++) { 278 if (i == 3) continue; 279 btn[i].setVisible(i < 3); 280 } 281 mv1.setVisible(false); 282 mv2.setVisible(false); 283 } 284 285 private void p2Turn() { 286 label.setText("2Pの番です"); 287 for (int i = 0; i < btn.length; i++) { 288 if (i == 3) continue; 289 btn[i].setVisible(i > 3); 290 } 291 mv1.setVisible(false); 292 mv2.setVisible(false); 293 } 294}

ついでにboxとbtnを配列にしてみましたが、行数は減ったものの分かりにくくなって、やりすぎかもしれません^^;

投稿2020/01/14 12:05

TN8001

総合スコア9317

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

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

AGUA_Channel

2020/01/14 12:35

模範的な回答ですね! このコードを自己解釈して勉強にも充てたいと思います。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問