public abstract class JRobot2014 extends Pilot
Um am Wettbewerb teilnehmen zu können, ist die Voraussetzung, von dieser Klassen abzuleiten. JRobots, die von anderen Klassen ableiten, können leider nicht am Wettbewerb teilnehmen.
actions()
,
Serialized FormPilot.DropperCommand, Pilot.LauncherAmmunition
memoryConsumption
Constructor and Description |
---|
JRobot2014() |
Modifier and Type | Method and Description |
---|---|
protected abstract void |
actions()
In jedem Simulationszyklus plant jeder JRobot seine nächsten Aktionen.
|
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 static double |
getEnergyConsumptionEngine() |
protected static double |
getEnergyConsumptionGrenade() |
protected static double |
getEnergyConsumptionScanner()
Jeder einzelne Scannerblitz verbraucht Energie.
|
protected static double |
getEnergyProductionPerFrame()
In jedem Simulationszyklus erhält der JRobot eine kleine Menge Energie dazu.
|
protected static int |
getFramesPerSecond()
Die physikalische Zeit, die in jeder "Zeitscheibe" vergeht, ist konstant.
|
protected static double |
getGrenadeDamageMax()
Liefert den Schaden, den eine Granate anrichtet.
|
protected static double |
getGrenadeDamageRadius()
Liefert den Radius, in den eine Granate Schaden anrichtet.
|
protected static double |
getGrenadeSpeed()
Liefert die Geschwindigkeit (in Meter pro Sekunde), mit der eine Granate fliegt.
|
protected static double |
getGrenadeTriggerRadius()
Liefert den Schaden, den eine Granate anrichtet.
|
protected static double |
getJRobotLength()
Anhand dieser Länge können Größen in der Arena abgeschätzt werden.
|
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 Angle |
getMaxScanAperture()
Liefert den größtmöglichen Öffnungswinkel des
Scanners.
|
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 ProximityScan |
getProximityScan()
Das Näherungsradar kann -anders als der Scanner- heranfliegende und
auf dem Boden liegende Objekte erkennen; kurzum alles, was der JRobot verschießen kann.
|
protected static double |
getProximityScannerGroundRange() |
protected static double |
getProximityScannerProjectileRange() |
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 am Anfang dieses Frames 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 |
setLaunchProjectileCommand(Angle command,
double range)
Dies ist der "Abzugsknopf" für das Geschütz.
|
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 |
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()
Das Wissen eines JRobot �ber den momentanen Zustand der Simulation ist begrenzt durch die Dinge, die er aus seinen Sensoren auslesen kann. Sensoren sind generell alle solchen Methoden, die mit get... beginnen:
Pilot.getTime()
, Pilot.getEnergy()
,
getEnergyProductionPerFrame()
getPosition()
, getOrientation()
,
getVelocity()
, getEnergyConsumptionEngine()
,
getLastScan()
, isScanFromNow()
, Pilot.getScanAperture()
,
getProximityScan()
getProximityScannerProjectileRange()
, getProximityScannerGroundRange()
getEnergyConsumptionScanner()
getGrenadeSpeed()
,
getEnergyConsumptionGrenade()
Ein JRobot kann Aktionen planen, die dann im nächsten Simulationszyklus eine Auswirkung haben. Aktionen sind generell alle solchen Methoden, die mit set... beginnen:
setScanDirection(Angle)
,
setScanAperture(Angle)
setLaunchProjectileCommand(Angle, double)
setAutopilot(Angle, double)
,
setBoost()
addDebugArrow(Vector, Vector)
,
addDebugCrosshair(Vector)
, addDebugLine(Vector, Vector)
setBodyColor(Color)
, setTurretColor(Color)
,
setNameColor(Color)
Im Package jrobots.utils stehen einige Hilfsklassen zur Verfügung, die frei verwendet werden können.
Zur Klasse des Bots können beliebig Attribute hinzugefügt werden.
Die gesetzten Werte dieser Attribute sind dann in allen folgenden
Simulationszyklen verf�gbar.
Beispiel:
private Angle scanDir = Angle.EAST;
protected void actions() {
scanDir = scanDir.add(getMaxScanAperture());
setScanDirection(scanDir);
setScanAperture(getMaxScanAperture());
}
Es ist möglich, static Felder zu verwenden, allerdings führt das dazu, dass der Zeitschieber zum Debuggen nicht mehr benutzt werden kann. Also besser keine statischen Felder verwenden.
Laufzeit- und Speicherverbrauch werden vom Framework beobachtet.
Wird ein sinnvoller Betrieb des Frameworks dadurch
übermäßig eingeschränkt,
kann der verursachende Bot vom Wettbewerb ausgeschlossen werden.
Laufzeitfehler werden vom Framework abgefangen und der Bot neu gestartet.
protected final void addDebugArrow(Vector start, Vector end)
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)
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)
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 static final double getEnergyConsumptionEngine()
protected static final double getEnergyConsumptionGrenade()
protected static final double getEnergyConsumptionScanner()
protected static final double getEnergyProductionPerFrame()
protected static final int getFramesPerSecond()
In jeder Zeitscheibe wird ein Mal die actions()-Methode aufgerufen.
Dieser Wert ist hilfreich, wenn man den zeitlichen Abstand zwischen zwei Aufrufen der actions()-Methode wissen muss.
protected static final double getGrenadeDamageMax()
protected static final double getGrenadeDamageRadius()
protected static final double getGrenadeSpeed()
Die Granate fliegt mit konstanter Geschwindigkeit, bis sie ihr Ziel erreicht hat.
Die Geschwindigkeits des Bots, von dem sie abgefeuert wurde, beeinflusst die Granate nicht.
protected static final double getGrenadeTriggerRadius()
protected static final double getJRobotLength()
protected final Scan getLastScan()
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 Angle getMaxScanAperture()
protected final Angle getOrientation()
protected final Vector getPosition()
protected final ProximityScan getProximityScan()
Liefert die Position der nächsten Minengranate, oder null, falls sich kein entsprechendes Objekt in Reichweite des Näherungsradars befindet.
Eigene Granaten werden nur dann erfasst, wenn sie bereits auf dem Boden liegen und scharf gemacht sind.
Die Benutzung des Näherungsradars kostet keine Energie.
protected static final double getProximityScannerGroundRange()
#getProximityScan()}
protected static final double getProximityScannerProjectileRange()
#getProximityScan()}
protected final Vector getVelocity()
protected final boolean isScanFromNow()
protected final void setAutopilot(Angle direction, double speed)
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)
protected final void setBoost()
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 setLaunchProjectileCommand(Angle command, double range)
Ist schon ein - noch nicht ausgeführter - Feuerbefehl vorhanden,
dann wird dieser überschrieben.
Das Drücken des Abzugs hat keinen Einfluss auf den Nachladevorgang der Kanone. Sobald sie nachgeladen ist, wird auf das zu diesem Zeitpunkt aktuelle Ziel geschossen.
Hinweis: Dieser Befehl setzt nur einen Befehl ab. Sobald dieser ausgeführt ist muss der Auslöser erneut betätigt werden, um ein weiteres Mal zu feuern. So ist also maximal ein Schuss pro Simulationszyklus möglich.
command
- Zielpunkt in Polarkoordinatenform relativ zur Position des Bots.
Der Winkel ist dabei unabhängig davon in welche Richtung der Rumpf zeigt.range
- Entfernung, bei der das Projektil einschlagen sollPilot#setLaunchProjectileCommand(Angle)
protected final void setNameColor(java.awt.Color newNameColor)
protected final void setScanAperture(Angle aperture)
aperture
- Öffnungswinkelprotected final void setScanDirection(Angle scanDirection)
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)