我正在研究 Bert Bates 和 Katya Sierra 关于 Java 的书。
使用 Java 标准库 (API) 中的 ArrayList 类实现游戏(基于海战原理)时,出现错误:
SimpleDotCom 类型中的方法 setLocationCells(ArrayList) 不适用于参数 (int[])
游戏本身是这样的:
public class SimpleDotComTestDrive {
public static void main(String[] args) {
//переменная для хранения количества ходов
int numOfGuesses = 0;
//специальный класс, который содержит метод для приема пользовательского ввода.
GameHelper helper = new GameHelper();
SimpleDotCom theDotCom = new SimpleDotCom();
//генерируем случайное число для первой ячейки и используем его для формирования массива ячеек.
int randomNum = (int) (Math.random() * 5);
// Создаем массив для местоположения (три последовательности числа из семи)
int[] locations = {randomNum, randomNum+1, randomNum+2};
//передаем местоположение ячеек(массив).
theDotCom.setLocationCells(locations);//В этой строчке ошибка с вызовом сеттера setLocationCells
//создаем булевую переменную, чтобы проверять в цикле, не закончилась ли игра
boolean isAlive = true;
while(isAlive == true) {
//получаем строку вводимую пользователем
String guess = helper.getUserInput("Введите число");
//проверить полученные данные: сохраняем возвращенный результат в переменную типа String
String result = theDotCom.checkYourself(guess);
//Инкрементируем количество попыток
numOfGuesses++;
//Если да, то присваиваем isAlive значение false (так как не хотим продолжать цикл) и выводим на экран количество попыток
if (result.equals("Потопил")) {
isAlive = false;
System.out.println("Вам потребовалось " + numOfGuesses + " попыток(и)");
}
}
}
}
public class SimpleDotCom {
private ArrayList<Integer> locationCells;
public void setLocationCells(ArrayList<Integer> loc) { //сеттер
locationCells = loc;
}
public String checkYourself(String stringGuess) {
// Создаем переменную для хранения результата, который будем возвращять.
// Присваиваем по умолчанию строковое значение "Мимо"(то есть подразумеваем
// промах).
String result = "Мимо";
//Проверяем содержится ли загаданная пользователем ячейка внутри ArrayList, запрашивая ее индекс.
//Если ее нет в списке, то indexOf() возвращает -1.
int index = locationCells.indexOf(stringGuess);
//Если индекс больше или равен нулю, то загаданная пользователем ячейка определенно
//находится в списке, поэтому удаляем ее.
if (index >= 0) {
locationCells.remove(index);
//Если список пустой, значит, это было попадание
if(locationCells.isEmpty()) {
result = "Потопил";
} else {
result = "Попал";
}
}
return result;
}
}
public class GameHelper {
public String getUserInput(String prompt) {
String inputLine = null;
System.out.print(prompt + " ");
try {
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
inputLine = is.readLine();
if (inputLine.length() == 0)
return null;
} catch (IOException e) {
System.out.println("IOException:" + e);
}
return inputLine;
}
}
像这样替换你的行
请记住,以这种方式创建集合会将其紧密绑定到数组本身。当您尝试更改其大小时,您会遇到问题。在其他情况下,该方法非常适合使用。乍一看这似乎不太合乎逻辑,因为如果我们得到一个集合,那么我们不想依赖它的大小是很合乎逻辑的。但事实上,这避免了愚蠢的转换。毕竟,如果你创建一个数组,你就可以确定它的大小。如果是这样,那么您不应该对绑定到数组大小的集合感到困惑。如果您不知道元素的数量,那么您需要立即创建一个集合并向其中添加元素,而不是创建一个没有人需要的数组来进一步转换它。