【问题标题】:Tic Tac Toe checking winner in boolean method布尔方法中的井字游戏检查获胜者
【发布时间】:2017-11-17 19:55:16
【问题描述】:

我正在玩一个用户玩电脑的井字游戏。用户总是 X,计算机是 O。我编写了代码来检查每一行、每一列和对角线,看看用户或计算机是否获胜。如果两者都不是,那么它只会打印错误。如果用户赢了“人类玩家赢”或计算机赢了“计算机赢”,我希望游戏打印出来。我只是不知道如何将它添加到布尔方法中。

public static boolean checkWin()
{
    //checks for human win
    if ("X".equals(board[0][0]) && "X".equals(board[0][1]) && "X".equals(board[0][2]))
        return true;
    else if ("X".equals(board[1][0]) && "X".equals(board[1][1]) && "X".equals(board[1][2]))
        return true;
    else if ("X".equals(board[2][0]) && "X".equals(board[2][1]) && "X".equals(board[2][2]))
        return true;
    else if ("X".equals(board[0][0]) && "X".equals(board[1][0]) && "X".equals(board[2][0]))
        return true;
    else if ("X".equals(board[0][1]) && "X".equals(board[1][1]) && "X".equals(board[2][1]))
        return true;
    else if ("X".equals(board[0][2]) && "X".equals(board[1][2]) && "X".equals(board[2][2]))
        return true;
    else if ("X".equals(board[0][0]) && "X".equals(board[1][1]) && "X".equals(board[2][2]))
        return true;
    else if ("X".equals(board[0][2]) && "X".equals(board[1][1]) && "X".equals(board[2][0]))
        return true;
    //checks if computer has won
    else if ("O".equals(board[0][0]) && "O".equals(board[0][1]) && "O".equals(board[0][2]))
        return true;
    else if ("O".equals(board[1][0]) && "O".equals(board[1][1]) && "O".equals(board[1][2]))
        return true;
    else if ("O".equals(board[2][0]) && "O".equals(board[2][1]) && "O".equals(board[2][2]))
        return true;
    else if ("O".equals(board[0][0]) && "O".equals(board[1][0]) && "O".equals(board[2][0]))
        return true;
    else if ("O".equals(board[0][1]) && "O".equals(board[1][1]) && "O".equals(board[2][1]))
        return true;
    else if ("O".equals(board[0][2]) && "O".equals(board[1][2]) && "O".equals(board[2][2]))
        return true;
    else if ("O".equals(board[0][0]) && "O".equals(board[1][1]) && "O".equals(board[2][2]))
        return true;
    else if ("O".equals(board[0][2]) && "O".equals(board[1][1]) && "O".equals(board[2][0]))
        return true;
    else
        //it's a tie
        return false;
}

【问题讨论】:

  • 我建议你编写另一种方法,它首先调用checkWin()。然后根据返回的结果打印出一条消息。不要修改checkWin()打印消息
  • 虽然打印赢取的人/计算机可以放在那里,但它可能更适合放在不同的位置。您为什么要专门将其放入该方法中?我建议保持方法尽可能简单,在这种情况下保持checkWin 方法只检查胜利
  • 另外,您的逻辑存在缺陷 - 这似乎假设唯一可能的板配置是“有人赢了”和“它是平局”,这绝对是不是是的。
  • 我看到的另一个问题是:如果有人赢了,它会说真,只有平局才会说假。编辑:错字和对@EJoshuaS 表示感谢,因为相同的评论
  • 想一想:如果您在玩家将其符号放入移动后检查某人是否获胜,那么显然获胜者就是做出该移动的人。

标签: java


【解决方案1】:

在轮到人类之后,拨打checkWin。如果返回 true,则打印“human won”消息并结束游戏。

轮到电脑后,拨打checkWin。如果返回 true,则打印“计算机获胜”消息并结束游戏。

如果发生了 9 个动作并且 checkWin 没有返回 true,则游戏是平局。

【讨论】:

    【解决方案2】:

    一般的经验法则是每个方法都应该做一件事并做好。在这种情况下,checkWin() 就像它的名字所暗示的那样:它检查人类或计算机是否获胜。如果您添加代码来打印消息,那么它应该是真实的,那么它应该被称为checkWinAndPrintWinner()。现在很明显,您正在尝试在函数中做两件事。相反,您应该编写另一个名为 printWinner() 的方法,该方法调用 checkWin(),然后打印相应的消息。

    【讨论】:

      【解决方案3】:

      虽然我同意其他说方法应该做一件事的答案,但如果你想这样做,你可以创建一个类,Result

      public class Result{
          boolean win;
          String message;
      }
      

      并返回结果而不是布尔值

      public static Result checkWin()
      {
          Result result = new Result();
          if ("X".equals(board[0][0]) && "X".equals(board[0][1]) && "X".equals(board[0][2])){
              result.win = true;
              result.messsage = "Computer won";    
          }
          ...
      
      
          return result;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多