利用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. React_01_ECMAScript6

    ECMAScript6 1.ES6简介 1.1.什么是ES6 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目 ...

  2. git bash 乱码问题之解决方案

    解决办法:右击左上方git标识,然后进入到如图中,点击Text,进行操作. 操作完毕后,关闭git bash,然后再重新打开,执行ls或ll命令,查看对应的以中文作为目录或文件名是否显示乱码,如果之前 ...

  3. docker for mac的JSON配置文件中的hosts项修改后无法生效

    docker for mac的JSON配置文件中的hosts项修改后无法生效 docker 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键内容,没有改进余地 增 ...

  4. Apollo配置中心--安装使用-docker

    官网:https://github.com/ctripcorp/apollo Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推 ...

  5. scala集合有哪些

    不可变集合图示:  

  6. 生成随机验证码,上传图片文件,解析HTML

    1.生成随机图片验证码 1.1 页面调用createvalidatecode 生成随机图片验证码方法: <div class="inputLine"><label ...

  7. CUDA 到底什么玩意

    * CUDA与cuDNN * 什么是CUDA * CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台. CUDA是一种由NVIDIA ...

  8. 镜像仓库 Nexus 3.18.1

    说明:Nexus是Sonatype提供的仓库管理平台,Nuexus Repository OSS3能够支持Maven.npm.Docker.YUM.Helm等格式数据的存储和发布. 一.安装jdk 1 ...

  9. | C语言I作业04

    | C语言I作业004 标签: 18软件 李煦亮 问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://www.cnblogs.com/pengchen511/p/ ...

  10. ubuntu 17.04 下搭建深度学习环境

    .目前使用CPU即可,先不需要显卡配置 .使用pip3 安装深度学习框架 .要先安装pip3 #sudo apt install python3-pip https://blog.csdn.net/b ...