Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 提示用户输入时无限循环?_Java_Loops_While Loop - Fatal编程技术网

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

Java 提示用户输入时无限循环?,java,loops,while-loop,Java,Loops,While Loop,我在一个java入门课程中,我们必须创建一个扫雷游戏。我已经完成了大部分比赛。但我有一个问题,我的程序进入了一个疯狂的无限循环 当用户猜错并击中“炸弹”时,游戏正确结束。但是当他们猜对了并且没有击中炸弹时,程序出于某种原因进入无限循环,我不得不终止它 我使用2个数组,一个显示给玩家所有的“?”,另一个有实际的炸弹,我比较猜测并更新玩家板。我觉得问题出在我的GetGuess方法中。不知道为什么这个无限循环只发生在用户做出正确猜测的时候 第一个猜测提示工作正常,如果击中炸弹,游戏结束。如果猜测是正确

我在一个java入门课程中,我们必须创建一个扫雷游戏。我已经完成了大部分比赛。但我有一个问题,我的程序进入了一个疯狂的无限循环

当用户猜错并击中“炸弹”时,游戏正确结束。但是当他们猜对了并且没有击中炸弹时,程序出于某种原因进入无限循环,我不得不终止它

我使用2个数组,一个显示给玩家所有的“?”,另一个有实际的炸弹,我比较猜测并更新玩家板。我觉得问题出在我的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;
       }

}
公共级扫雷艇{
公共静态void main(字符串[]args){
游戏测试=新游戏();
试验.装载炸弹(试验.炸弹板);
test.loadArray(测试板);
试验载荷编号(试验爆炸板);
测试显示板(test.board);
测试显示板(测试爆炸板);
while(test.gameOver==false)//继续让用户猜测,直到赢或输
{
test.getGuess(test.board,test.bombBoard);
测试显示板(test.board);
}
}
公开课游戏{
int-arrayDimension=9;
char[][]board=新字符[arrayDimension][arrayDimension];
char[][]bombBoard=新char[arrayDimension][arrayDimension];
静态布尔博弈;
公共静态void getGuess(char[]]boardArray,char[]]bombBoard)
{
int rowGuess=0,colGuess=0;
扫描仪阅读器=新扫描仪(System.in);
//提示用户猜测
boolean valid=false;//检查猜测是否有效
while(valid==false)
{
试一试{
System.out.println(“输入行号:”);
rowGuess=reader.nextInt();
System.out.println(“输入列号:”);
colGuess=reader.nextInt();
if((rowGuess8)&&(colGuess8))//检查猜测是否有效
{
抛出新的IndexOutOfBoundsException(“此行和列超出范围!”);
}
else if(第8行)
{
抛出新的InputMismatchException(“行选择无效!”);
}
else if(第8列)
{
抛出新的InputMismatchException(“无效列选择!”);
}
else{}
}
捕获(例外e)
{System.out.println(e.getMessage());
}

如果(rowGuess>=0&&rowGuess=0&&colGuess在代码的这一部分中

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

当用户找到所有的空白时,您希望将gameOver设置为真。您应该使用一个变量来跟踪玩家正确猜测的次数,如果这个数字加上炸弹的数量等于棋盘上的瓷砖数量,那么您希望gameOver为真。这将退出外部循环在您的test runner课程中。

除了其他答案之外,我想提醒您以下代码:

if(colGuess >=0 && colGuess<=8) {
    boardArray[rowGuess][colGuess]= '*';               
    reader.close(); // this line is dangerous
    valid = true;
}
并创建一个新方法,在游戏结束时关闭此资源:

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

如果你试图阅读一个封闭的扫描仪,无限循环通常会发生。我还建议你保持它的参考 作为对象变量或至少在主函数中:

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);

希望能有所帮助。

谢谢你的建议。是的,这是扫描仪的问题。你完全正确。我使用扫描仪的这个实现,现在它可以工作了。我不知道扫描仪不能像以前那样重新打开。@Reeggiie这取决于使用的资源。可以重新打开文件,但不能打开使用控制台的标准系统输入。Yo您可以尝试创建一个新的
InputStream
,并使用
System.setIn(InputStream)
将其设置为
System.in
,但避免过早关闭它要容易得多:D.是的,我忘了我还必须考虑这一点。谢谢
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);