我正在介绍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;
}
}
答案 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);
希望它有所帮助。