игра Скачки через ООП
Архитектура:
- вызов главного игрового метода
doGame. - внутри метода задание изначальных характеристик.
- основной игровой цикл - метод
isWinner.
Здесь есть ошибка с недостижимостью оператора break. Объясните - почему ? Ну и вообще расскажите, что я делаю не так. Чего не хватает?
//первый класс данного `package`
import java.util.Scanner;
public class racesGame {
public static void main(String[] args) {
racesGame game = new racesGame(); // 1*
game.doGame();
}
public void doGame() {
System.out.println("Введите кол-во лошадок: ");
Scanner scanner = new Scanner(System.in);
Racers[] horses = new Racers[scanner.nextInt()];
System.out.println("Выберите номер скакуна на которого ставите: ");
int chosenOne = scanner.nextInt();
System.out.println("Введите длину забега: ");
int raceDistance = scanner.nextInt();
for (Racers horse : horses) {
horse.setHorses();
} //2*
for (int i = 0; i < horses.length; i++) {
horses[i].name = i;
}
while (isWinner(horses, raceDistance, chosenOne))
for (Racers horse : horses) {
horse.addDist();
}
}
public boolean isWinner(Racers[] horses, int raceDistance, int chosenOne) {
for (int i = 0; i < horses.length; i++) {
if (horses[i].getHorseDistance() >= raceDistance) {
for (int j = 0; j < horses.length; j++) {
for (int k = 0; k < horses.length; k++) {
if (horses[j].getHorseDistance() > horses[k].getHorseDistance()) {
Racers temp = horses[j];
horses[j] = horses[k];
horses[k] = temp;
}
}
}
if (horses[horses.length].name == chosenOne) {
System.out.println("Ваша ставка сыграла");
}
return true;
break;
}
}
return false;
}
}
//второй класс данного package
public class Racers {
int minSpeed;
int maxSpeed;
int horseDistance;
int name;
public int getName() {
return name;
}
public void setName(int name) {
this.name = name;
}
public Racers(int minSpeed, int maxSpeed, int horseDistance) {
this.minSpeed = minSpeed;
this.maxSpeed = maxSpeed;
this.horseDistance = horseDistance;
}
public int getMinSpeed() {
return minSpeed;
}
public void setMinSpeed() {
this.minSpeed = (int) (10 + (Math.random() * 10));
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed() {
this.maxSpeed = (int) (20 + (Math.random() * 40));
}
public int getHorseDistance() {
return horseDistance;
}
public void setHorseDistance(int horseDistance) {
this.horseDistance = horseDistance;
}
public void setHorses() {
this.setMinSpeed();
this.setMaxSpeed();
this.horseDistance = 0;
}
public void addDist() {
this.horseDistance += (this.getMinSpeed() + this.getMaxSpeed()) / 2;
}
}
И вопрос конкретнее: почему недостижим оператор break внутри метода isWinner и правильно ли поставлено условие внутри цикла?
while (isWinner(horses, raceDistance, chosenOne))
И почему код крашится на этапе horse.addDist();?
Ответы (2 шт):
У меня ваш код крашится там, где и должен, то есть на строчке:
for (Racers horse : horses) {
horse.setHorses(); // <- Здесь
}
потому что вы создали массив, заполненного null. После создания массива, его надо инициализировать реальными объектами.
Сделать это можно следующим образом (в вашем случае):
Racers[] horses = new Racers[scanner.nextInt()];
for(int i = 0; i < horses.length; i++) {
horses[i] = new Racers();
}
Далее, вместо метода setHorses() добавьте конструктор по умолчанию в ваш класс Races, с тем же содержимым. Однако, лучше использовать инициализирующий конструктор, который у вас уже есть (добавив аргумент с именем лошади) - так логичнее, чем использовать по-умолчанию (который лучше сделать приватным, или защищенным) который создает сферического коня в вакууме.
Лучше переименовать класс Races в RaceHorse
В вычислении пройденной дистанции не хватает времени S = V*dt, хотя если вы имели в виду единицу времени, то все ок.
Начальное значение дистанции лошади надо инициализировать нулем.