Мне нужно сделать симулятор на Java, который будет имитировать езду на машине по шоссе. На трассе должно быть 3 полосы движения, в каждой полосе находятся автомобили с постоянной скоростью. На этой трассе есть один агент, который должен проехать и не врезаться в другую машину. Подробное описание можно найти в этой статье в разделе 2.5 и на рисунке 5.
Это изображение из упомянутой статьи и показывает внешний вид шоссе:
Моя цель - написать только симулятор (и GUI), а не логика агента. Теперь я хотел бы разработать архитектуру этого симулятора, и здесь мне нужна помощь.
Моя идея, как может выглядеть API агента:
public abstract class BaseAgent {
public abstract void run()
public abstract void onCrash();
}
Агент (автомобиль) на шоссе должен быть потомком этого класса. На каждом шаге симулятор вызывает функцию run ()
, где - логика агентов. В этой функции агент может вызывать такие функции, как:
goLeft();
goRight();
getNearestCarInLane(int lane_no);
getMySpeed();
Итак, на каждом шаге агент может решить, останется ли он на текущей полосе движения или повернет налево или направо. И это все, что может сделать агент.
Итак, это API агентов, но я не знаю, как спроектировать остальную часть симулятора. Моя первая попытка моделировать архитектуру была:
class Agent — descendant of BaseAgent, can ride on highway.
class Highway — stores position of all cars on highway.
class Simulator — creates instance of agent and highway; in every step, call agent’s `run()` and monitors any car crash.
Это не очень хорошая архитектура.В каком классе должны быть методы goLeft ()
, goRight ()
и getNearestCarInLane ()
? Потому что эти методы должны быть внутри класса BaseAgent
, но должны знать положение каждой машины на шоссе. В итоге у меня было что-то вроде этого:
Simulator s = new Simulator();
Highway h = new Highway();
Agent a = new Agent();
s.setAgent(a);
s.setHighway(h);
a.setHighway(h);
h.setAgent(a);
И это ужасно и некрасиво.
Так что мне здесь нужна небольшая помощь более умных людей. Может кто-нибудь дать мне ссылку на книгу, статью, что угодно о симуляторах / архитектуре? Или объясните, что я делаю не так?
Я не программист, и этот проект является частью факультативного курса на моем факультете под названием Программная инженерия .