/** 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(); } }