繁体   English   中英

如何在棋盘游戏中使用循环编写较短的代码

[英]How can I write shorter code by using loops in a board game

我为“ X”和“ o”游戏编写代码,现在一切正常,但是例如,我想优化代码并使函数更短

我计划了游戏,以便玩家与计算机对战,而计算机的优先级将是首先获胜,然后阻止对手并最终填充空白单元格。因此,我在列上编写了函数,在行上编写了函数,在对角线上编写了函数,并且使用了许多条件,我想知道您是否知道如何通过使用循环或附加功能(例如theat函数)来缩短代码,例如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;
    }

如果要保留数据结构,可以尝试此操作。 只需将行至少组织成一个循环:

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

好的 :-)。 这个如何 ?

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

改编@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;
    }

为了解决对角线问题,我建议您这样做,

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值。 递增的值将在下一次使用变量时使用,这是我在两种情况下的用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM