【问题标题】:Trouble with creating Battleship using Java使用 Java 创建战舰的问题
【发布时间】:2014-10-22 05:29:35
【问题描述】:

下面的代码块应该检查用户输入的坐标是否是船的坐标。这艘船位于 (1,1) 和 (1,2) 的二维数组上。

当我用 while 循环包围 getUserGuess 方法实现时,问题就开始了。循环检查船是否还活着,并不断要求用户输入坐标,直到船沉没。然而,一旦用户输入了任何一对正确的坐标,整艘船就会沉没。

我不知道为什么会这样。一旦我注释掉循环,问题就停止了,但循环是必要的。

方法如下:

public void checkResult(String userGuess) {
    while (frigateIsAlive == true) {
        if (userGuess.equalsIgnoreCase(board[1][1])){
            System.out.println("hit!");
            numOfHitsOnFrigate++;
            board[1][1] = " *";
            createBoard();
        }
        if (userGuess.equalsIgnoreCase(board[1][2])) {
            System.out.println("hit!");
            numOfHitsOnFrigate++;
            board[1][2] = " *";
            createBoard();
        }
        else if (numOfHitsOnFrigate == 2) {
            System.out.println("Enemy frigate has been sunk!");
            frigateIsAlive = false;
            break;
        }
        else {
            System.out.println("miss!");
            // try again
        }
    }
} 

public String getUserGuess() 
{   // takes the users guess

    System.out.println("Choose a coordinate on the board to fire at");
    int x = input.nextInt();                                                        
    int y = input.nextInt();

    String userGuess = board[x][y];
    return userGuess;
}

如果您需要查看代码的任何其他部分以便更好地帮助我,请告诉我。

【问题讨论】:

  • 使用 while (frigateIsAlive) 而不是 while (frigateIsAlive == true)
  • 我相信有别的东西让它进入 numOfHitsOnFrigate 你能打印出numOfHitsonFrigate 的值以确保它正确递增
  • 逻辑有缺陷,这里不需要while,假设userGuessboard[1][1]有好处,如果你进入循环,你只在循环2次后离开它首先if,我很确定这不是你想要的。
  • @KRUKUSA 我刚刚这样做了.. 它正在正确递增。
  • 另外,如果你错过了,你会让自己陷入无限循环..

标签: java


【解决方案1】:

这个方法有缺陷:

  • 如果userGuess 匹配board[1][1],循环将使numOfHitsOnFrigate 增加两次,然后将frigateIsAlive 更改为false 并退出。

    李>
  • 如果 userGuess 与 board[1][2] 匹配,则循环将使您无限增加 numOfHitsOnFrigate 并且您将永远不会退出。

  • 如果userGuess 不匹配,循环将永远不会终止,并继续打印miss! 而不会获得新的输入。

您需要删除循环,因为此方法检查单个userGuess,并更改条件:

public void checkResult(String userGuess) {
        if (userGuess.equalsIgnoreCase(board[1][1])){
            System.out.println("hit!");
            numOfHitsOnFrigate++;
            board[1][1] = " *";
            createBoard();
        } else if (userGuess.equalsIgnoreCase(board[1][2])) {
            System.out.println("hit!");
            numOfHitsOnFrigate++;
            board[1][2] = " *";
            createBoard();
        } else {
            System.out.println("miss!");
            // try again
        }
        if (numOfHitsOnFrigate == 2) {
            System.out.println("Enemy frigate has been sunk!");
            frigateIsAlive = false;
        }
} 

根据你写的 - I surrounded the getUserGuess method implementation with a while loop. - 你有另一个循环不断地从用户那里获取输入。另一个循环(您尚未向我们展示其代码)是必要的,因为没有它,游戏将无法进行。

【讨论】:

  • 我没有其他循环...所以我接受了您的建议并修复了该方法。现在我想知道的是,整个方法是否必须被循环包围?还是应该用循环包围 getUserGuess 方法实现?
  • @Cherry_Developer 但是你说你“用一个while循环包围了getUserGuess方法”。我在您的问题中没有看到任何 getUserGuess 方法。我只看到checkResult
  • @Cherry_Developer 好的,所以看起来您想要一些游戏循环,在其中您将调用 getUserGuess,然后检查该猜测是未命中、命中还是命中沉船。您的 checkResult 方法执行单艘船的检查。如果您有多艘船,则需要调用多个类似的方法,或者一个检查所有船的方法。
  • 我创建了一个游戏类,它的所有方法都按顺序运行,并且 checkResult 方法嵌套在 while 循环中。现在可以了。
【解决方案2】:

你可能想要什么(伪代码):

  • 开始(循环)
  • 请用户猜测
  • 检查猜测结果
  • 沉没 => 停止/不沉没 => 继续开始

(即您放错了while 循环)

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多