【问题标题】:Data structure for expressing the traffic condition of a road in game游戏中表示道路交通状况的数据结构
【发布时间】:2020-01-18 04:19:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: java oop data-structures racing


    【解决方案1】:

    要满足要求 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2013-12-08
      相关资源
      最近更新 更多