使用Java创建战舰的麻烦

时间:2014-10-22 05:29:35

标签: java

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

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

2 个答案:

答案 0 :(得分:3)

这种方法存在缺陷:

  • 如果userGuess与主席[1] [1]匹配,则循环会让您增加numOfHitsOnFrigate两次,然后您将frigateIsAlive更改为false并退出。

  • 如果userGuess与电路板[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. - 你有另一个循环,它不断从用户那里获得输入。那个你没有向我们展示过代码的其他循环是必要的,因为如果没有它,游戏将无法进展。

答案 1 :(得分:1)

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

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

(即你错放了while循环)