P42-井字游戏-暴力

//井字游戏
/*
* 用字符串数组作为井字游戏的游戏板 board,判断该游戏板有没有可能最终形成。
* 游戏板是一个 3 x 3 数组,由字符 " ",“X” 和 “O” 组成。字符 " " 代表一个空位。
* 两个玩家轮流将字符放入空位,一个玩家执X棋,另一个玩家执O棋
* X和O 只允许放置在空位中,不允许对已放有字符的位置进行填充。
* 当有3个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,board生成
* board就是能不能形成这样的棋盘的意思
* */
public class P42 {
    public static void main(String[] args) {
        System.out.println(validBoard(new String[]{"xxx", "oxo", "o o"}));  //x赢,o棋子比x少1
        System.out.println(validBoard(new String[]{"xxx", "oxo", "o  "}));
    }

    //只有三种结果:x赢,o赢,胜负未分
    /*
    * x赢,有必然条件:x-o = 1,因为是x先手
    * o赢,有必然条件:o-x = 0,因为o是后手
    * 胜负未分:!(x-o=1 || x-o=0)
    * */
    private static boolean validBoard(String[] board) {
        int xCount = 0;     //x棋的数量
        int oCount = 0;
        for(String row : board){
            for(char c : row.toCharArray()){
                if(c == 'x'){
                    xCount++;
                }else if(c == 'o'){
                    oCount++;
                }
            }
        }

        if(xCount != oCount && xCount-oCount!=1){
            return false;
        }

        //x赢得时候,必然是多一个棋的
        if(win(board, "xxx") && xCount-oCount!=1){
            return false;
        }
        //o赢得时候,必然是棋子相等的
        if(win(board, "ooo") && xCount-oCount!=0){
            return false;
        }

        return true;

    }

    public static boolean win(String[] board, String flag){
        for(int i=0; i<3; i++){
            //纵向3连
            if(flag.equals("" + board[0].charAt(i)+board[1].charAt(i)+board[2].charAt(i))){
                return true;
            }

            //横向3连
            if(flag.equals(board[i])){
                return true;
            }
        }

        //对角线
        if(flag.equals("" + board[0].charAt(0)+board[1].charAt(1)+board[2].charAt(2))){
            return true;
        }
        if(flag.equals("" + board[0].charAt(2)+board[1].charAt(1)+board[2].charAt(1))){
            return true;
        }

        return false;
    }
}

 

posted @ 2022-04-11 14:23  YonchanLew  阅读(31)  评论(0)    收藏  举报