利用JavaFX设计一个井字棋游戏,其中包括了能够与玩家对战的AI。AI的实现相比五子棋来说要简单得多,可以保证AI在后手情况下绝对不会输,具体实现如下:

/*

* To change this license header, choose License Headers in Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package 井字棋;

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.stage.Stage;

import javafx.scene.layout.GridPane;

import javafx.scene.shape.Circle;

import javafx.scene.shape.Line;

import javafx.scene.control.Button;

import javafx.event.EventHandler;

import javafx.event.ActionEvent;

import javafx.animation.Timeline;

import javafx.util.Duration;

import javafx.animation.KeyFrame;

import javafx.scene.control.TextArea;

/**

*

* @author Midori

*/

public class 井字棋 extends Application{

private static int a[][]=new int[3][3];

private static int step=1;

private static int last=5;

private static boolean win=false;

private static boolean draw=false;

private static int wincount=0;

private static int drawcount=0;

private static String s="<( ̄︶ ̄)↗[GO!]"+"\n"+"[^ェ^] よろしく!";

@Override

public void start(Stage primaryStage){

GridPane pane=new GridPane();

pane.setMinSize(500, 300);

primaryStage.setResizable(false);

Button bt1=new Button();

bt1.setMinSize(100,100);

Button bt2=new Button();

bt2.setMinSize(100,100);

Button bt3=new Button();

bt3.setMinSize(100,100);

Button bt4=new Button();

bt4.setMinSize(100,100);

Button bt5=new Button();

bt5.setMinSize(100,100);

Button bt6=new Button();

bt6.setMinSize(100,100);

Button bt7=new Button();

bt7.setMinSize(100,100);

Button bt8=new Button();

bt8.setMinSize(100,100);

Button bt9=new Button();

bt9.setMinSize(100,100);

pane.add(bt1,0,0);

pane.add(bt2,0,1);

pane.add(bt3,0,2);

pane.add(bt4,1,0);

pane.add(bt5,1,1);

pane.add(bt6,1,2);

pane.add(bt7,2,0);

pane.add(bt8,2,1);

pane.add(bt9,2,2);

Button bt=new Button("Again");

pane.add(bt,5,1);

Scene scene=new Scene(pane);

EventHandler<ActionEvent>eventHandler=e1->{

bt.setOnMousePressed(e->{

for(int i=0;i<3;i++){

for(int j=0;j<3;j++)

a[i][j]=0;

}

step=1;

last=5;

win=false;

draw=false;

s="<( ̄︶ ̄)↗[GO!]"+"\n"+"[^ェ^] よろしく!";

});

if(last==0){

draw=true;

last=-1;

drawcount++;

}

if(win){

last=-1;

s="你咋又输了~"+"\n"+"( ̄_, ̄ )";

}

if(draw){

s="欸~平局~~"+"\n"+"╮(╯-╰)╭";

}

TextArea t2=new TextArea();

t2.setText(s);

t2.setMaxHeight(80);

pane.add(t2,5,2);

TextArea t1=new TextArea();

t1.setText("你已经输了"+wincount+"局!"+"\n"+"你已经平了"+drawcount+"局!"+"\n"+"你还没赢过~");

t1.setMaxHeight(80);

pane.add(t1,5,0);

bt1.setText(Switch(a[0][0]));

bt2.setText(Switch(a[0][1]));

bt3.setText(Switch(a[0][2]));

bt4.setText(Switch(a[1][0]));

bt5.setText(Switch(a[1][1]));

bt6.setText(Switch(a[1][2]));

bt7.setText(Switch(a[2][0]));

bt8.setText(Switch(a[2][1]));

bt9.setText(Switch(a[2][2]));

bt1.setOnMousePressed(e->{

if(step>0&&a[0][0]==0&&last>0){

a[0][0]=1;

step--;

last--;

Play(1);

step++;

}

});

bt2.setOnMousePressed(e->{

if(step>0&&a[0][1]==0&&last>0){

a[0][1]=1;

step--;

last--;

Play(2);

step++;

}

});

bt3.setOnMousePressed(e->{

if(step>0&&a[0][2]==0&&last>0){

a[0][2]=1;

step--;

last--;

Play(3);

step++;

}

});

bt4.setOnMousePressed(e->{

if(step>0&&a[1][0]==0&&last>0){

a[1][0]=1;

step--;

last--;

Play(4);

step++;

}

});

bt5.setOnMousePressed(e->{

if(step>0&&a[1][1]==0&&last>0){

a[1][1]=1;

step--;

last--;

Play(5);

step++;

}

});

bt6.setOnMousePressed(e->{

if(step>0&&a[1][2]==0&&last>0){

a[1][2]=1;

step--;

last--;

Play(6);

step++;

}

});

bt7.setOnMousePressed(e->{

if(step>0&&a[2][0]==0&&last>0){

a[2][0]=1;

step--;

last--;

Play(7);

step++;

}

});

bt8.setOnMousePressed(e->{

if(step>0&&a[2][1]==0&&last>0){

a[2][1]=1;

step--;

last--;

Play(8);

step++;

}

});

bt9.setOnMousePressed(e->{

if(step>0&&a[2][2]==0&&last>0){

a[2][2]=1;

step--;

last--;

Play(9);

step++;

}

});

};

Timeline animation=new Timeline(

new KeyFrame(Duration.millis(100),eventHandler)

);

animation.setCycleCount(Timeline.INDEFINITE);

animation.play();

primaryStage.setScene(scene);

primaryStage.setTitle("井字棋");

primaryStage.show();

}

public String Switch(int i){

String s="";

switch(i){

case 0:

s="  ";

break;

case -1:

s="O";

break;

case 1:

s="X";

}return s;

}

public static void main(String[] args) {

Application.launch(args);

}

public void Reset(){

}

public void Play(int i){

if(last==4)

if(i!=5)

a[1][1]=-1;

else

a[0][0]=-1;

else{

if(a[0][0]!=1&&a[0][1]!=1&&a[0][2]!=1&&a[0][0]+a[0][1]+a[0][2]<-1){

for(int j=0;j<3;j++)

if(a[0][j]==0)

a[0][j]=-1;

win=true;wincount++;

}

else if(a[1][0]!=1&&a[1][1]!=1&&a[1][2]!=1&&a[1][0]+a[1][1]+a[1][2]<-1){

for(int j=0;j<3;j++)

if(a[1][j]==0)

a[1][j]=-1;

win=true;wincount++;

}

else if(a[2][0]!=1&&a[2][1]!=1&&a[2][2]!=1&&a[2][0]+a[2][1]+a[2][2]<-1){

for(int j=0;j<3;j++)

if(a[2][j]==0)

a[2][j]=-1;

win=true;wincount++;

}

else if(a[0][0]!=1&&a[1][0]!=1&&a[2][0]!=1&&a[0][0]+a[1][0]+a[2][0]<-1){

for(int j=0;j<3;j++)

if(a[j][0]==0)

a[j][0]=-1;

win=true;wincount++;

}

else if(a[0][1]!=1&&a[1][1]!=1&&a[2][1]!=1&&a[0][1]+a[1][1]+a[2][1]<-1){

for(int j=0;j<3;j++)

if(a[j][1]==0)

a[j][1]=-1;

win=true;wincount++;

}

else if(a[0][2]!=1&&a[1][2]!=1&&a[2][2]!=1&&a[0][2]+a[1][2]+a[2][2]<-1){

for(int j=0;j<3;j++)

if(a[j][2]==0)

a[j][2]=-1;

win=true;wincount++;

}else if(a[0][0]!=1&&a[1][1]!=1&&a[2][2]!=1&&a[0][0]+a[1][1]+a[2][2]<-1){

for(int j=0;j<3;j++)

if(a[j][j]==0)

a[j][j]=-1;

win=true;wincount++;

}

else if(a[2][0]!=1&&a[1][1]!=1&&a[0][2]!=1&&a[2][0]+a[1][1]+a[0][2]<-1){

for(int j=0;j<3;j++)

if(a[j][2-j]==0)

a[j][2-j]=-1;

win=true;wincount++;

}

else if(a[0][0]!=-1&&a[0][1]!=-1&&a[0][2]!=-1&&a[0][0]+a[0][1]+a[0][2]>1){

for(int j=0;j<3;j++)

if(a[0][j]==0)

a[0][j]=-1;

}

else if(a[1][0]!=-1&&a[1][1]!=-1&&a[1][2]!=-1&&a[1][0]+a[1][1]+a[1][2]>1){

for(int j=0;j<3;j++)

if(a[1][j]==0)

a[1][j]=-1;

}

else if(a[2][0]!=-1&&a[2][1]!=-1&&a[2][2]!=-1&&a[2][0]+a[2][1]+a[2][2]>1){

for(int j=0;j<3;j++)

if(a[2][j]==0)

a[2][j]=-1;

}

else if(a[0][0]!=-1&&a[1][0]!=-1&&a[2][0]!=-1&&a[0][0]+a[1][0]+a[2][0]>1){

for(int j=0;j<3;j++)

if(a[j][0]==0)

a[j][0]=-1;

}

else if(a[0][1]!=-1&&a[1][1]!=-1&&a[2][1]!=-1&&a[0][1]+a[1][1]+a[2][1]>1){

for(int j=0;j<3;j++)

if(a[j][1]==0)

a[j][1]=-1;

}

else if(a[0][2]!=-1&&a[1][2]!=-1&&a[2][2]!=-1&&a[0][2]+a[1][2]+a[2][2]>1){

for(int j=0;j<3;j++)

if(a[j][2]==0)

a[j][2]=-1;

}else if(a[0][0]!=-1&&a[1][1]!=-1&&a[2][2]!=-1&&a[0][0]+a[1][1]+a[2][2]>1){

for(int j=0;j<3;j++)

if(a[j][j]==0)

a[j][j]=-1;

}

else if(a[2][0]!=-1&&a[1][1]!=-1&&a[0][2]!=-1&&a[2][0]+a[1][1]+a[0][2]>1){

for(int j=0;j<3;j++)

if(a[j][2-j]==0)

a[j][2-j]=-1;

}else{

if(a[0][0]==0)

a[0][0]=-1;

else if(a[2][0]==0)

a[2][0]=-1;

else if(a[0][2]==0)

a[0][2]=-1;

else if(a[2][2]==0)

a[2][2]=-1;

else if(a[0][1]==0)

a[0][1]=-1;

else if(a[1][0]==0)

a[1][0]=-1;

else if(a[1][2]==0)

a[1][2]=-1;

else

a[2][1]=-1;

}

}

}

}

