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 ...
随机推荐
- java单例支持高并发
单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...
- 显示/隐藏Mac系统中所有的隐藏文件
显示: 在终端输入:defaults write com.apple.finder AppleShowAllFiles YES 隐藏: 在终端输入:defaults write com.apple.f ...
- 关于DNS,你应该知道这些
在互联网时代中,如果要问哪个应用层协议最重要的话,我想答案无疑是DNS.虽然我们每天都享受着DNS服务带来的便利, 却对它往往知之甚少.因此本文就来介绍一下DNS协议的工作流程,真正认识一下这个支撑着 ...
- Matlab中struct的用法
struct在matlab中是用来建立结构体数组的.通常有两种用法: s = struct('field1',{},'field2',{},...) 这是建立一个空的结构体,field1,field ...
- 【java】处理时间字段 在数据库查询的时候只想要年月日,不想要时分秒 ,java中设置时间类型为年月日,java中设置Date中的时分秒为00.00.000
JDK8 中最简单的处理方式: @Test public void dateTest(){ Date now = new Date(); System.out.println(now); // jav ...
- SQL Server 基础 之 CASE 子句
SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS 'Last Digit',-- 求最后一位的值 Position = CASE SalesOrderI ...
- dd-wrt端口映射不出去的解决办法
本人有一个巴法络的WZR-HP-G450H系统自带的固件不好用,但是随机却带了一个官方定制的DD-WRT,于是刷了去,但是今天在做一个FTP的时候突然无论怎么样映射或是做DMZ都不会出去,终于找到解决 ...
- stl之list双向链表容器应用基础
不同于採用线性表顺序存储结构的vector和deque容器.list双向链表中任一位置的元素差值.插入和删除,都具有高效的常数阶算法时间复杂度O(1). 头文件 #include<list> ...
- ubuntu16.04画图软件kolourpaint
1.安装kolourpaint sudo apt-get install kolourpaint4 -y 在里面搜索“kolourpaint”这个软件名.
- mipmap 二
mipmap 之前讲了生成 原理 这个讲下我对性能的理解 mipmap 对性能的影响 包含两方面 minification时,采样多个textel得到1个pixel颜色,如果是mipmap形成相邻两个 ...