下面的代码块应该检查用户输入的坐标是否是船的坐标。该船位于(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;
}


让我知道您是否需要查看代码的任何其他部分以便更好地为我提供帮助。

最佳答案

该方法有缺陷:


如果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.-您还有另一个循环,该循环不断从用户那里获取输入。您尚未向我们展示其代码的其他循环是必要的,因为如果没有它,游戏将无法进行。

09-05 10:02