我正在制作一个非常基本的战舰游戏。与真实物体不同,该程序会生成三个从0到6的随机整数。然后,玩家必须通过输入整数来猜测飞船的位置。
我是Java的初学者,刚刚简要介绍了抛出异常和try / catch。
因此,该程序现在是:
public class digitBattleShips {
static int choice;
int playerScore;
int shipLoc1;
int shipLoc2;
int shipLoc3;
Random rand = new Random();
static Scanner input = new Scanner(System.in);
public void digitBattleShipsGame() {
shipLoc1 = rand.nextInt(7);
shipLoc2 = rand.nextInt(7);
shipLoc3 = rand.nextInt(7);
System.out.println(
"Welcome to digit BattleShips! In this game, you will choose a
number from 0 to 6. There are 3 ships to destroy, if you get them
all, you win");
while (playerScore != 3) {
System.out.println("Choose a number from 0 to 6");
playerChoice();
if (choice == shipLoc1 || choice == shipLoc2 || choice == shipLoc3) {
System.out.println("KABOOOOOOM!");
playerScore++;
} else {
System.out.println("Sploooosh...");
}
}
System.out.println("HURRRAAAAAAY you win");
}
public static void playerChoice() {
try {
choice = (int) input.nextInt();
while (choice<0 || choice>6) {
System.out.println("Error. You have to choose a number from 0 to 6");
playerChoice();
} }
catch (InputMismatchException ex) {
System.out.println("Invalid input! You have to enter a number");
playerChoice();
}
}
public static void main(String[] args) {
digitBattleShips digit = new digitBattleShips();
digit.digitBattleShipsGame();
}
}
此刻,这是发生的事情:
1)如果玩家选择0到6之间的整数,则while循环会按预期工作,并将持续到玩家击中shipLoc1,shipLoc2和shipLoc3代表的三艘船为止。
2)如果播放器选择大于或小于0和6的数字,则会显示错误,并且提示播放器再次输入其他内容。按预期工作。
3)如果玩家选择了字符,字符串,浮点数等,则抛出异常,但不允许玩家再次更改其输入。
我认为创建一个专门设计的方法(在代码中命名为playerChoice())以允许输入进行分类,因此,在引发异常之后,此方法将再次激活,以便玩家可以选择另一个数字。但是,从我有限的理解来看,确实看起来是存储了无效选择,因此,当调用此方法时,由于无效选择始终存在,因此会自动再次引发异常。然后,将创建一个引发异常的无限循环。
想法是,如果前面的输入无效(即不是整数),则允许另一输入,这样3)的操作方式与2)相同
我认为我在这里面临的困惑可能是因为我放置了while和try / catch技术。请提供一些指导以及如何防止3)发生
答案 0 :(得分:2)
这就是我要做的:
public static void playerChoice()
{
try
{
String inStr = input.nextLine();
int inInt = Integer.parseInt(inStr); // throws exception.
if (inInt < 0 || inInt > 6) // If number out of range, try again.
{
System.out.println("Error. You have to choose a number from 0 to 6");
playerChoice();
}
else
{
choice = inInt;
}
}
catch (NumberFormatException ex) // If exception, try again.
{
System.out.println("Invalid input! You have to enter a number");
playerChoice();
}
}
我将不再依赖Scanner.nextInt()
,而是先将输入读取为String(因为此步骤不涉及解析),然后使用Integer.parseInt()
进行手动解析。通常,将读取/获取与转换/解析分开是一个好习惯。
答案 1 :(得分:1)
在进行一些谷歌搜索之后,看起来好像在抛出异常之后并没有清除输入(请参见How does input.nextInt() work exactly?)。
结果,由于您没有调用“ input.next();”,因此它将继续读取相同的输入,意识到它不是整数并抛出异常。
解决方案:
try {
choice = (int) input.nextInt();
while (choice<0 || choice>6) {
System.out.println("Error. You have to choose a number from 0 to 6");
playerChoice();
} }
catch (InputMismatchException ex) {
System.out.println("Invalid input! You have to enter a number");
input.next();
playerChoice();
}