StrategyIrrerIvan.java

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&auml;rke abfragt,</li> 
 *   <li>zu Beginn aus dem Heimathafen kommt,</li> 
 *   <li>etwas im Logbuch vermerkt,</li> 
 *   <li>einen zuf&auml;lligen Kurs einschl&auml;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"; 
    } 
}