JAVA实现分析井字游戏胜负
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import static org.junit.Assert.*;
public class Game
{
Game game = null;
Result result = null;
PrintStream console = null;
static ByteArrayOutputStream bytes = null;
String lineSeparator = System.getProperty("line.separator");
public Result playGame(String s){
String str="";
Result flag=Result.GAMING;//用来表示游戏状态 是X胜, Y胜,无胜,和游戏没结束。开始默认为进行中。
String[] sArray = s.split(","); //打散字符,形式为A1,B1,B2,B3,C3的数组
int k=1; //中间变量
int data[] = new int[9];//通过 9个元素的数组保存棋盘的状态
//存1为X的位置,存2是O的位置,存零是没有占位置。
for(int j=0;j<sArray.length;j++){
if (j%2==0) k=1; else k=2;
//sArray[j].charAt(0)-'A' 提取"A1"这个字符串中的第一个字符与'A'相减,取得所在列的次序
//sArray[j].charAt(1)-'0') 提取"A1"这个字符串中的第二个字符与'0'相减,取得所在行的次序
// 列数*3+行数-1 得到在数组中位置
data[(sArray[j].charAt(1)-'0'-1)*3+(sArray[j].charAt(0)-'A')]=k;
str+=" A B C"+lineSeparator;
for(int i=0;i<9;i++){
if(i==0) str+="1";
if(i==3) str+="2";
if(i==6) str+="3";
if(data[i]==0) str+=" _";
if(data[i]==1) str+=" X";
if(data[i]==2) str+=" O";
if(i==2||i==5||i==8) str+=lineSeparator;
}
}
for (k=0;k<9 ;k++ ) if (data[k]==0) break;
if (k==9) flag=Result.DRAW;//如果数组元素中没有0代表没有位置了。
//分析X胜的情况 a=1的情况
int a=1;
if (data[0]== a && data[1] == a && data[2] == a) flag=Result.X_WIN;
if (data[3] == a && data[4] == a && data[5] == a) flag=Result.X_WIN;
if (data[6] == a && data[7] == a && data[8] == a) flag=Result.X_WIN;
if (data[0] == a && data[3] == a && data[6] == a) flag=Result.X_WIN;
if (data[1] == a && data[4] == a && data[7] == a) flag=Result.X_WIN;
if (data[2] == a && data[5] == a && data[8] == a) flag=Result.X_WIN;
if (data[0] == a && data[4] == a && data[8] == a) flag=Result.X_WIN;
if (data[2] == a && data[4] == a && data[6] == a) flag=Result.X_WIN;
if (flag!=Result.X_WIN) //如果X不胜,分析O是否胜
{
a=2;
if (data[0] == a && data[1] == a && data[2] == a) flag=Result.O_WIN;
if (data[3] == a && data[4] == a && data[5] == a) flag=Result.O_WIN;
if (data[6] == a && data[7] == a && data[8] == a) flag=Result.O_WIN;
if (data[0] == a && data[3] == a && data[6] == a) flag=Result.O_WIN;
if (data[1] == a && data[4] == a && data[7] == a) flag=Result.O_WIN;
if (data[2] == a && data[5] == a && data[8] == a) flag=Result.O_WIN;
if (data[0] == a && data[4] == a && data[8] == a) flag=Result.O_WIN;
if (data[2] == a && data[4] == a && data[6] == a) flag=Result.O_WIN;
}
//把str字符串转化为ByteArrayOutputStream.
bytes=new ByteArrayOutputStream();
bytes.write(str.getBytes(),0,str.getBytes().length);
return flag;//返回 四种状态中的一种
}
public static void main(String[] args)
{
Game game=new Game();
Result result=game.playGame("A1,B1,B2,B3,C3");
test(result);
result = game.playGame("A1,A2,B1,B2,C1");
test(result);
result = game.playGame("C1,A2,C2,B2,C3");
test(result);
result = game.playGame("C1,A2,C2,C3,B2,A3,A1,B1,B3");
test(result);
result = game.playGame("A1,C1,A2,B2,B1,A3");
test(result);
result = game.playGame("A1,A2,B1,B2,C3,C2");
test(result);
result = game.playGame("C1,A2");
test(result);
try{
game.test7();//没有捕捉到异常,就说明是对的。
game.test6();//没有捕捉到异常,就说明是对的。
game.test5();//没有捕捉到异常,就说明是对的。
game.test4();//没有捕捉到异常,就说明是对的。
game.test3();//没有捕捉到异常,就说明是对的。
game.test2();//没有捕捉到异常,就说明是对的。
game.test1();//没有捕捉到异常,就说明是对的。
}catch(Exception e)
{
e.printStackTrace();
}
}
public static void test(Result result){
String str= bytes.toString();
System.out.println(str);
if (result==Result.X_WIN) System.out.println("X Player WINs the game.");
if (result==Result.O_WIN) System.out.println("O Player WINs the game.");
if (result==Result.DRAW) System.out.println("No one WINs.");
if (result==Result.GAMING) System.out.println("Game is not over.");
}
@org.junit.Test
public void test1() throws Exception {
Game game=new Game();
result = game.playGame("A1,B1,B2,B3,C3");
assertEquals(Result.X_WIN,result);
assertEquals(
" A B C"+lineSeparator
+"1 X _ _"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X O _"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X O _"+lineSeparator
+"2 _ X _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X O _"+lineSeparator
+"2 _ X _"+lineSeparator
+"3 _ O _"+lineSeparator
+" A B C"+lineSeparator
+"1 X O _"+lineSeparator
+"2 _ X _"+lineSeparator
+"3 _ O X"+lineSeparator,bytes.toString());
}
@org.junit.Test
public void test2() throws Exception {
Game game=new Game();
result = game.playGame("A1,A2,B1,B2,C1");
assertEquals(Result.X_WIN,result);
assertEquals(
" A B C"+lineSeparator
+"1 X _ _"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X _ _"+lineSeparator
+"2 O _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X X _"+lineSeparator
+"2 O _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X X _"+lineSeparator
+"2 O O _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X X X"+lineSeparator
+"2 O O _"+lineSeparator
+"3 _ _ _"+lineSeparator,bytes.toString());
}
@org.junit.Test
public void test3() throws Exception {
Game game=new Game();
result = game.playGame("C1,A2,C2,B2,C3");
assertEquals(Result.X_WIN,result);
assertEquals(
" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O _ X"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O O X"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O O X"+lineSeparator
+"3 _ _ X"+lineSeparator,bytes.toString());
}
@org.junit.Test
public void test4() throws Exception {
Game game=new Game();
result = game.playGame("C1,A2,C2,C3,B2,A3,A1,B1,B3");
assertEquals(Result.DRAW,result);
assertEquals(
" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O _ X"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O _ X"+lineSeparator
+"3 _ _ O"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O X X"+lineSeparator
+"3 _ _ O"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O X X"+lineSeparator
+"3 O _ O"+lineSeparator
+" A B C"+lineSeparator
+"1 X _ X"+lineSeparator
+"2 O X X"+lineSeparator
+"3 O _ O"+lineSeparator
+" A B C"+lineSeparator
+"1 X O X"+lineSeparator
+"2 O X X"+lineSeparator
+"3 O _ O"+lineSeparator
+" A B C"+lineSeparator
+"1 X O X"+lineSeparator
+"2 O X X"+lineSeparator
+"3 O X O"+lineSeparator,bytes.toString());
}
@org.junit.Test
public void test5() throws Exception {
Game game=new Game();
result = game.playGame("A1,C1,A2,B2,B1,A3");
boolean b = result.equals(Result.O_WIN);
assertEquals(b,true);
//assertEquals(Result.X_WIN,result);
assertEquals(
" A B C"+lineSeparator
+"1 X _ _"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X _ O"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X _ O"+lineSeparator
+"2 X _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X _ O"+lineSeparator
+"2 X O _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X X O"+lineSeparator
+"2 X O _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X X O"+lineSeparator
+"2 X O _"+lineSeparator
+"3 O _ _"+lineSeparator,bytes.toString());
}
@org.junit.Test
public void test6() throws Exception {
Game game=new Game();
result = game.playGame("A1,A2,B1,B2,C3,C2");
assertEquals(Result.O_WIN,result);
assertEquals(
" A B C"+lineSeparator
+"1 X _ _"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X _ _"+lineSeparator
+"2 O _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X X _"+lineSeparator
+"2 O _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X X _"+lineSeparator
+"2 O O _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 X X _"+lineSeparator
+"2 O O _"+lineSeparator
+"3 _ _ X"+lineSeparator
+" A B C"+lineSeparator
+"1 X X _"+lineSeparator
+"2 O O O"+lineSeparator
+"3 _ _ X"+lineSeparator,bytes.toString());
}
@org.junit.Test
public void test7() throws Exception {
Game game=new Game();
result= game.playGame("C1,A2,C2,A1,B2,A3");
assertEquals(Result.O_WIN,result);
assertEquals(
" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 _ _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O _ _"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 _ _ X"+lineSeparator
+"2 O _ X"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 O _ X"+lineSeparator
+"2 O _ X"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 O _ X"+lineSeparator
+"2 O X X"+lineSeparator
+"3 _ _ _"+lineSeparator
+" A B C"+lineSeparator
+"1 O _ X"+lineSeparator
+"2 O X X"+lineSeparator
+"3 O _ _"+lineSeparator,bytes.toString());
}
}
public enum Result{
X_WIN,//X Player WINs the game.
O_WIN,//O Player WINs the game.
DRAW,//No one WINs.
GAMING//Game is not over.
}