利用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. java 栈

    package testjavapro; import java.util.*; public class testjava { static void showpush(Stack<Integ ...

  2. 第01组 Alpha冲刺(4/6)

    队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11884375.html 作业博客: https://edu.cnblogs.com/campus/fz ...

  3. 写代码注意了,打死都不要用 User 这个单词

    阅读本文大概需要 4 分钟. 原文:http://t.cn/Eau2d0h 译文:http://21cto.com/article/2093 当你意识到你在项目开始时做的轻量.简单的设想竟然完全错了时 ...

  4. MySQL基础概念知多少

    MySQL基础概念相关的名词还是挺多的,比如3大范式.4种隔离界别.ACID.DQL.DML.DDL,还有redo.undo.binlog等,本文就统一整理下MySQL常见的基础概念,方便小伙伴们翻阅 ...

  5. ASP.Net Core使用分布式缓存Redis从入门到实战演练

    一.课程介绍 人生苦短,我用.NET Core!缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.  所以经常要用到且不会频繁改变且被用户共享的 ...

  6. Alpha冲刺(8/10)——2019.4.30

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  7. StringTable

    首先看这样一个面试题 // StringTable [ "a", "b" ,"ab" ] hashtable 结构,不能扩容 public ...

  8. 【转】JavaScript 高性能数组去重

    原文地址:https://www.cnblogs.com/wisewrong/p/9642264.html 一.测试模版 数组去重是一个老生常谈的问题,网上流传着有各种各样的解法 为了测试这些解法的性 ...

  9. c++作业题sin公式

    今日 有一位同样读大一的朋友向我求助有关c++的作业题 他说他的程序逻辑正确 但是结果的精度不对 题目如下: 这是一道看起来十分简单的作业题 我按照要求快速地写了一个版本 不出所料 一样遇到了精度问题 ...

  10. java 操作实例

    1.无重复字符的最长子串 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. class Soluti ...