import java.util.Random;
import java.util.Scanner;
public class MineSweeper {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
boolean playAgain = true;
System.out.println("Welcome to Mine Sweeper!");
while (playAgain) {
final int MIN_SIZE = 3;
final int MAX_SIZE = 20;
final char NO_NEARBY_MINE = ' ';
String errorWidth = "Expected a number from " + MIN_SIZE + " to " + MAX_SIZE + "\nWhat width of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):";
String errorHeight = "Expected a number from " + MIN_SIZE + " to " + MAX_SIZE + "\nWhat height of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):";
System.out.println("What width of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):");
int userWidth = promptUser(scnr, errorWidth, MIN_SIZE, MAX_SIZE);
System.out.println("What height of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):");
int userHeight = promptUser(scnr, errorHeight, MIN_SIZE, MAX_SIZE);
String errorGetRow = "Expected a number from " + 1 + " to " + userWidth + ".";
String errorGetCol = "Expected a number from " + 1 + " to " + userHeight + ".";
int minRowCol = 1;
char[][] mineArray = new char[userHeight][userWidth];
eraseMap(mineArray);
simplePrintMap(mineArray);
System.out.println("row: ");
int row = promptUser(scnr, errorGetRow, minRowCol, userWidth);
System.out.println("column: ");
int column = promptUser(scnr, errorGetCol, minRowCol, userHeight);
mineArray[row-1][column-1] = NO_NEARBY_MINE;
simplePrintMap(mineArray);
System.out.println("Would you like to play again (y/n)?");
String response = scnr.next();
if (response.startsWith("Y") || response.startsWith("y")) {
playAgain = true;
}
else {
playAgain = false;
}
}
System.out.println("Thank you for playing Mine Sweeper!");
}
public static int promptUser(Scanner in, String prompt, int min, int max) {
int userTempVal = 0;
do {
userTempVal = in.nextInt();
if (userTempVal < min || userTempVal > max) {
System.out.println(prompt);
}
}while (userTempVal < min || userTempVal > max);
return userTempVal;
}
public static void eraseMap(char[][] map) {
final char UNSWEPT = '.';
for (int row = 0; row < map.length; row++) {
for (int col = 0; col < map[row].length; col++) {
map[row][col] = UNSWEPT;
}
}
return;
}
public static void simplePrintMap(char[][] map) {
for (int row = 0; row < map.length; row++) {
for (int col = 0; col < map[row].length; col++) {
System.out.print(map[row][col] + " ");
}
System.out.println("");
}
return; //FIXME
}
编辑: 所以我改变了我的代码以使用.equals而不是==,当我输入一个只有一个单词的字符串时,我的代码成功运行,所以“是”。如果我输入一个多个单词的字符串(“我做的”),我仍然会收到错误。键入包含多个单词的字符串会产生错误。当我使用scnr。 next(),它总是编译else语句,即使语句是“Yes I do”,第一个字母是Y.如果我使用scnr。 nextLine()它编译if语句,重新启动循环,打印“地图的宽度......”,然后在输入任何内容之前给出错误。
我主要是指主要方法结尾处的“你想再玩一次”的底部主要方法。我在我的promptUser方法中遇到了一个问题,我希望该方法显示错误消息,如果用户输入除int之外的任何内容,则再次扫描一个int。
答案 0 :(得分:1)
使用response.equals()
代替==
。
==
比较对象的引用,而equals()
则比较字符串的值。
答案 1 :(得分:1)
您遇到此问题,因为您使用revealToggle:
运算符来比较字符串。如果您使用语句==
,那将解决问题,因为这是检查字符串相等性的实际方法。或者您可以使用下面列出的较不详细的方法。
response.substring(0, 1).equals("Y")
只需取字符串的第一个字符,并检查与您想要的任何其他字符的相等性。
答案 2 :(得分:1)
您的代码有2个问题。
使用$('#form').on('ajax:complete', function(e, response){
# todo
})
String
这是错误的,因为它比较了对象引用而不是对象内容。您需要使用==
进行比较。在您的情况下,您甚至可以使用String.equals()
检查您的输入是否以某些内容开头。
在输入中使用String.startsWith()
由于用户只需按String.substring()
即可输入空字符串,因此您无法使用[ENTER]
,否则您将获得String.substring(0,1)
。
要解决上述2个问题,您可以更改以下代码。
String index out of range
为确保下一次阅读准备就绪,我建议在完成当前行的阅读后添加// Read the whole line
String response = scnr.nextLine();
// change to upper case first and check the starting character
playAgain = (response.toUpperCase().startsWith("Y"));
。
e.g。
Scanner.nextLine()