/** * Written by Josh Lifton 10MAY2000. * Copyright (c) Josh Lifton 2000. **/ import java.awt.*; import java.util.*; public class Flock { /* FIELDS */ private int numberOfMembers; // Number of critters on each team. private int numberOfTeams; // Number of teams. private Vector members; // The critters. double meanHeading, meanSpeed, meanX, meanY; // Flock averages. double height, width; // The world. (0,0) is in the upper left corner. boolean endFlag; // Indicates if the fight is over. boolean gameOverFlag; // Indicates this flock should be disposed of. private long seed; // The initial random seed used for this Flock. private Random PNG; // Pseudo-random Number Generator. /* CONSTRUCTOR */ public Flock(long s, int size, int teams, double h, double w) { setSeed(s); setNumberOfMembers(size); setNumberOfTeams(teams); setHeight(h); setWidth(w); initializeFlock(); } /* METHODS */ public void moveMembers() { Enumeration e = elements(); Boid boid; Color colorSeen = null; setEndFlag(true); setGameOverFlag(false); setMeanHeading(0.0); setMeanSpeed(0.0); setMeanX(0.0); setMeanY(0.0); while (e.hasMoreElements()) { boid = (Boid) e.nextElement(); if (getNumberOfTeams() > 1 && getEndFlag()) { if (colorSeen == null) { colorSeen = boid.getColor(); } else if (boid.getColor() != colorSeen) { setEndFlag(false); } } boid.senseFlock(this); boid.decide(); boid.move(); checkBounds(boid); addToMomentum(boid); setMeanX(getMeanX() + boid.getX()); setMeanY(getMeanY() + boid.getY()); } setMeanX(getMeanX()/getNumberOfMembers()); setMeanY(getMeanY()/getNumberOfMembers()); if (getNumberOfTeams() == 1) { setEndFlag(false); } if (getEndFlag()) { setGameOverFlag(true); } } private void checkBounds(Boid boid) { if (boid.getX() > width) { boid.setX(boid.getX() - width); } if (boid.getX() < 0) { boid.setX(boid.getX() + width); } if (boid.getY() > height) { boid.setY(boid.getY() - height); } if (boid.getY() < 0) { boid.setY(boid.getY() + height); } } private void addToMomentum(Boid b) { double x = getMeanSpeed()*Math.cos(getMeanHeading()) + b.getSpeed()*Math.cos(b.getHeading()); double y = getMeanSpeed()*Math.sin(getMeanHeading()) + b.getSpeed()*Math.sin(b.getHeading()); double r = Math.sqrt(x*x + y*y); double angle = Math.acos(x/r); if (y < 0) { angle = 2.0*Math.PI - angle; } setMeanSpeed(r); setMeanHeading(angle); } private double calculateMeanX() { Enumeration e = elements(); double sum = 0; while (e.hasMoreElements()) { sum = sum + ((Boid) e.nextElement()).getX(); } return sum/numberOfMembers; } private double calculateMeanY() { Enumeration e = elements(); double sum = 0; while (e.hasMoreElements()) { sum = sum + ((Boid) e.nextElement()).getY(); } return sum/numberOfMembers; } /* UTILITY METHODS */ public void initializeFlock() { Color teamColor; members = new Vector(numberOfMembers*numberOfTeams); for (int team=0; team