下面是图形界面:

JavaFX 井字棋游戏的更多相关文章

  1. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  2. 井字棋游戏升级版 - TopTicTacToe项目 简介

    一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...

  3. C++井字棋游戏,DOS界面版

    据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /* N字棋游戏PVP版,DOS版 ...

  4. Java井字棋游戏

    试着写了一个井字棋游戏,希望各位能给予一些宝贵的建议. 一.棋盘类 package 井字棋游戏; public class ChessBoard { private int number; Perso ...

  5. [C++] 井字棋游戏源码

    TicTac.h #define EX 1 //该点左鼠标 #define OH 2 //该点右鼠标 class CMyApp : public CWinApp { public: virtual B ...

  6. [LeetCode] 348. Design Tic-Tac-Toe 设计井字棋游戏

    Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the fol ...

  7. [LeetCode] Design Tic-Tac-Toe 设计井字棋游戏

    Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the fol ...

  8. Raptor井字棋游戏

    作为大学第一个小作品,记录一下,也给那些想接触到Raptor游戏的人一个小小的参考QAQ至于Raptor的语法和使用,可以参考一下他的帮助手册,看不懂英文的话可以复制放到翻译上看. 以上是主函数 以下 ...

  9. [Swift]LeetCode348. 设计井字棋游戏 $ Design Tic-Tac-Toe

    Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the fol ...

随机推荐

  1. vue bootstrap中modal对话框不显示遮挡打不开

    使用Vue bootstrap时,点击modal却不能弹出来,被隐藏遮挡无法显示,参考下面的这个博客的说明解决了这个问题: Heap Stack Blog(pingbook.top)Vue boots ...

  2. 作业:用pygame实现俄罗斯方块

    用Pygame实现俄罗斯方块 参考资料后我安装了Pygame,参考了网上的代码实现了俄罗斯方块小游戏.我试着理解网上的代码的原理和含义,对这些代码的原理有了一个粗略地理解,代码通过参数,RGB值等来实 ...

  3. .net core 运行不需命令行

    1.问题情景: 需要保证已安装.net core SDK,并且命令提示符下运行“dotnet --version”,有反应. 如果之前运行良好,现在却不行了,查看安装程序中存在.net core SD ...

  4. shell(一) shell变量

    基本介绍 变量命名规范 变量名要求由字母.数字.下划线组成,尽量字母开头,有明确含义 注意:变量赋值时,等号前后不能有空格,变量名称不能和字体变量冲突 自定义变量 当前shell有效 1.定义变量 v ...

  5. python 关于celery的定时任务队列的基本使用(celery+redis)【采用配置文件设置】

    工程结构沿用https://www.cnblogs.com/apple2016/p/11422388.html,只需修改celeryconfig.py文件即可: 1.更新celeyconfig.py文 ...

  6. Java使用正则表达式匹配多行 Pattern flags

    Java中正则匹配有多种模式,若不选择模式则默认为单行匹配 匹配模式(Pattern flags) compile()方法有两个模式 未开匹配模式 Pattern compile(String reg ...

  7. [Atcoder AGC032C]Three Circuits

    题目大意:有一张$n$个点$m$条边的无向连通图,判断是否可以从中分出$3$个环,满足三个环覆盖整张图并且没有重复的边.$n,m\leqslant10^5$ 题解:分类讨论.有度数为奇肯定不行,因为连 ...

  8. go中&^(按位置零)符号的含义

    go中有一个 &^ 的运算符,它代表的是按位置零 首先来看下几个输出例子: i := 1 &^ 0 fmt.Println("1 &^ 0 -- ",i) ...

  9. 当Windows操作系统关机时,不会执行Windows Service的OnStop方法(转载)

    Windows Service OnStop when computer shutdown 问: I'm writing a Windows Service in C#. I want to take ...

  10. C#里面如何判断一个Object是否是某种类型

    第一种方法 var isA = oldObject.GetType() == typeof(Dictionary<string, string>) 第二种方法 var isB = oldO ...