【问题标题】:How can I write shorter code by using loops in a board game如何在棋盘游戏中使用循环来编写更短的代码
【发布时间】:2017-05-12 16:10:00
【问题描述】:

我为“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;
    }

【问题讨论】:

标签: java computer-science


【解决方案1】:

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

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

【讨论】:

  • 太棒了!我想查看更多选项
【解决方案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;
}

【讨论】:

  • 为什么错了?模运算符只产生所需的数字。对于 col=1,它们将是 2 和 0。
  • 但是没有一个条件有 {2, 0, 1} 作为检查。请参阅 OP 的条件列表为真。第二列在任何地方都不以 2 开头。
  • 对,但是有一个 {0, 2, 1} 检查,并且有 && 运算符它等同于 {2, 0, 1}。条件表示“当前列中没有'O',但其他两个中有'O'”。其他两个的顺序无关紧要。
  • 它失败了,因为它应该为 'O' 'O' 'X' 行失败。这不是赢家。
  • 清除了。该死的,我把最后一个当成==。粗心的错误。谢谢。澄清。只是为了编辑而编辑您的帖子(假/虚拟编辑),我将撤销反对票,因为除非帖子完全被编辑,否则它不允许我投票。
【解决方案3】:

改编@g酒精的回答,这个怎么样,

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){ char[]mainDig= new char [3]; for (int row=0; row&lt;=board.length; row++) { for (int col=0; col&lt;=board.length; col++) { if(row==col){ for (int x=0; x&lt;=board.length; x++) { mainDig[x]=board[row][col]; System.out.println( mainDig); } } } } }
  • @MarcoPolo :那么,您是否要检查对角线是否存储了某些值并检查它们?我的意思是,如果对角线有 board[0][0] = '0', board[1][1] = '0' 和 board[2][2] = 'X' 那么你要检查这两者一次对角线?这是你想要的吗?
  • @MarcoPolo :关于对角线问题,请参阅我的其他答案。此外,我在上面的回答中有一个小的更正。检查一下。
【解决方案4】:

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

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,然后增量发生。增加的值将在下一次使用变量时使用,这在这两种情况下都是如此。

【讨论】:

  • 好的,我试过了,但 Eclipse 显示它超出了数组绑定:“线程“main”java.lang.ArrayIndexOutOfBoundsException 中的异常:”有办法解决它吗?
  • @MarcoPolo :您可能有不同的董事会限制。你能发布代码并告诉我它正在运行 OutOfBoundsException 吗?
  • 棋盘尺寸为 3X3,我认为问题出在第二条对角线,当计算机播放时,他首先尝试填充 row 和 col,然后填充对角线,当我将他挡在 num 3系统抛出异常。我不知道如何在评论中发布代码我已经尝试了很多次,你能给我解释一下吗
  • @MarcoPolo :您可以在此处粘贴代码,创建粘贴然后在此处发布。使用pastebin.com
  • 我尝试过并且工作得很好,但我想以更智能和更短的方式让它变得更聪明pastebin.com/9PbbxYk4
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多