JavaFX 井字棋游戏
利用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 井字棋游戏的更多相关文章
- [CareerCup] 17.2 Tic Tac Toe 井字棋游戏
17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...
- 井字棋游戏升级版 - TopTicTacToe项目 简介
一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...
- C++井字棋游戏,DOS界面版
据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /* N字棋游戏PVP版,DOS版 ...
- Java井字棋游戏
试着写了一个井字棋游戏,希望各位能给予一些宝贵的建议. 一.棋盘类 package 井字棋游戏; public class ChessBoard { private int number; Perso ...
- [C++] 井字棋游戏源码
TicTac.h #define EX 1 //该点左鼠标 #define OH 2 //该点右鼠标 class CMyApp : public CWinApp { public: virtual B ...
- [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 ...
- [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 ...
- Raptor井字棋游戏
作为大学第一个小作品,记录一下,也给那些想接触到Raptor游戏的人一个小小的参考QAQ至于Raptor的语法和使用,可以参考一下他的帮助手册,看不懂英文的话可以复制放到翻译上看. 以上是主函数 以下 ...
- [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 ...
随机推荐
- listings技巧
1. \lstdefinestyle 参考 https://blog.csdn.net/ProgramChangesWorld/article/details/52142313 我们在使用listin ...
- IDEA Gradle配置与使用
1.安装Gradle,并添加环境变量. https://www.cnblogs.com/NyanKoSenSei/p/11458953.html 2.在IDEA中设置Gradle: 3.选中项目中的. ...
- SQL工具 Red Gate
Red Gate提供了很多对于sql server的工具. 这边介绍两个:Sql Prompt和Sql doc Sql Prompt:智能提示sql语句等等 Sql doc:生成数据库文档页面 Red ...
- xunsearch搜索测试
1.导入测试数据 cd $prefix/sdk/php util/Indexer.php --source=csv --clean demo 然后出现 初始化数据源 ... csv WARNING: ...
- pip install 时报错 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
pip install 时报错: pip is configured with locations that require TLS/SSL, however the ssl module in Py ...
- TCP/UDP的网络底层实现
1.1Socket的使用背景 当我们在使用微信.玩游戏.收发邮件,以及用web浏览器上网时,底层的实现是TCP/UDP的协议,封装socket实现网络通信功能. 了解了网络通信的底层实现原理,在出现s ...
- (9)ASP.NET Core 中的MVC路由二
1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分.在控制器.视图和视图组件 ...
- 解决TensorFlow在terminal中正常但在jupyter notebook中报错的方案
报错情况: # 本地运行正常,jupyter中无法 import tensorflow ImportError: libcublas.so.10.0: cannot open shared objec ...
- Mysql之索引(六)
1.思考 在图书馆是怎么找到一本书的? 一般的应用系统对比数据库的读写比例在10:1左右(即有10次查询有1次写操作),而且插入操作和更新操作很少出现性能问题. 遇到最多,最复杂的还是一些复杂的查询操 ...
- spark源码阅读--shuffle过程分析
ShuffleManager(一) 本篇,我们来看一下spark内核中另一个重要的模块,Shuffle管理器ShuffleManager.shuffle可以说是分布式计算中最重要的一个概念了,数据的j ...