javaFX實現五子棋小遊戲
阿新 • • 發佈:2020-07-27
javaFX實現五子棋遊戲,供大家參考,具體內容如下
做課程設計的時候做到這個,分享出來大家參考一下吧,圖片為遊戲執行過程
最下的程式碼就是整個實現整個需求的
package Version3; import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.input.MouseButton; import javafx.scene.layout.BorderPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import javafx.stage.Stage; public class Version3 extends Application { private char winer = ' ';//勝者 TextField tf = new TextField(); private char whoseTurn = (int)(Math.random() * 2) == 0 ? 'X' : 'O';//隨機回合 private int numberOfClick = 0; @Override public void start(Stage primaryStage) { Button bt = new Button("New game"); //按鈕 //TextField tf = new TextField(); Cell [] cell = new Cell[9]; for(int i=0; i<9 ;i++){ cell[i] = new Cell(2,1); } GridPane gpane = new GridPane(); int num =0; for(int i=0; i<3 ;i++){ for(int j=0; j<3 ;j++){ gpane.add(cell[num],j,i); num++; } } tf.setEditable(false);//文字不可編輯 BorderPane pane = new BorderPane(); pane.setTop(bt); pane.setAlignment(bt,Pos.CENTER); pane.setCenter(gpane); pane.setBottom(tf); //按鈕事件 重新開始遊戲 bt.setOnAction(e ->{ gpane.getChildren().clear(); for (int i = 0; i < 9; i++) { cell[i] = new Cell(2,1); } int k = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { gpane.add(cell[k],i); k++; } } whoseTurn = (int)(Math.random() * 2) == 0 ? 'X' : 'O'; tf.setText(whoseTurn == 'X' ? "X's turn" : "O's turn"); setListenerForCells(cell);//呼叫單元格的偵聽器 winer = ' '; }); // 給底部文字設定初始情況 tf.setText(whoseTurn == 'X' ? "X's turn" : "O's turn"); // 給每個面板設定一個監聽器 setListenerForCells(cell); Scene scene = new Scene(pane,495,550); primaryStage.setTitle("version3"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } public void judgeWhoWin(Cell[] cell){ // 判斷行 for (int i = 0; i < 3; i++) { if (cell[i * 3].contain == 'X'&& cell[i * 3 + 1].contain == 'X'&& cell[i * 3 + 2].contain == 'X') { winer = 'X'; } else if (cell[i * 3].contain == 'O'&& cell[i * 3 + 1].contain == 'O'&& cell[i * 3 + 2].contain == 'O') { winer = 'O'; } } // 判斷列 for (int i = 0; i < 3; i++) { if (cell[i].contain == 'X'&& cell[i + 3].contain == 'X'&& cell[i + 6].contain == 'X') { winer = 'X'; } else if (cell[i].contain == 'O'&& cell[i + 3].contain == 'O'&& cell[i + 6].contain == 'O') { winer = 'O'; } } // 判斷主、副對角線 if (cell[0].contain == 'X' && cell[4].contain == 'X' && cell[8].contain == 'X'|| cell[2].contain == 'X' && cell[4].contain == 'X' && cell[6].contain == 'X') { winer = 'X'; } else if (cell[0].contain == 'O' && cell[4].contain == 'O' && cell[8].contain == 'O'|| cell[2].contain == 'O' && cell[4].contain == 'O' && cell[6].contain == 'O') { winer = 'O'; } } //點選滑鼠 在#字表格里面顯示一個隨機位置的的X or O public void setListenerForCells(Cell[] cell){ numberOfClick = 0;//點選次數清零 for (int i = 0; i < cell.length; i++) { Cell temp = cell[i]; temp.setOnMouseClicked(e -> { if (winer == ' ') { if (whoseTurn == 'X' && e.getButton() == MouseButton.PRIMARY && temp.editable) { temp.setContain(1,1); temp.editable = false;//不可編輯 winer = ' '; whoseTurn = 'O';//下一次換回和 judgeWhoWin(cell);//判斷輸贏 if(winer == ' '){ numberOfClick++; if(numberOfClick == 9){ tf.setText("the game is a draw"); } else{ tf.setText(whoseTurn + "'s turn"); } } else{ tf.setText("Game is over,and the winner is "+ winer); } } else if (whoseTurn == 'O' && e.getButton() == MouseButton.PRIMARY && temp.editable) { temp.setContain(1,2); temp.editable = false;//不可編輯 winer = ' '; whoseTurn = 'X';//下一次換回和 judgeWhoWin(cell);//判斷輸贏 if(winer == ' '){ numberOfClick++; if(numberOfClick == 9){ tf.setText("the game is a draw"); } else{ tf.setText(whoseTurn + "'s turn"); } } else{ tf.setText("Game is over,and the winner is "+ winer); } } } }); } } class Cell extends BorderPane{ public char contain =' '; int num1 = 0,num2 = 0; public boolean editable = true; public Cell(int num1,int num2){ super.setPadding(new Insets(5)); super.setStyle("-fx-border-color: black"); super.setPrefSize(2000,2000); this.setContain(num1,num2); } public void setContain(int num1,int num2){ if(num1==1 && editable){ if(num2==1){ //構建X面板 Line line1 = new Line(0,150,150); Line line2 = new Line(150,150); StackPane pane1 = new StackPane(); pane1.getChildren().addAll(line1,line2); super.setCenter(pane1); contain = 'X'; } else if(num2==2 && editable){ ///構建O面板 Circle circle = new Circle(75);//半徑為75 circle.setFill(Color.WHITE);//填充為白色 circle.setStroke(Color.BLACK);//邊框為黑色 StackPane pane2 = new StackPane(); pane2.getChildren().add(circle); super.setCenter(pane2); contain = 'O'; } } } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。