package de.thewayout.o8.strategy.objectfab; import de.thewayout.o8.api.AbstractStrategy; import de.thewayout.o8.api.Course; import de.thewayout.o8.api.IBoat; import de.thewayout.o8.api.IDiceCup; import de.thewayout.o8.api.IMission; import de.thewayout.o8.api.Position; import de.thewayout.o8.api.Wind; /** * Beispielklasse einer Strategie für TheWayOut 2008. * Demonstriert wird, wie man * <ul> * <li>ankert,</li> * <li>die Windstärke abfragt,</li> * <li>zu Beginn aus dem Heimathafen kommt,</li> * <li>etwas im Logbuch vermerkt,</li> * <li>einen zufälligen Kurs einschlägt,</li> * <li>die verstrichene Zeit und die Timeticks abfragt und</li> * <li>wieder zum Heimathafen findet</li> * </ul> * * Randbemerkung: Der Name der Strategie ist an den Film "Jagd auf Roter Oktober" angelehnt. * * @author ObjectFab GmbH * */ public class StrategyIrrerIvan extends AbstractStrategy { /** * Die Hauptmethode jeder TWO08-Strategie, hier wird die Richtung festgelegt, in die * gesegelt werden soll. Wenn der Wind zu stark ist, wird sicherheitshalber geankert. */ public Course calculateCourse(IBoat boat, StringBuffer notes) { Course result = null; // per Default Ankern Position here; IDiceCup diceCup = null; IMission mission = null; if (areNotNull(boat, notes)) { mission = boat.getMission(); if (isWindToStrong(boat)) { // Wenn das Schiff gefaehrdet ist, wird sicherheitshalber geankert. result = null; } else if (isDeparturePeriod(mission)) { // Am Anfang einfach mal wegsegeln, hier z.B. nach Norden (ohne Beachtung der Karte) result = Course.N; notes.append("Departing"); // fuers Logbuch } else if (isTimeToSailHome(mission)) { // Zurueck zum Heimathafen segeln. here = boat.getPosition(); if (isNotNull(here)) { result = here.calculateCourseTo(boat.getHarbourPosition()); notes.append("Sailing Home"); // fuers Logbuch } // no else } else { // Ansonsten (zwischendurch) zufaellige Richtung einschlagen diceCup = boat.getDiceCup(); result = Course.create(diceCup); } } // no else return result; } private boolean isWindToStrong(IBoat boat) { boolean result = false; Wind wind = null; // Wenn der aktuelle Wind staerker als das ist, was das Schiff // aushaelt, dann lieber Anker werfen. Ob es besser ist, frueher // oder spaeter zu ankern, muss jeder Teilnehmer fuer sich selbst // herausfinden. Hier soll nur die API-Verwendung demonstriert // werden. if (isNotNull(boat)) { wind = boat.requestWindForecast(boat.getPosition(), 0 /* jetzt */); result = (isNotNull(wind) && wind.isStrongerThan(boat.getMaxWindToControlTheBoat())); } // no else return result; } private boolean isDeparturePeriod(IMission mission) { boolean result = false; // Zu Beginn muss man erstmal etwas Abstand vom Heimathafen gewinnen. if (isNotNull(mission)) { result = mission.getHourGlassCount()<=IMission.END_OF_DEPARTURE_PERIOD; } // no else return result; } private boolean isTimeToSailHome(IMission mission) { boolean result = false; // Nach der Haelfte der Timeticks bzw. der Rechenzeit wird auf Heimatkurs gesegelt. if (isNotNull(mission)) { result = (mission.getHourGlassCount() > (IMission.END_OF_PERIOD_TO_COME_HOME / 2)) || (mission.getMilliSecondsUsed() > (IMission.MAX_MILLISECONDS / 2)) ; } // no else return result; } /** * {@inheritDoc} */ public String getName() { return "IrrerIvan"; } /** * {@inheritDoc} */ public String getParticipantLogin() { return "objectfab"; } /** * {@inheritDoc} */ public String getParticipantEmail() { return "objectfab@thewayout.de"; } /** * {@inheritDoc} */ public String getParticipantFirstName() { return "ObjectFab"; } /** * {@inheritDoc} */ public String getParticipantSurname() { return "GmbH"; } }