1

我想用 OOP 设计一个数据结构来模拟赛车游戏中的交通情况。要求如下:

  1. 每辆车都可以知道它在车道的哪个位置、哪条车道和哪一段路段上行驶。
  2. 对于每条道路,它可以知道有多少车辆在上面,以及道路上的每条车道有多少车辆。
  3. (加)每辆车都有它的驾驶策略。例如,有些车辆喜欢开快,而有些喜欢慢。

我使用java来实现这个主题。目前我的对象如下。Vehicle我只知道这可能需要and 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?任何建议表示赞赏。

4

1 回答 1

0

要满足要求 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;
    }
}
于 2020-01-18T10:08:00.433 回答