利用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. python requests 上传excel数据流

    headers=self.headers #获取导入模版 file_home = self.import_template log.info(file_home) wb = load_workbook ...

  2. vue监听当前页面的地址变化/路由变化

    转载自: Heap Stack(Pingbook) https://pingbook.top/vue-watch-current-url-route-change/

  3. python实现两个两个的翻转字符串

    #!/usr/bin/python str = "ABCDEFGH" print(str) lenstr=len(str) print(lenstr) ss='' for i in ...

  4. Azure DevOps Server 2019 第一个补丁包(2019.0.1 RTW)

    在Azure DevOps Server 2019正式发布后的2周左右时间,微软快速发布了第一个补丁包Azure DevOps Server 2019.0.1 RTW.Azure DevOps Ser ...

  5. 什么是 ZFS文件系统?ZFS概念及特点简介

    什么是 ZFS? ZFS(Zettabyte File System)是由SUN公司的Jeff Bonwick领导设计的一种基于Solaris的文件系统,最初发布于20014年9月14日. SUN被O ...

  6. 转载:Linux命令行快捷键

    常用 Ctrl + 左右键:在单词之间跳转 Ctrl + A:跳到本行的行首 Ctrl + E:跳到页尾 Ctrl + U:删除当前光标前面的所有文字(还有剪切功能) Ctrl + K:删除当前光标后 ...

  7. CentOS7使用tar.gz包安装MySql的踩坑之旅

    由于客户的CentOS服务器没有安装yum工具,只能通过下载tar.gz包安装mysql,于是跟着万能的百度开启了漫漫踩坑之旅: 1.下载mysql-5.6.33-linux-glibc2.5-x86 ...

  8. 简洁的 Python Schema

    目录 Python Schema使用说明 1. Schema是什么? 2. 安装 1. 给Schema类传入类型(int.str.float等) 2. 给Schema类传入可调用的对象(函数.带__c ...

  9. session中删除数组中的某一个值 - 购物车例子 - jsp

    这篇随笔简单的讲一下在session中移除数组中的某一项内容,比如这里有一个购物车其中有两件商品,需要移除其中洗发水这一件商品. 其实在这个session对象中存储了一个数组,在订购页面时选择商品加入 ...

  10. 【转载】socket通信-C#实现tcp收发字符串文本数据

    在日常碰到的项目中,有些场景需要发送文本数据,也就是字符串,比如简单的聊天文字,JSON字符串等场景.那么如何如何使用SharpSocket来收发此类数据呢?其中要掌握的关键点是什么呢? 点击查看原博 ...