###現状の説明
長くなってしまってもうしわけないのですが、
下のソースコードは、丸とバツを交互につけていって
先に3個ならんだら勝ちというあのゲームをJavaFXにて実装しようとしたものです。
まだ製作途中なので、コンピューターは完全にランダムでマークを付ける状態なのですが
そこで、コンピューターが考えているふりをさせようと、
Thread.sleep(1000);
を挿入しました。
しかし、下のコードをコンパイルして実行しますと
プレイヤーがクリック→1秒待ってプレイヤーとコンピューターのマークが同時に描画される
という形になってしまっています。
自分の望んでいるのは、
プレイヤーがクリック→プレイヤーのマークが描画される→1秒待つ→コンピューターのマークが描画されるというものです。
Platform.runLaterを使えばいいのかとやってみましたが、
それでも結果は全くかわりませんでした。
質問
1, どうして下のコードだと自分の望むものが実装できないのでしょうか?
2, また、どうやれば望むものを実装できますか?
###該当のソースコード
java
1import javafx.application.Application; 2import javafx.application.Platform; 3import javafx.stage.Stage; 4import javafx.stage.Modality; 5import javafx.scene.Scene; 6import javafx.scene.canvas.Canvas; 7import javafx.scene.canvas.GraphicsContext; 8import javafx.scene.layout.VBox; 9import javafx.geometry.Pos; 10import javafx.scene.input.MouseEvent; 11import javafx.scene.layout.HBox; 12import javafx.geometry.Insets; 13import javafx.scene.control.Label; 14import javafx.scene.control.Button; 15 16public class Marubatsu extends Application{ 17 18 int[][] check = new int[3][3]; //0は何もなし、1はプレイヤー、2はコンピューター 19 int player = 0; //1なら先手、2なら後手 20 21 Canvas canvas = new Canvas(200,200); 22 GraphicsContext gc = canvas.getGraphicsContext2D(); 23 int turn = 0; 24 Boolean GameOver = false; 25 public void start(Stage stage){ 26 stage.setTitle("Marubatsu"); 27 stage.setResizable(false); 28 Stage primaryStage = new Stage(); 29 primaryStage.initOwner(stage); 30 primaryStage.initModality(Modality.APPLICATION_MODAL); 31 32 Button button1 = new Button("先手"); 33 Button button2 = new Button("後手"); 34 HBox hroot = new HBox(); 35 hroot.getChildren().addAll(button1,button2); 36 hroot.setPadding(new Insets(10,5,10,5)); 37 hroot.setSpacing(10.0); 38 hroot.setAlignment(Pos.CENTER); 39 primaryStage.setScene(new Scene(hroot)); 40 41 Label label = new Label("Game Start!"); 42 43 button1.setOnAction(event -> { 44 player = 1; 45 hroot.getChildren().clear(); 46 hroot.getChildren().add(label); 47 label.setOnMouseClicked(levent -> { 48 primaryStage.close(); 49 }); 50 }); 51 button2.setOnAction(event -> { 52 player = 2; 53 hroot.getChildren().clear(); 54 hroot.getChildren().add(label); 55 label.setOnMouseClicked(levent -> { 56 primaryStage.close(); 57 strokeCompute(); 58 }); 59 60 }); 61 62 VBox root = new VBox(); 63 root.setAlignment(Pos.CENTER); 64 65 root.getChildren().add(canvas); 66 67 gc.setLineWidth(4.0); 68 gc.strokeLine(80,40,80,160); 69 gc.strokeLine(120,40,120,160); 70 gc.strokeLine(40,80,160,80); 71 gc.strokeLine(40,120,160,120); 72 canvas.setMouseTransparent(false); 73 canvas.setOnMouseClicked(event -> { 74 strokePlayer(event); 75 }); 76 77 stage.setScene(new Scene(root)); 78 stage.show(); 79 primaryStage.show(); 80 for(int i=0;i<3;i++) 81 for(int j=0;j<3;j++) 82 check[i][j] = 0; 83 } 84 85 public void drawMark(int x,int y,int p){//マルかバツを書く 86 87 if(p==1){ 88 if(player == 1){ 89 gc.strokeOval(50+40*x,50+40*y,20,20); 90 }else{ 91 gc.strokeLine(50+40*x,50+40*y,70+40*x,70+40*y); 92 gc.strokeLine(50+40*x,70+40*y,70+40*x,50+40*y); 93 } 94 }else{ 95 if(player == 2){ 96 gc.strokeOval(50+40*x,50+40*y,20,20); 97 }else{ 98 gc.strokeLine(50+40*x,50+40*y,70+40*x,70+40*y); 99 gc.strokeLine(50+40*x,70+40*y,70+40*x,50+40*y); 100 } 101 } 102 } 103 public void strokePlayer(MouseEvent event){//プレイヤーが書く 104 int x=-1; 105 int y=-1; 106 if(GameOver) return; 107 if(event.getX()>=40&&160>=event.getX()&&event.getY()>=40&&160>=event.getY()){ 108 x = (int)((event.getX()-40)/40.0); 109 y = (int)((event.getY()-40)/40.0); 110 }else return; 111 if(check[x][y] == 1||check[x][y] == 2) return; 112 113 check[x][y] = 1; 114 turn++; 115 drawMark(x,y,1); 116 if(isGameEnd()) return; 117 118 119 120 Platform.runLater(new Runnable() { 121 @Override 122 public void run() { 123 strokeCompute() ;//コンピューターの次の手 124 } 125 }); 126 } 127 public void strokeCompute(){//コンピューターが書く 128 int x,y; 129 if(GameOver) return; 130 131 //考えているふりをする。 132 try{ 133 Thread.sleep(1000); 134 }catch(Exception e){} 135 136 while(true){ 137 x = new java.util.Random().nextInt(3); 138 y = new java.util.Random().nextInt(3); 139 if(check[x][y] != 0)continue; 140 break; 141 } 142 check[x][y] = 2; 143 turn++; 144 drawMark(x,y,2); 145 if(isGameEnd()) 146 return; 147 148 } 149 Boolean isGameEnd(){//勝敗がついているかどうか 150 if(turn <5) return false; 151 int iWin = 0; 152 for(int i=1;i<3;i++){ 153 if(check[0][0] == i&&check[1][1] == i&&check[2][2] == i){ 154 iWin = i; 155 } 156 if(check[2][0] == i&&check[1][1] == i&&check[0][2] == i){ 157 iWin = i; 158 } 159 } 160 for(int k=1;k<3;k++){ 161 for(int i=0;i<3;i++){ 162 if(check[0][i]==k&&check[1][i]==k&&check[2][i]==k){ 163 iWin=k; 164 break; 165 } 166 } 167 if(iWin>0) break; 168 } 169 for(int k=1;k<3;k++){ 170 for(int i=0;i<3;i++){ 171 if(check[i][0]==k&&check[i][1]==k&&check[i][2]==k){ 172 iWin=k; 173 break; 174 } 175 } 176 if(iWin>0) break; 177 } 178 if(iWin==0 && turn<9) 179 return false; 180 181 if(iWin==0) 182 System.out.println("引き分け"); 183 else if(iWin==1) 184 System.out.println("プレイヤーが勝ち"); 185 else 186 System.out.println("コンピューターが勝ち"); 187 GameOver = true; 188 return true; 189 } 190} 191
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/04 17:15
2016/06/05 01:03 編集
2016/06/05 07:30