tic-tac-toe游戏代码
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游戏代码的更多相关文章
- POJ 2361 Tic Tac Toe
		题目:给定一个3*3的矩阵,是一个井字过三关游戏.开始为X先走,问你这个是不是一个合法的游戏.也就是,现在这种情况,能不能出现.如果有人赢了,那应该立即停止.那么可以知道X的步数和O的步数应该满足x= ... 
- 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 ... 
- 【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 ... 
- 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 ... 
- [CareerCup] 17.2 Tic Tac Toe 井字棋游戏
		17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ... 
- python 井字棋(Tic Tac Toe)
		说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ... 
- LeetCode 5275. 找出井字棋的获胜者 Find Winner on a Tic Tac Toe Game
		地址 https://www.acwing.com/solution/LeetCode/content/6670/ 题目描述A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: ... 
- ACM-Team Tic Tac Toe
		我的代码: #include <bits/stdc++.h> using namespace std; int main() { char a[3][3]; int i,j=0; for( ... 
- Epic - Tic Tac Toe
		N*N matrix is given with input red or black.You can move horizontally, vertically or diagonally. If ... 
- java俄罗斯方块游戏代码
		java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ... 
随机推荐
- 使用MR求解多个矩阵的乘积之后
			首先介绍涉及到的知识点,如下: 1)value的类型是IntArrayWritable,将整型数组值取出的方法有两种. a.其一,就是使用value的toArray()方法,返回值是一个Object ... 
- Android中的动态字符串的处理
			1.效果显示 2. MainAcitivity.java package com.example.app2; import android.support.v7.app.AppCompatActivi ... 
- .NET反编译
			http://www.cnblogs.com/powertoolsteam/archive/2011/01/05/1926066.html 
- UML及其StarUML介绍
			http://blog.csdn.net/monkey_d_meng/article/details/6005764 http://www.uml.org.cn/oobject/200901203.a ... 
- 图解http读书笔记
			以前对HTTP协议一知半解,一直不清楚前端需要对于HTTP了解到什么程度,知道接触的东西多了,对于性能优化.服务端的配合和学习中也渐渐了解到了HTTP基础的重要性,看了一些大神对HTTP书籍的推荐,也 ... 
- Docker实践1:Virtualbox安装Oracle Enterprise Linux R6 U5
			先下载OracleLinux-R6-U5-Server-x86_64-dvd.iso文件,然后打开virtualbox 因为weblogic docker镜像都比较大,因此最好容量最好大一点,采用30 ... 
- 定期访问WebLogic Server返回状态的脚本
			在运维过程中,经常要获悉WebLogic Server的状态以便于主动的维护,本文通过weblogic WLST脚本初步设计了一下 脚本大概为2个,一是WLST的py脚本,getStates.py c ... 
- htmltestrunner解决错误日志出界问题
			扩大背后的区域放大,让它看起来没有出界 .popup_window { display: none; position: relative; left: 0px; top: 0 ... 
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.5.安装oracle11gr2 database 软件与创建数据库
			3.5.安装oracle11gr2 database 软件与创建数据库 3.5.1.安装Oracle 11gr2 Database 以oracle 用户登录到节点一,切换到软件安装目录,执行安装. 在 ... 
- 一起來玩鳥 Starling Framework(5)Multi-Touch
			這篇來談談Starling的Multi-Touch.前一篇也提到,Multi-Touch一樣是監聽TouchEvent.TOUCH,然後由TouchEvent的e.getTouches()取回多點的資 ... 
