Example #1
0
  /** Run the simulation for <code>duration</code> model seconds. */
  public void run(int duration) {
    _agents = new ArrayList<Agent>();
    setup(builder, rows, columns);
    _animator = builder.getAnimator();
    super.addObserver(_animator);
    if (_disposed) throw new IllegalStateException();

    // print out lights and roads.
    for (int i = 0; i < duration; i++) {
      _time++;

      // go through road sources and see if a car needs to be added
      for (int k = 0; k < _sources.size(); k++) {
        if (_time % _sources.get(k).getGeneration() == 0) {
          if (_sources.get(k).forGridLock() > 0) {
            Car car = new Car();
            car.setRoad(_sources.get(k));
            _cars.add(car);
            _agents.add(car);
            _sources.get(k).accept(car);
          }
        }
      }

      Agent[] agents_copy = _agents.toArray(new Agent[0]);
      for (Agent a : agents_copy) {
        a.run(_time);

        if (a instanceof Car) {

          // MOVE THE CARS IF THEY'RE OFF ROADS
          _index = _roads.indexOf((((Car) a).getRoad()));

          // if its on a sink
          if (((Car) a).getKill() == true) {
            _agents.remove(a);
            _roads.get(_index).removeCar((Car) a);
          }
          // if its gone off a road, but its not a sink
          else if (((Car) a).getPosition() < 0) {

            // can't move if the light is red
            Road road = _roads.get(_index);

            // all about stopping for the lights
            if (road.getPattern().equals("RH")
                && intersections[road.getX()][road.getY()].getColorEW().equals(Color.RED)) {
              ((Car) a).setPosition((int) (MP.roadLength - ((Car) a).getLength()));
              ((Car) a).stop(true);
            } else if (road.getPattern().equals("RV")
                && intersections[road.getX()][road.getY()].getColorNS().equals(Color.RED)) {
              ((Car) a).setPosition((int) (MP.roadLength - ((Car) a).getLength()));
              ((Car) a).stop(true);
            } else if (road.getPattern().equals("AH")
                && intersections[road.getX()][road.getY() - 1].getColorEW().equals(Color.RED)) {
              ((Car) a).setPosition((int) (MP.roadLength - ((Car) a).getLength()));
              ((Car) a).stop(true);
            } else if (road.getPattern().equals("AV")
                && intersections[road.getX() - 1][road.getY()].getColorNS().equals(Color.RED)) {
              ((Car) a).setPosition((int) (MP.roadLength - ((Car) a).getLength()));
              ((Car) a).stop(true);
            } else {
              // check for road block
              // don't go over the array size
              if ((_index + 1) < _roads.size()) {
                if (_roads.get(_index + 1).forGridLock() > 0) {
                  _roads.get(_index).removeCar(a);
                  ((Car) a).setPosition(0);
                  _index++;

                  _roads.get(_index).accept((Car) a);
                  ((Car) a).setRoad(_roads.get(_index));
                }
              }
            }
          }
        }
      }
      super.setChanged();
      super.notifyObservers();
    }
  }