Структура данных для выражения состояния дороги в игре c - PullRequest
1 голос
/ 18 января 2020

Я хочу создать структуру данных с OOP для эмуляции траффика c ситуации в гоночной игре. Требования приведены ниже:

  1. Каждое транспортное средство может знать, в каком положении полосы движения, какой полосы движения и на каком участке дороги оно движется.
  2. Для каждой дороги , он может знать, сколько транспортных средств на нем, и сколько транспортных средств на каждой полосе на дороге.
  3. (плюс) У каждого транспортного средства есть своя стратегия вождения. Например, некоторым транспортным средствам нравится быстро двигаться, а другим - медленнее.

Я использую java для реализации этой топи c. В настоящее время мои объекты, как показано ниже. Я просто знаю, что для этого могут потребоваться двунаправленные отношения между Vehicle и Road / RoadSection, но я не знаю, как это реализовать.

class Lane {
    List<Vehicle> vehicleDrivingOnMe = new ArrayList<Vehicle>()

}

class RoadSection {

    int roadSectionLengthByKM
    /**
     * Integer: LaneID, example: 0 for overspeed
     */
    Map<Integer, Lane> lanes = new HashMap<Integer, Lane>()
}

class Road {
    List<RoadSection> roadSectionList = new ArrayList<RoadSection>()
}

class Vehicle {
    int drivingSpeedByKM

}

Тогда моя проблема Какие элементы я должен добавить в какой объект для выполнения требований 1 и 2? Любое предложение приветствуется.

1 Ответ

0 голосов
/ 18 января 2020

Для выполнения требования 1 вы можете поддерживать родительские указатели.

class Lane {
    RoadSection roadSection;
    List<Vehicle> vehicleDrivingOnMe = new ArrayList<Vehicle>();

    public void addVehicle(Vehicle vehicle) {
        //Update parent
        vehicle.lane = this;
        //Update the position
        vehicle.position = vehicleDrivingOnMe.size();
        vehicleDrivingOnMe.add(vehicle);
    }
}

class Vehicle {
    Lane lane;
    int drivingSpeedByKM;
    int position;
}

Теперь вы можете получить полосу движения транспортного средства на vehicle.lane.roadSection. Просто обновите родительские указатели соответствующим образом.

Чтобы выполнить требование 2, вы можете реализовать расчет только по времени или кэшировать результаты в поле для объектов в иерархии. Как noOfVechiles. Просто для расчета времени вы можете найти что-то вроде этого.

class Road {
    List<RoadSection> roadSectionList = new ArrayList<RoadSection>();

    public long getVehicles() {
        long count = 0;
        for (RoadSection section : roadSectionList) {
            for (Integer laneId : section.lanes.keySet()) {
                count += section.lanes.get(laneId).vehicleDrivingOnMe.size();
            }
        }
        return count;
    }

    public long getVehicles(int laneId) {
        long count = 0;
        for (RoadSection section : roadSectionList) {
            Lane lane = section.lanes.get(laneId);
            count += lane == null ? 0 : lane.vehicleDrivingOnMe.size();
        }
        return count;
    }
}
...