package com.p4f.tictactoe.demo;

import javax.swing.border.Border;

public class Board {

    /**
* position
* 0 1 2
* 3 4 5
* 6 7 8
*/
private char[] position; /**
* default constructor
*/
public Board() { } /**
* constructor with a string
* @param s board position
*/
public Board(String s) {
if(s == null) {
this.position = null;
} else {
this.position = s.toCharArray();
}
} public boolean isWinForX() {
return isWinFor('X');
} public boolean isWinForO() {
return isWinFor('O');
} public boolean isDraw() { // 如果既不是X赢也不是O赢那么就是平局了
return isFull() && !isWinForX() && !isWinForO();
} /**
* 棋盘是不是满的
* @return true: 满的, false: 不是满的
*/
public boolean isFull() {
boolean t = true;
for(char c : position) {
if(c == ' ') {
return false;
}
}
return t;
} public boolean isGameOver() {
// 如果不是平局X和O也没有赢
return isDraw() || isWinForX() || isWinForO();
} /**
* 判断pos上是不是已经有子了
* @param pos 位置
* @return 有返回 true, 没有返回false
*/
public boolean isOccupied(int pos) { return position[pos] != ' ';
} public Board move(int pos, char c) { if(isOccupied(pos)) {
return null;
} else {
char[] newCharArray = position.clone();
newCharArray[pos] = c;
return new Board(newCharArray.toString());
}
} public void print() { System.out.println(convertPosition(position)); } public void printWithNumbers() { char[] a = position.clone();
char[] temp = new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8'};
for(int i=0; i<=8; i++) {
if(a[i] == ' ') {
a[i] = temp[i];
}
} System.out.println(convertPosition(a)); } private String convertPosition(char[] position) { StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(" ").append(position[0]).append(" | ").append(position[1]).append(" | ").append(position[2]).append(" \n").
append("---+---+---\n").
append(" ").append(position[3]).append(" ").append("|").append(" ").append(position[4]).append(" ").append("|").append(" ").append(position[5]).append(" \n").
append("---+---+---\n").
append(" ").append(position[6]).append(" | ").append(position[7]).append(" | ").append(position[8]).append(" "); return stringBuilder.toString();
} public boolean isWinFor(char c) {
boolean t = false;
if(position[0] == c && position[1] == c && position[2] == c) {
t = true;
} else if(position[3] == c && position[4] == c && position[5] == c) {
t = true;
}else if(position[6] == c && position[7] == c && position[8] == c) {
t = true;
}else if(position[0] == c && position[3] == c && position[6] == c) {
t = true;
}else if(position[1] == c && position[4] == c && position[7] == c) {
t = true;
}else if(position[2] == c && position[5] == c && position[8] == c) {
t = true;
}else if(position[0] == c && position[4] == c && position[8] == c) {
t = true;
}else if(position[2] == c && position[4] == c && position[6] == c) {
t = true;
}
return t;
} public static void main(String[] args) {
String s = "XXXOOO X ";
new Board(s).print(); new Board(s).printWithNumbers(); }
}
package com.p4f.tictactoe.demo;

public class TreeNode {

    private Board board;
private char nextTurn;
private char winFor; /**
* default constructor
*/
public TreeNode() { } /**
* constructor with board
*/
public TreeNode(Board board) {
this.board = board;
} public void setNextTurn(char nextTurn) {
// 在当前棋盘的布局下, 谁来走这一步
this.nextTurn = nextTurn;
} public char getNextTurn() {
// 返回当前落子的人是谁
return this.nextTurn;
} // 如果设置当前棋盘下赢的人是谁
public void setWinFor(char winFor) {
this.winFor = winFor;
} // 返回当前赢的人是谁
public char getWinFor() {
return this.winFor;
} public void setNextMove(int nextMove) { // 先判断有没有空位 // 如果有空位的话 // 按照以下次序 // 下一步可以赢的 // 如果 } public int getNextMove() {
return 0;
} /**
* 设置子节点
* @param pos 位置
* @param child 子节点
*/
public void setChild(int pos, TreeNode child) { } public TreeNode getChild(int pos) { Board nextBoard = board.move(pos, nextTurn);
TreeNode child = new TreeNode(nextBoard); return child;
} public Board getBoard() {
return board;
} public void setBoard(Board board) {
this.board = board;
} }
package com.p4f.tictactoe.demo;

public class GameTree {

    private TreeNode root;   // 根节点

    private char[] turn;    // 下棋的顺序

