如何通过在棋盘游戏中使用循环来编写更短的代码

时间:2017-05-12 16:10:00

标签: java computer-science

我为“X”和“o”游戏编写代码现在一切正常但我想优化我的代码并缩短我的功能,例如

我策划了游戏,所以玩家与计算机对战,计算机的优先级将首先获胜,然后阻挡对手并最终填满空单元格 所以我写了一个函数到列,函数用于行和函数的对角线,并使用了很多条件 我想知道你是否知道如何通过使用循环或者使用其他函数来缩短代码 例如,theat函数检查计算机是否可以连续3次获胜

    public static  boolean ComuterrowWin(char [][] board){
        if((board[0][0]=='O' && board[0][1]=='O') && board[0][2]!='X'){
            board[0][2]='O'; return true;}
        else if((board[0][1]=='O' && board[0][2]=='O') && board[0][0]!='X'){
            board[0][0]='O'; return true;}
        else if((board[0][0]=='O' && board[0][2]=='O') && board[0][1]!='X'){
            board[0][1]='O'; return true;}
        else if((board[1][0]=='O' && board[1][1]=='O') && board[1][2]!='X'){
            board[1][2]='O'; return true;}
        else if((board[1][1]=='O' && board[1][2]=='O' && board[1][0]!='X')){
            board[1][0]='O'; return true;}
        else if((board[1][0]=='O' && board[1][2]=='O') && board[1][1]!='X'){
            board[1][1]='O'; return true;}
        else if((board[2][0]=='O' && board[2][1]=='O') && board[2][2]!='X'){
            board[2][2]='O'; return true;}
        else if((board[2][1]=='O' && board[2][2]=='O') && board[2][0]!='X'){
            board[2][0]='O'; return true;}
        else if((board[2][0]=='O' && board[2][2]=='O') && board[2][1]!='X'){
            board[2][1]='O'; return true;}
        return false;
    }

4 个答案:

答案 0 :(得分:2)

如果您想保留数据结构,可以试试这个。只需将行至少组织成一个循环:

public static  boolean ComuterrowWin(char [][] board){
    for (int row=0; row<=2; row++) {
        if((board[row][0]=='O' && board[row][1]=='O') && board[row][2]!='X'){
            board[row][2]='O'; return true;}
        if((board[row][1]=='O' && board[row][2]=='O') && board[row][0]!='X'){
            board[row][0]='O'; return true;}
        if((board[row][0]=='O' && board[row][2]=='O') && board[row][1]!='X'){
            board[row][1]='O'; return true;}
    }
    return false;
}

答案 1 :(得分:2)

好的:-)。这个怎么样?

public static  boolean ComuterrowWin(char [][] board){
    for (int row=0; row<=2; row++) {
        for (int col=0; col<=2; col++) {
            if((board[row][(col+1)%3]=='O' && board[row][(col+2)%3]=='O') && board[row][col]!='X'){
                board[row][col]='O'; return true;}
        }
    }
    return false;
}

答案 2 :(得分:1)

改编@galcoholic的回答,怎么样,

public static  boolean ComuterrowWin(char [][] board){
        int[][] win = {{0, 1, 2}, {1, 2, 0}, {0, 2, 1}};
        for (int row = 0; row < 3; row++) {
            for(int i = 0; i < 3; i++){
                if((board[row][win[i][0]]=='O' && board[row][win[i][1]]=='O') && board[row][win[i][2]]!='X'){
                    board[row][win[i][2]]='O';
                    return true;}
            }
        }
        return false;
    }

答案 3 :(得分:0)

对于对角线问题,我建议你这样做,

public static  boolean ComdiagonalgWin(char [][] board){

        // For main diagonal, x_index = y_index
        for(int row = 0; row < 3; row++){
            if((board[row % 3][row % 3] == 'O' && board[(row + 1) % 3][(row + 1) % 3]=='O') && board[(row + 2) % 3][(row + 2) % 3]!='X')
                board[(row + 2) % 3][(row + 2) % 3] = 'O'; return true;
        }
        // For other diagonal, x_index + y_index = 2(or the number of rows you have - 1)
        for(int row = 0, col = 2; row < 3 && col >= 0; row++, col--){
            if((board[row % 3][col % 3] == 'O' && board[(row + 1) % 3][(col + 1) % 3]=='O') && board[(row + 2) % 3][(col + 2) % 3]!='X')
                board[(row + 2) % 3][(col + 2) % 3] = 'O'; return true;
        }

        return false;
    }

您可以看到后增量运算符首先在增量位置使用值 unincremented ,然后发生增量。递增的值将用于下一次使用变量,这是我在两种情况下都是这样做的。