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 ...
随机推荐
- 搭建Hadoop+Python的大数据开发环境
实验环境 CentOS镜像为CentOS-7-x86_64-Everything-1804.iso 虚机配置 节点名称 IP地址 子网掩码 CPU/内存 磁盘 安装方式 master 192.168. ...
- 基于GPU的算法并行化
GPU计算的目的即是计算加速.相比于CPU,其具有以下三个方面的优势: l 并行度高:GPU的Core数远远多于CPU(如G100 GPU有240个Cores),从而GPU的任务并发度也远高于CPU ...
- 面试必问:HashMap 底层实现原理
HashMap是在面试中经常会问的一点,很多时候我们仅仅只是知道HashMap他是允许键值对都是Null,并且是非线程安全的,如果在多线程的环境下使用,是很容易出现问题的. 这是我们通常在面试中会说的 ...
- Xcode一个project多个target
project添加target https://blog.csdn.net/vbirdbest/article/details/53466009 https://www.cnblogs.com/Bob ...
- elasticsearch 分片的创建 集群重启分片运作
2016年11月12日ENGINEERING Every shard deserves a home 作者 Joshua Backing Share Here are some great slide ...
- SharePoint - Another Way to Delete Site Collection
I had created a site collection. But there is a problem of web-frontend server (I did not know when ...
- c++11 enum class用法
使用过的一个enum class的用法:enum class EModel : int { Model1, Model2, Model3, Other = 4, }; EMo ...
- AQS工作原理分析
AQS工作原理分析 一.大致介绍1.前面章节讲解了一下CAS,简单讲就是cmpxchg+lock的原子操作:2.而在谈到并发操作里面,我们不得不谈到AQS,JDK的源码里面好多并发的类都是通过Sy ...
- CentOS修改ulimit
一.概述 查看limit配置 # ulimit -a core data seg size (kbytes, -d) unlimited scheduling priority (-e) file s ...
- Replication:The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'
今天早上,Dev跟我说,执行query statement时出现一个error,detail info是: “The transaction log for database 'tempdb' is ...