Код:
package dragracing;
import java.util.HashMap;
import java.util.Map;
public class Dragracing {
private static Map<Integer, Car> cars = new HashMap<Integer, Car>();
/**
* Длина трассы в метрах
*/
private static final int TRACK_LENGTH = 402;
/**
* Метод сбора списка гонщиков, участвующих в заездах
*/
private static void setCars() {
cars.put(1, new Car(1, "Toyota", "Celica", 6, 250, "Alex"));
cars.put(2, new Car(2, "Dodge", "Viper", 7, 310, "Steve"));
cars.put(3, new Car(3, "Porsche", "911", 9, 320, "Martin"));
cars.put(4, new Car(4, "Dodge", "Challenger", 9, 250, "Andrew"));
cars.put(5, new Car(5, "Toyota", "MR2", 5, 250, "Jim"));
cars.put(6, new Car(6, "Honda", "NSX", 8, 280, "Hiroki"));
cars.put(7, new Car(7, "Chevrolet", "Camaro", 8, 270, "Ricky"));
cars.put(8, new Car(8, "Nissan", "GTR", 8, 310, "Kito"));
cars.put(9, new Car(9, "Lamborghini", "Countach", 8, 300, "Linda"));
cars.put(10, new Car(10, "VAZ", "2107", 8, 200, "Vasiliy"));
}
/**
* Метод, обновляющий текущее состояние автомобиля в заезде: скорость и пройденную дистанцию
*/
private static void refresh(Car car, int time) {
long maxSpeed = Math.round(car.getMaxSpeed()/3.6); //Узнаем максимальную скорость автомобиля в м/с и округлим
long curSpeed = Math.round(car.getVelocity() * time); //Вычислим текущую скорость автомобиля в м/с
if(curSpeed > maxSpeed)
curSpeed = maxSpeed;//Если вычисленная текущая скорость выше максимальной, то текущую делам равной максимальной
car.setRunDistance(car.getRunDistance() + curSpeed > TRACK_LENGTH ? TRACK_LENGTH : car.getRunDistance() + curSpeed);//Обнавляем пройденное расстояние
car.setCurrentSpeed(Math.round(curSpeed*3.6)); //Обновляем текущую скорость
}
/**
* Метод производящий вычисления заездов
*/
public static void main(String[] args) throws InterruptedException {
HashMap<Integer, Car> results = new HashMap<Integer, Car>();
setCars();//Получим список гонщиков, участвующих в заезде
int runNum = 1;//Номер заезда
for(int i = 1; i < cars.size(); i++) {//обходим список участников
Car left = new Car(cars.get(i++));//устанавливаем первого гонщика, i++ что бы обходить список парами
Car right = new Car(cars.get(i));//устанавливаем второго гонщика
System.out.println("Run " + runNum + ": " + left.getDriver() + " on " + left.getManufacturer() + " " + left.getModel() + " vs. " + right.getDriver() + " on " + right.getManufacturer() + " " + right.getModel());
Thread.sleep(3000);
System.out.println("Ready!");
Thread.sleep(1000);
System.out.println("Steady!");
Thread.sleep(1000);
System.out.println("GO!");
boolean run = true;//заезд в процессе
int seconds = 0;//секунд с момента старта
while(run) {
System.out.println("Run " + runNum + ": " + left.getDriver() + " on " + left.getManufacturer() + " " + left.getModel() + " vs. " + right.getDriver() + " on " + right.getManufacturer() + " " + right.getModel());
System.out.println(left.getDriver() + ": " + left.getRunDistance() + " meters, " + left.getCurrentSpeed() + " km/h");
System.out.println(right.getDriver() + ": " + right.getRunDistance() + " meters, " + right.getCurrentSpeed() + " km/h");
Thread.sleep(1000);
seconds++;
if(left.getRunTime() == 0)//если гонщик ещё не финишировал
refresh(left, seconds);//обновим его информацию
if(right.getRunTime() == 0)
refresh(right, seconds);
if(left.getRunTime() > 0 && right.getRunTime() > 0)//если оба гонщика финишировали
run = false;//завершим заезд
if(left.getRunDistance() >= TRACK_LENGTH && left.getRunTime() == 0) {//если гонщик финишировал
left.setRunTime(seconds);//установим его время заезда
results.put(cars.size() - results.size(), left);//добавим в список результатов
}
if(right.getRunDistance() >= TRACK_LENGTH && right.getRunTime() == 0) {
right.setRunTime(seconds);
results.put(cars.size() - results.size(), right);
}
}
runNum++;//обновим номер заезда
}
for(Map.Entry<Integer, Car> set : results.entrySet())//обойдём список результатов
System.out.println(set.getValue().getRunTime() + " seconds: " + set.getValue().getDriver() + " on " + set.getValue().getManufacturer() + " " + set.getValue().getModel());//и выведем на экран
}
}