Как я могу уменьшить все эти заявления if? - PullRequest
0 голосов
/ 09 декабря 2018

Эта часть кода из школьного задания.Я заставил это работать, но я чувствую, что могу упростить это или по крайней мере заставить это выглядеть более чистым.Однако я пока не смог этого сделать.Какие-либо предложения?(Это из игры в крестики-нолики)

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 голосов
/ 09 декабря 2018

Вот еще один способ сделать это:

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 голосов
/ 09 декабря 2018

А как насчет следующего подхода?Как я вижу, у вас ограниченное количество победителей: board[0][0], board[1][0], board[2][0], board[0][1], board[2][0].Вы можете создать отдельный Predicate для каждого winnger с соответствующим именем.

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.

0 голосов
/ 09 декабря 2018

попробуйте

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

также вы можете увидеть лучшее решение здесь

...