【问题标题】:How can I shrink down all of these if statements?如何缩小所有这些 if 语句?
【发布时间】:2019-05-10 07:12:26
【问题描述】:

这部分代码来自学校作业。我让它工作了,但我觉得我可以简化它,或者至少让它看起来更干净。但是,我还不能这样做。有什么建议? (来自井字游戏)

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];
}

【问题讨论】:

  • 尝试对每一行/方向使用方法
  • 你到底是什么意思?

标签: java if-statement conditional simplify


【解决方案1】:

试试

 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

【讨论】:

  • 对不起,我记错了,让我再想想
  • 不,但喜欢......这不会真的帮助我只是代码?
  • 用一个函数看现在,把函数里的代码挪一下就行了
【解决方案2】:

这是另一种方法:

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 : '-');
}

【讨论】:

    【解决方案3】:

    下面的方法怎么样。如我所见,您的获奖者数量有限:board[0][0]board[1][0]board[2][0]board[0][1]board[2][0]。您可以为每个获胜者创建单独的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 更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2020-06-26
      • 2023-02-05
      • 1970-01-01
      相关资源
      最近更新 更多