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