提示用户输入时无限循环?

时间:2014-11-10 00:12:03

标签: java loops while-loop

我正在介绍java类,我们必须创建一个Mine Sweeper游戏。我的游戏大部分都是完整的。但我有一个问题,我的程序进入一个疯狂的无限循环。

当用户猜错并点击"炸弹"时,游戏正确结束。但当他们正确猜测并且没有击中炸弹时,程序由于某种原因进入无限循环,我必须终止它。

我使用2个2dArrays,一个向玩家显示为全部'?',另一个在其上放置实际炸弹,我将猜测与玩家板进行比较并更新。我觉得问题出在我的GetGuess方法中。不确定为什么这个无限循环只发生在用户做出正确猜测的时候。

第一个猜测提示正常,如果它击中炸弹,游戏结束。如果猜测是好的,程序应该要求另一个猜测,而是 infinte循环打印:

Enter row number: 
null

一遍又一遍直到我终止。任何人都可以帮我弄清楚这是从哪里来的?

这是我的主要和游戏类。

public class MineSweeper {

public static void main(String[] args) {

    Game test = new Game();
    test.loadBombs(test.bombBoard);
    test.loadArray(test.board);
    test.loadNumber(test.bombBoard);
    test.displayBoard(test.board);
    test.displayBoard(test.bombBoard);

    while(test.gameOver==false)//Continue to get user guess until win or lose
    {
    test.getGuess(test.board, test.bombBoard);
    test.displayBoard(test.board);
    }

}


public class Game {

int arrayDimension = 9;
char[][] board = new char[arrayDimension][arrayDimension];
char[][] bombBoard = new char[arrayDimension][arrayDimension];
static boolean gameOver;

public static void getGuess(char[][] boardArray,char[][]bombBoard)
{


    int rowGuess = 0, colGuess=0;
    Scanner reader = new Scanner(System.in);

      //Prompt user guess
       boolean valid = false;//Check if guess is valid
       while(valid == false)
       {
      try{
       System.out.println("Enter row number: ");
       rowGuess= reader.nextInt();

       System.out.println("Enter column number: ");
       colGuess = reader.nextInt();

       if((rowGuess<0||rowGuess>8) && (colGuess<0||colGuess>8))//Check if guess is valid
       {
           throw new IndexOutOfBoundsException("This row and column is out of bounds!");
       }
       else if(rowGuess<0 || rowGuess >8)
       {
           throw new InputMismatchException("Invalid Row Choice!");
       }
       else if(colGuess<0 || colGuess >8)
       {
           throw new InputMismatchException("Invalid Column Choice!");
       }
       else{}
       }
       catch(Exception e)
      { System.out.println(e.getMessage());
      }
        if(rowGuess >= 0 && rowGuess<=8) //Guess was valid, place * at location
        {
            if(colGuess >=0 && colGuess<=8)
            {
                boardArray[rowGuess][colGuess]= '*';               
                reader.close();
                valid = true;
            }
        }
       }
       char answer = bombBoard[rowGuess][colGuess];//check bomb board with user guess
       if(answer == '#')//Bomb, you lose
       {
           boardArray[rowGuess][colGuess]= answer;
           System.out.println("You hit a bomb, game over!");
          gameOver = true;       
       }
       else//correct guess, Place number of bombs around guess, continue guessing.
       {
           boardArray[rowGuess][colGuess]= answer;
          gameOver = false;
       }

}

3 个答案:

答案 0 :(得分:0)

在代码的这一部分

else//correct guess, Place number of bombs around guess, continue guessing.
   {
     boardArray[rowGuess][colGuess]= answer;
     gameOver = false;
   }

当用户找到所有空白区域时,您需要将gameOver设置为true的内容。您应该使用变量来跟踪玩家所做的正确猜测的数量,如果这个数字加上炸弹数量等于棋盘上的牌数,那么您希望游戏结束。这将退出测试运行器类中的外部循环。

答案 1 :(得分:0)

除了其他答案之外,我还要提醒您这段代码:

if(colGuess >=0 && colGuess<=8) {
    boardArray[rowGuess][colGuess]= '*';               
    reader.close(); // this line is dangerous
    valid = true;
}

您需要关闭InputStream的当前System.in。这样做的问题是,只需在下一个Scanner reader = new Scanner(System.in);方法调用上调用getGuess即可重新打开它。这意味着您无法检索更多用户输入,而且reader上的方法调用可能会导致NoSuchElementException

要解决此问题,请将Scanner reader变量移至类字段:

public class Game {
    // ... other fields
    Scanner reader = new Scanner(System.in);

并创建一个新方法,以便在游戏结束时关闭此资源:

public void finishGame() {
    // do other stuff to close the game
    reader.close();
}

您可以这样调用此方法:

while(test.gameOver==false)//Continue to get user guess until win or lose
{
    test.getGuess(test.board, test.bombBoard);
    test.displayBoard(test.board);
}
test.finishGame(); // Game is over, close all resources

答案 2 :(得分:0)

如果您尝试读取已关闭的扫描仪,则会发生无限循环。我还建议你保持对它的反抗 作为对象变量或至少在主函数中:

Scanner reader = new Scanner(System.in);
Game test = new Game();
test.loadBombs(test.bombBoard);
test.loadArray(test.board);
test.loadNumber(test.bombBoard);
test.displayBoard(test.board);
test.displayBoard(test.bombBoard);

希望它有所帮助。