    public GameTree(String turns) {
this.turn = turns.toCharArray();
} public void makeGameTreeAt(TreeNode node) { if(node.getBoard().isDraw()) {
node.setWinFor(' ');
} else if(node.getBoard().isWinForX()) {
node.setWinFor('X');
} else if(node.getBoard().isWinForO()) {
node.setWinFor('O');
} else { if(!node.getBoard().isFull()) {
for(int i=0; i<8; i++) {
if(!node.getBoard().isOccupied(i)) {
Board board = node.getBoard().move(i, node.getNextTurn());
TreeNode child = new TreeNode(board);
makeGameTreeAt(child);
}
}
}
}
} public char getTurn(int n) {
return turn[n];
} public char winner() {
return ' ';
} public void print() { } public void print(TreeNode node) { } public void printNode() { } }

tic-tac-toe游戏代码的更多相关文章

  1. POJ 2361 Tic Tac Toe

    题目:给定一个3*3的矩阵,是一个井字过三关游戏.开始为X先走,问你这个是不是一个合法的游戏.也就是,现在这种情况,能不能出现.如果有人赢了,那应该立即停止.那么可以知道X的步数和O的步数应该满足x= ...

  2. 2019 GDUT Rating Contest III : Problem C. Team Tic Tac Toe

    题面: C. Team Tic Tac Toe Input file: standard input Output file: standard output Time limit: 1 second M ...

  3. 【leetcode】1275. Find Winner on a Tic Tac Toe Game

    题目如下: Tic-tac-toe is played by two players A and B on a 3 x 3 grid. Here are the rules of Tic-Tac-To ...

  4. Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

    1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputin ...

  5. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  6. python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

  7. LeetCode 5275. 找出井字棋的获胜者 Find Winner on a Tic Tac Toe Game

    地址 https://www.acwing.com/solution/LeetCode/content/6670/ 题目描述A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: ...

  8. ACM-Team Tic Tac Toe

    我的代码: #include <bits/stdc++.h> using namespace std; int main() { char a[3][3]; int i,j=0; for( ...

  9. Epic - Tic Tac Toe

    N*N matrix is given with input red or black.You can move horizontally, vertically or diagonally. If ...

  10. java俄罗斯方块游戏代码

    java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...

随机推荐

  1. 使用MR求解多个矩阵的乘积之后

    首先介绍涉及到的知识点,如下: 1)value的类型是IntArrayWritable,将整型数组值取出的方法有两种. a.其一,就是使用value的toArray()方法,返回值是一个Object ...

  2. Android中的动态字符串的处理

    1.效果显示 2. MainAcitivity.java package com.example.app2; import android.support.v7.app.AppCompatActivi ...

  3. .NET反编译

    http://www.cnblogs.com/powertoolsteam/archive/2011/01/05/1926066.html

  4. UML及其StarUML介绍

    http://blog.csdn.net/monkey_d_meng/article/details/6005764 http://www.uml.org.cn/oobject/200901203.a ...

  5. 图解http读书笔记

    以前对HTTP协议一知半解,一直不清楚前端需要对于HTTP了解到什么程度,知道接触的东西多了,对于性能优化.服务端的配合和学习中也渐渐了解到了HTTP基础的重要性,看了一些大神对HTTP书籍的推荐,也 ...

  6. Docker实践1:Virtualbox安装Oracle Enterprise Linux R6 U5

    先下载OracleLinux-R6-U5-Server-x86_64-dvd.iso文件,然后打开virtualbox 因为weblogic docker镜像都比较大,因此最好容量最好大一点,采用30 ...

  7. 定期访问WebLogic Server返回状态的脚本

    在运维过程中,经常要获悉WebLogic Server的状态以便于主动的维护,本文通过weblogic WLST脚本初步设计了一下 脚本大概为2个,一是WLST的py脚本,getStates.py c ...

  8. htmltestrunner解决错误日志出界问题

    扩大背后的区域放大,让它看起来没有出界 .popup_window {    display: none;    position: relative;    left: 0px;    top: 0 ...

  9. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.5.安装oracle11gr2 database 软件与创建数据库

    3.5.安装oracle11gr2 database 软件与创建数据库 3.5.1.安装Oracle 11gr2 Database 以oracle 用户登录到节点一,切换到软件安装目录,执行安装. 在 ...

  10. 一起來玩鳥 Starling Framework(5)Multi-Touch

    這篇來談談Starling的Multi-Touch.前一篇也提到,Multi-Touch一樣是監聽TouchEvent.TOUCH,然後由TouchEvent的e.getTouches()取回多點的資 ...