Added function to generate events for race

- added generateEvents() for creating event into a priority queue
- added iterateEvents() to pull out events when time passing
- changed default velocity to 70 just for testing. Pls change it back after testing

#story[5] #implement
This commit is contained in:
Haoming Yin
2017-03-07 21:30:48 +13:00
parent 17fbb1212d
commit 78dea7daac
2 changed files with 77 additions and 23 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ public class Boat
{
// The name of the team, this is also the name of the boat
private String teamName = null;
private float velocity = 0;
private float velocity = 70; // please set this one to a reasonable num!!!!!, i set it just for testing ;)
public Boat(String teamName) {
this.teamName = teamName;
+61 -7
View File
@@ -1,21 +1,34 @@
package seng302;
import java.util.ArrayList;
import java.util.Random;
import java.util.Collections;
import java.util.List;
import java.util.*;
public class Race {
private ArrayList<Boat> boats;
private ArrayList<Leg> legs;
private PriorityQueue<Event> events;
private int numberOfBoats = 0;
private long startTime = 0;
private int timeScale = 1;
public Race() {
boats = new ArrayList<Boat>();
legs = new ArrayList<Leg>();
this.boats = new ArrayList<Boat>();
this.legs = new ArrayList<Leg>();
// create a priority queue within custom Comparator to order events
this.events = new PriorityQueue<Event>(new Comparator<Event>() {
@Override
public int compare(Event o1, Event o2) {
Long time1 = o1.getTime();
Long time2 = o2.getTime();
// order event asc. by time. if tie appears, then order team
// name alphabetically.
if (time1 != time2) {
return time1.compareTo(time2);
} else {
return o1.getBoat().getTeamName().compareTo(o2.getBoat().getTeamName());
}
}
});
}
/*
@@ -107,6 +120,7 @@ public class Race {
/**
* Gets legs array
*
* @return an array of legs
*/
public ArrayList<Leg> getLegs() {
@@ -114,7 +128,26 @@ public class Race {
}
/**
* Temporary method used to generated all the events.
*/
private void generateEvents() {
//calculate the time for every boat passes each leg, and create an event
for (Boat boat : this.boats) {
long totalDistance = 0;
for (Leg leg : this.legs) {
totalDistance += leg.getDistance();
long time = (long) (1000 * totalDistance / (boat.getVelocity() * this.timeScale));
Event event = new Event(time, boat, leg);
events.add(event);
}
}
}
/**
* Note: this function is useless so far
* Calculates how far a boat has travelled in meter
*
* @param velocity the velocity of boat
* @return a float number of distance the boat has been travelled
*/
@@ -124,15 +157,36 @@ public class Race {
return timeElapse * velocity;
}
/**
* Micheal, here is a demo function shows you how to iterate all events
*/
public void iterateEvents() {
// iterates all events. ends when no event in events.
while (!events.isEmpty()) {
Event peekEvent = events.peek();
long currentTime = System.currentTimeMillis() - this.startTime;
if (currentTime > peekEvent.getTime()) {
// pull out the event
Event nextEvent = events.poll();
// I just simply print it out for testing
System.out.println(nextEvent.getTimeString() + ", " +
nextEvent.getBoat().getTeamName() + " passed " +
nextEvent.getLeg().getMarkerLabel());
}
}
}
/*
Start the race and print each marker with the order
in which the boats passed that marker
*/
public void startRace() {
// record start time.
generateEvents();
this.startTime = System.currentTimeMillis();
iterateEvents();
for (Leg leg : this.legs.toArray(new Leg[legs.size()])){
for (Leg leg : this.legs) {
Boat[] boats = this.getShuffledBoats();
System.out.println("--- " + leg.getMarkerLabel() + " ---");