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 ...
随机推荐
- java 栈
package testjavapro; import java.util.*; public class testjava { static void showpush(Stack<Integ ...
- 第01组 Alpha冲刺(4/6)
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11884375.html 作业博客: https://edu.cnblogs.com/campus/fz ...
- 写代码注意了,打死都不要用 User 这个单词
阅读本文大概需要 4 分钟. 原文:http://t.cn/Eau2d0h 译文:http://21cto.com/article/2093 当你意识到你在项目开始时做的轻量.简单的设想竟然完全错了时 ...
- MySQL基础概念知多少
MySQL基础概念相关的名词还是挺多的,比如3大范式.4种隔离界别.ACID.DQL.DML.DDL,还有redo.undo.binlog等,本文就统一整理下MySQL常见的基础概念,方便小伙伴们翻阅 ...
- ASP.Net Core使用分布式缓存Redis从入门到实战演练
一.课程介绍 人生苦短,我用.NET Core!缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力. 所以经常要用到且不会频繁改变且被用户共享的 ...
- Alpha冲刺(8/10)——2019.4.30
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...
- StringTable
首先看这样一个面试题 // StringTable [ "a", "b" ,"ab" ] hashtable 结构,不能扩容 public ...
- 【转】JavaScript 高性能数组去重
原文地址:https://www.cnblogs.com/wisewrong/p/9642264.html 一.测试模版 数组去重是一个老生常谈的问题,网上流传着有各种各样的解法 为了测试这些解法的性 ...
- c++作业题sin公式
今日 有一位同样读大一的朋友向我求助有关c++的作业题 他说他的程序逻辑正确 但是结果的精度不对 题目如下: 这是一道看起来十分简单的作业题 我按照要求快速地写了一个版本 不出所料 一样遇到了精度问题 ...
- java 操作实例
1.无重复字符的最长子串 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. class Soluti ...