public abstract class JRobot2012 extends Pilot
Compared to JRobot2011
, it has these functional modifications:
Pilot.DropperCommand, Pilot.LauncherAmmunition
memoryConsumption
Constructor and Description |
---|
JRobot2012() |
Modifier and Type | Method and Description |
---|---|
protected abstract void |
actions()
Everytime the simulation has progressed, each
Pilot may plan
the next actions. |
protected void |
addDebugArrow(Vector start,
Vector end)
Mit Hilfe dieser Funktion kann ein Bot einen Pfeil auf's Spielfeld
zeichnen.
|
protected void |
addDebugCrosshair(Vector position)
Mit Hilfe dieser Funktion kann ein Bot ein Kreuz auf's Spielfeld
zeichnen.
|
protected void |
addDebugLine(Vector p1,
Vector p2)
Mit Hilfe dieser Funktion kann ein Bot eine Linie auf's Spielfeld
zeichnen.
|
BodyFactory |
getBodyFactory()
determines the favorite supplier this
Pilot is designed for. |
protected Vector[] |
getDirectablePositions()
Liefert die aktuelle Position aller verfügbaren Lenkraketen.
|
protected static double |
getEnergyConsumptionBooster() |
protected static double |
getEnergyConsumptionEngine() |
protected static double |
getEnergyConsumptionRocket() |
protected static double |
getEnergyConsumptionRocketRedirection() |
protected static double |
getEnergyConsumptionScanner() |
protected static double |
getEnergyProduction() |
protected static int |
getFramesPerSecond() |
protected Scan |
getLastScan()
Liefert das Ergebnis des letzten "Scanblitzes".
|
protected static double |
getMaxArenaDiameter()
Zwei Panzer können sich nicht weiter als den zurückgegebenen
Wert voneinander entfernen.
|
protected static double |
getMaxBackwardVelocity() |
protected static double |
getMaxForwardVelocity() |
protected static double |
getMaxForwardVelocityWithBooster() |
protected static Angle |
getMaxScanAperture()
Liefert den größtmöglichen öffnungswinkel des Scanners.
|
protected static double |
getMaxVelocityRocket()
Liefert die maximale Geschwindigkeit der Lenkrakete, die der Panzer verschiessen kann.
|
protected Angle |
getOrientation()
Liefert die aktuelle Ausrichtung des Rumpfes.
Dieser Wert stimmt nicht immer genau mit dem Winkel des Geschwindigkeitsvektors überein, da der Bot auch seitlich rutschen kann (z.B. |
protected Vector |
getPosition()
Liefert die aktuelle absolute Position des JRobot in der Arena.
|
protected Vector |
getProximityScanLaunchable() |
protected static double |
getProximityScannerProjectileRange() |
protected static double |
getRocketDamageFront() |
protected static double |
getRocketDamageRear() |
protected static double |
getRocketDamageSide() |
protected Angle |
getRocketTargetBearing(int idx) |
protected Vector |
getVelocity()
Liefert den aktuellen Geschwindigkeitsvektor des Bots.
|
protected boolean |
isScanFromNow()
Liefert true, wenn der aktuelle Scanwert im Scanner von diesem Frame
stammt, also wenn gilt:
getTime() == getLastScan().timeOfScan Der Scanner hat also in diesem Frame einen Scan durchgeführt. |
protected void |
setAutopilot(Angle direction,
double speed)
Diese Funktion aktiviert den Autopilot, welcher selbständig die
Geschwindigkeiten der beiden Panzerketten regelt.
Der Autopilot fährt so lange mit der angegebenen Geschwindigkeit in die angegebene Richtung, bis diese Funktion mit neuen Daten nochmals aufgerufen wird. |
protected void |
setBodyColor(java.awt.Color newColor)
Hiermit kann eine Farbe eingestellt werden, mit der das Bild des
Rumpfes gefiltert wird.
|
protected void |
setBoost()
Zündet einen mächtigen Booster,
der den JRobot einen Satz nach vorne machen lässt.
|
protected void |
setLaunchRocket(Angle command)
Setzt die gewünschte Schussrichtung des Bots.
|
protected void |
setNameColor(java.awt.Color newNameColor)
Hiermit kann die Farbe des Schriftzuges verändert werden, der in der
Arena über dem Bot angezeigt wird.
|
protected void |
setRocketHeading(int directableNumber,
Angle targetBearing)
Mit dieser Routine können eigene Lenkraketen während des Fluges
umprogrammiert werden.
|
protected void |
setScanAperture(Angle aperture)
Hiermit sagt man dem Scanner, mit welchem Öffnungswinkel der nüchste
"Scanblitz" erfolgen soll.
|
protected void |
setScanDirection(Angle scanDirection)
Setzt die Richtung, in die der nächste "Scanblitz" gehen soll.
|
protected void |
setTurretColor(java.awt.Color newColor)
Hiermit kann eine Farbe eingestellt werden, mit der das Bild des
Panzerturms gefiltert wird.
|
getBodyColor, getCurrentTerrain, getEnergy, getHealth, getIsMovingInWrongDirection, getName, getNameColor, getPosOfBestBot, getTime, getTurretColor, init
clone
protected abstract void actions()
Pilot
may plan
the next actions. This is done through execution of this method.
Knowledge a Pilot
has of the momentary simulation state is
limited to what its Panzer
's sensors may display. Access to
the Panzer's sensor states is best done via the following methods:
getPosition
, getOrientation
,
getVelocity
, getTime
getLastScanResult
, isScanFromNow
,
isScannerUpdated
, getTimeOfLastScan
,
getScanInterval
getTimeOfLastShot
,
getProjectileSpeed
A Pilot
is able to steer its Panzer
. The Panzer
will follow those decisions until the Pilot canges its commands.
Decisions are made by calling the following routines:
setAutopilot
, setTrackspeedLeft
,
setTrackspeedRight
setScanDirection
, setScanAperture
setCannonCommand
setDebugText
, setDebugLines
You may add fields as you like to keep some state through the coarse of
the simulation run. But remember not to waste memory, as the framework
checks the size of your Pilot
's state and may refuse to
permit it to the arena.
You can always use static fields, but that makes the timeline
slider obsolete for debugging.
Also keep track of the computing time you spend, because if you exeed a
certain treshold, the framework may exert punishment upon your Pilot. If
you try to not waste time, there shouldn't be a problem, however.
If your Pilot causes an exception, there will also be some detriment, but
a new instance of your Pilot will be established, so you may be able to
carry on.
Package visibility. Pilots with a partial programming interface may want to have an invisible partial implementation of actions().
protected final void addDebugArrow(Vector start, Vector end)
Pilot
Alle Debug-Linien sind jeweils nur in dem Frame sichtbar, in dem sie hinzugefügt wurden. Für eine längere Anzeige müssen die Linien also in jedem Frame neu gesetzt werden.
protected final void addDebugCrosshair(Vector position)
Pilot
Alle Debug-Linien sind jeweils nur in dem Frame sichtbar, in dem sie hinzugefügt wurden. Für eine längere Anzeige müssen die Linien also in jedem Frame neu gesetzt werden.
position
- die Position des Kreuzesprotected final void addDebugLine(Vector p1, Vector p2)
Pilot
Alle Debug-Linien sind jeweils nur in dem Frame sichtbar, in dem sie hinzugefügt wurden. Für eine längere Anzeige müssen die Linien also in jedem Frame neu gesetzt werden.
p1
- Startpunkt der Liniep2
- Endpunkt der Liniepublic final BodyFactory getBodyFactory()
Pilot
Pilot
is designed for.
Implementor is obligated to add the final modifier.
getBodyFactory
in class Pilot
BodyFactory
protected final Vector[] getDirectablePositions()
Pilot
Die Position im Rückgabearray beschreibt auch die Nummer, mit der die Lenkrakete angesteuert werden kann (beginnend mit 0).
Pilot#setRocketHeading(int, Angle)}
,
Pilot#setMissileTarget(int, Vector)}
protected static final double getEnergyConsumptionBooster()
Hinweis: Der Booster braucht mehr Energie als der Kettenantrieb
protected static final double getEnergyConsumptionEngine()
protected static final double getEnergyConsumptionRocket()
protected static final double getEnergyConsumptionRocketRedirection()
protected static final double getEnergyConsumptionScanner()
protected static final double getEnergyProduction()
Hinweis: Nicht alles davon kann auch gespeichert werden.
protected static final int getFramesPerSecond()
protected final Scan getLastScan()
Pilot
Hinweis: Der "letzte Scan" kann mehr als einen Simulationsschritt zurück liegen,
falls nicht in jedem Simulationsschritt ein Scanbefehl abgesetzt wird.
Überprüfen lässt sich dies mit Scan.timeOfScan
== Pilot.getTime()
.
Pilot.getLastScan()
protected static final double getMaxArenaDiameter()
protected static final double getMaxBackwardVelocity()
protected static final double getMaxForwardVelocity()
protected static final double getMaxForwardVelocityWithBooster()
Das ist mit Sicherheit die wichtigste Konstante im Spiel - zeigt sie doch, dass der Panzer die Rakete überholen könnte, wenn ihm nicht die Energie ausginge.
protected static final Angle getMaxScanAperture()
protected static final double getMaxVelocityRocket()
JRobot2012#setLaunchRocket(Angle)}
protected final Angle getOrientation()
Pilot
protected final Vector getPosition()
Pilot
protected final Vector getProximityScanLaunchable()
protected static final double getProximityScannerProjectileRange()
JRobot2012#getProximityScanLaunchable()}
protected static final double getRocketDamageFront()
protected static final double getRocketDamageRear()
protected static final double getRocketDamageSide()
protected final Angle getRocketTargetBearing(int idx)
idx
- - Raketenindex (Position in getDirectablePositions)getDirectablePositions()
protected final Vector getVelocity()
Pilot
protected final boolean isScanFromNow()
protected final void setAutopilot(Angle direction, double speed)
Pilot
Hinweis: Der Bot kann vorwärts schneller als rückwärts fahren.
direction
- gewünschte Fahrtrichtung - in diese Richtung soll die Front zeigen.speed
- gewünschte Geschwindigkeit im Intervall [-1...+1].
Werte kleiner als Null fahren rückwärtsprotected final void setBodyColor(java.awt.Color newColor)
Pilot
protected final void setBoost()
Pilot
Selbstverständlich kostet das weit mehr Energie als auf dorthin auf gewöhnlichen Ketten zu gelangen, aber so kann der Bot seine Maximalgeschwindigkeit übertreffen.
Der Booster brennt einige Simulationszyklen lang, bevor er automatisch erlischt.
protected final void setLaunchRocket(Angle command)
command
- Zielpunkt in Polarkoordinatenform relativ zum PanzerJRobot2012#setRocketHeading(int, Angle)}
,
JRobot2012#getMaxVelocityRocket()}
,
JRobot2012#getDirectablePositions()}
,
JRobot2012#getRocketBearingTarget(int)}
protected final void setNameColor(java.awt.Color newNameColor)
Pilot
protected final void setRocketHeading(int directableNumber, Angle targetBearing)
Pilot
Eine solche Rakete kann beliebig oft umprogrammiert werden, bis sie zerstört ist.
Das Setzen einer neuen Richtung kostet Energie.
Ist nicht genug Energie vorhanden, hat der Befehl keinen Effekt. Falls
keine Lenkrakete mit dem Panzer verbunden ist, hat der Befehl keinen
Effekt.
Hinweis: Initial fliegt die Lenkrakete ungesteuert in die Richtung, in die sie abgeschossen wurde. Erst, wenn ihr mit dieser Routine ein Lenkbefehl übergeben wird, verändert sie ihren Lauf.
directableNumber
- - Nummer der Rakete, für die der Befehl gelten soll (beginnend
mit 0 - der ältesten Rakete)targetBearing
- - Richtung, in die die Rakete fliegen soll.Pilot#getEnergyConsumptionRocketRedirection()}
,
Pilot#getDirectablePositions()}
protected final void setScanAperture(Angle aperture)
Pilot
aperture
- Öffnungswinkelprotected final void setScanDirection(Angle scanDirection)
Pilot
Hinweis: Dieser Befehl setzt nur einen Scanblitz ab. Sobald dieser erfolgt ist muss der Auslöser erneut betätigt werden, um weiter zu scannen. So ist also ein Scanblitz pro Simulationszyklus möglich. Bei mehrmaligem Aufruf dieser Methode innerhalb eines Simulationszyklus gilt der letzte Aufruf.
Z.B. Scannen zum linken Bildschirmrand hin:
setScanDirection(new Angle(Math.PI, "radians"));
oder: setScanDirection(LEFT);
Der Radarstrahl wird in die Richtung der eingestellten Scanrichtung ausgesendet und erfasst den Gegner, wenn sich dieser maximal Öffnungswinkel/2 links oder Öffnungswinkel/2 rechts von dieser Richtung befindet.
scanDirection
- gewünschte Scanrichtungprotected final void setTurretColor(java.awt.Color newColor)
Pilot