JAVA实现分析井字游戏胜负

JAVA实现分析井字游戏胜负

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.
}