javaFX实现五子棋小游戏

 更新时间:2020年07月27日 09:11:18   作者:As_Yan_Do  
这篇文章主要为大家详细介绍了javaFX实现五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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], j, 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,0,150,150);
  Line line2 = new Line(150,0,0,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';
 } 
 }
 }
 }
}

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java多线程的原子性,可见性,有序性你都了解吗

    Java多线程的原子性,可见性,有序性你都了解吗

    这篇文章主要为大家详细介绍了Java多线程的原子性,可见性,有序性,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java实现添加条码或二维码到Word文档

    Java实现添加条码或二维码到Word文档

    这篇文章主要介绍了如何在Word文档中添加条码、二维码。可在文档正文段落中添加,也可在页眉页脚中添加,感兴趣的小伙伴快跟随小编一起学习一下吧
    2022-05-05
  • 一文搞懂Java并发AQS的共享锁模式

    一文搞懂Java并发AQS的共享锁模式

    这篇文章主要为大家阐述AQS另外一个重要模式,共享锁模式。共享锁可以由多个线程同时获取, 比较典型的就是读锁,感兴趣的小伙伴可以了解一下
    2022-10-10
  • Spring Boot 2.6.x整合Swagger启动失败报错问题的完美解决办法

    Spring Boot 2.6.x整合Swagger启动失败报错问题的完美解决办法

    这篇文章主要给大家介绍了关于Spring Boot 2.6.x整合Swagger启动失败报错问题的完美解决办法,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • springboot 如何使用jackson来处理实体类

    springboot 如何使用jackson来处理实体类

    这篇文章主要介绍了springboot使用jackson来处理实体类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java中Collections.sort排序详解

    java中Collections.sort排序详解

    这篇文章主要介绍了java中Collections.sort排序详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java线程代码的实现方法

    Java线程代码的实现方法

    下面小编就为大家带来一篇Java线程代码的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java 多线程Thread与runnable的区别

    java 多线程Thread与runnable的区别

    这篇文章主要介绍了java 多线程Thread与runnable的区别的相关资料,java线程有两种方法继承thread类与实现runnable接口,下面就提供实例帮助大家理解,需要的朋友可以参考下
    2017-08-08
  • Kafka Java Producer代码实例详解

    Kafka Java Producer代码实例详解

    这篇文章主要介绍了Kafka Java Producer代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java集合Stack源码详解

    Java集合Stack源码详解

    java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。当然,我们也可以将LinkedList当作栈来使用!
    2018-05-05

最新评论