首页 文章

如何缩小所有这些if语句?

提问于
浏览
1

这部分代码来自学校作业 . 我得到了它的工作,但我觉得我可以简化它或至少让它看起来更干净 . 但是,我还没有这样做 . 有什么建议? (这是来自一个tic tac toe游戏)

if (board[0][0] == board[0][1] && board[0][1] == board[0][2] && board[0][0] != '-') {
    winner = board[0][0];
} else if (board[1][0] == board[1][1] && board[1][1] == board[1][2] && board[1][0] != '-') {
    winner = board[1][0];
} else if (board[2][0] == board[2][1] && board[2][1] == board[2][2] && board[2][0] != '-') {
    winner = board[2][0];
} else if (board[0][0] == board[1][0] && board[1][0] == board[2][0] && board[0][0] != '-') {
    winner = board[0][0];
} else if (board[0][1] == board[1][1] && board[1][1] == board[2][1] && board[0][1] != '-') {
    winner = board[0][1];
} else if (board[0][2] == board[1][2] && board[1][2] == board[2][2] && board[0][2] != '-') {
    winner = board[0][2];
} else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != '-') {
    winner = board[2][0];
} else if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != '-') {
    winner = board[0][0];
}

3 回答

  • 0

    尝试

    if(check(board[0][0],board[0][1],board[0][2]) &&  board[0][2]!='-')
     .....
    
    
    private boolean check(a,b,c){
        return a==b && b==c;
    }
    

    你也可以看到更好的solution here

  • 0

    这是另一种方法:

    int[][] checks = {{0,0,0,1},{1,0,0,1},{2,0,0,1}, // horizontals
                      {0,0,1,0},{0,1,1,0},{0,2,1,0}, // verticals
                      {0,0,1,1},{2,0,-1,1}};         // diagonals
    char winner = '-';
    for (int[] check : checks)
        if ((winner = checkWinner(board, check[0], check[1], check[2], check[3])) != '-')
            break;
    
    private static char checkWinner(char[][] board, int y, int x, int dy, int dx) {
        char c = board[y][x];
        return (board[y + dy][x + dx] == c && board[y + dy * 2][x + dx * 2] == c ? c : '-');
    }
    
  • 0

    以下方法怎么样?我可以看到,你的获胜者数量有限: board[0][0]board[1][0]board[2][0]board[0][1]board[2][0] . 您可以为每个具有适当名称的winnger创建单独的 Predicate .

    Predicate<char[][]> isZeroOneWinner = new Predicate<char[][]>() {
        @Override
        public boolean test(char[][] board) {
            return board[0][1] == board[1][1] && board[1][1] == board[2][1] && board[0][1] != '-';
        }
    };
    

    我认为是多个 if...else 更好 .

相关问题