【问题标题】:Tic tac toe determining a draw井字游戏决定平局
【发布时间】:2011-11-29 16:51:06
【问题描述】:

我正在创建一个井字游戏,并使用一维数组创建了棋盘。

我有以下代码,但即使棋盘仍然是空的并且可以播放更多动作,它也会返回 true。有人可以告诉我哪里出错了。谢谢

public boolean gameIsADraw() {
    for (int i = 0; i <= 9; i++) {
        if (!board[i].equals(" ")){
            if (gameIsAWin() == false) {

            }
            return true;
        }
        }

    return false;
}

public boolean gameIsAWin() {
        for (String s: winningConditions) {
            if (winningSituations(s.charAt(0), s.charAt(1), s.charAt(2)) == true){
                return true;
            }
        }
        return false;
    }

【问题讨论】:

  • 您是否尝试过正确实现gameIsAWin()?这可能行得通。
  • 请问您可以发布您的完整代码吗?我建议使用 Eclipse 等 IDE 进行调试。
  • 预期的功能是什么?你返回一个布尔值。你想要 true 表示比赛是平局,false 表示有人赢了或者比赛还没有结束?
  • i &lt; 9,因为棋盘有 9 个图块(索引在 [0..8] 中)。
  • @Matthew 已经粘贴了 gameIsAWin() 方法 - 正确的想法

标签: java if-statement for-loop


【解决方案1】:

在上面的cmets中,你确认了三种情况:

  • 如果有人赢得比赛,则返回 false
  • 如果游戏没有结束,返回false
  • 否则比赛为平局,返回真

假设gameIsAWin() 工作正常,您可以单独检查这些情况:

public boolean gameIsADraw() {
    // If someone has won the game, return false
    if (gameIsAWin()) {
        return false;
    }

    // If the game is not over, return false
    for (int i = 0; i <= 9; i++) {
        if (" ".equals(board[i])) {
            return false;
        }
    }

    // Otherwise, the game is a draw, return true
    return true;
}

【讨论】:

  • 先检查一下游戏是否还没有获胜可能是有意义的!]
  • 语句 if (" ".equals(board[i])) { 给出编译错误。我是一个初学者,所以不太清楚为什么......有什么建议吗?
  • 请解释编译错误,它到底说了什么。不过,您可能会更好地使用!board[i].equals(" ")!但是,我刚刚想到,是字符串数组还是 JButtons 数组,还是两者都不是?
  • 如果board[i] 是一个字符串(因此board 是一个字符串[]),这应该可以工作。将其作为" ".equals(board[i]) 而不是board[i].equals(" ") 进行操作可以避免必须明确说明board[i] 可能为空的情况。另请注意,小鸡if (!board[i].equals(" "))相同,因为它会改变您必须返回的条件。
【解决方案2】:

你可以试试:

public boolean gameIsADraw(){
   for(int i = 0; i <= 9; i++){
     if(!board[i].equals(" ") && !gameIsAWin){
        break;
     }else if(i == 9) return true;
   }
 return false; 
}

我认为这会起作用,但我还没有测试过,如果没有,很抱歉。基本原则是,如果任何方格为空,并且有人赢得了比赛,for 循环将中断,导致该方法返回 false。但是,如果 for 循环确实到达了最后一个索引,则它们必须是平局,因此该方法返回 true。

【讨论】:

  • 你需要在 for 循环之后返回,否则将无法编译。认为这可能是一个错字; return false 应该在 for 循环之外吗?
  • @JonathanNewmuis 对此表示感谢。是的,这是一个错字,我现在已将 return false 移到 for 循环之外!
【解决方案3】:

如果你有一个 3x3 的棋盘,那么 3 是你应该搜索的空盒子,就像 3 个盒子是空的一样,那么两个玩家仍然有希望,希望你喜欢我的回答,谢谢。

同样,对于 4x4 板,您应该检查

if(empty>=4) // game left empty

【讨论】:

  • 我认为这种情况会在最后一步之前做出决定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多