====== Robocode ======
[[http://downloads.sourceforge.net/project/robocode/robocode/1.9.2.4/robocode-1.9.2.4-setup.jar|Robocode 1.9.2.4 für Windows]]
==== Spielregeln ====
=== Aufbau ===
Ein Roboter besteht aus folgenden Teilen:
* Fahrwerk
* Turm
* Radar
Fahrwerk und Turm/Radar können unabhängig voneinander bewegt werden. Um Turm und Radar unabhängig voneinander bewegen zu können, muss ein [[http://robocode.sourceforge.net/docs/robocode/robocode/AdvancedRobot.html|AdvancedRobot]] verwendet werden.
=== Energie ===
Beim Start eines Kampfes hat ein Robotes eine Energie von 100.
Ein Roboter verliert/gewinnt Energie bei folgenden Ereignissen:
^ Ereignis ^ +/- ^ Schaden ^
| in eine Wand fahren | - | max(abs(v) * 0.5 - 1, 0) |
| von einem gegnerischen Geschoss getroffen werden | - | 4 * P + 2 * max(P - 1 , 0) |
| von einem Gegner gerammt werden | - | 0.6 |
| Treffen eines Gegners | + | 3 * P |
Dabei steht **v** für die Geschwindigkeit des Roboters und **P** für die Geschosskraft (//bullet power//).
=== Bewegung ===
* robocode.Robot#ahead(double)|ahead(double): Vorwärts fahren
* robocode.Robot#back(double)|back(double): Rückwärts fahren
* robocode.Robot#turnLeft(double)|turnLeft(double): Nach links drehen
* robocode.Robot#turnRight(double)|turnRight(double): Nach rechts drehen
* robocode.Robot#getVelocity()|getVelocity(): Aktuelle Geschwindigkeit in Pixel pro Sekunde
* robocode.Robot#getHeading()|getHeading(): Aktuelle Fahrtrichtung in Grad
* robocode.Robot#getX()|getX(): Aktuelle x-Koordinate des Roboters
* robocode.Robot#getY()|getY(): Aktuelle y-Koordinate des Roboters
* robocode.Robot#getBattleFieldHeight()|getBattleFieldHeight(): Höhe des Spielfelds
* robocode.Robot#getBattleFieldWidth()|getBattleFieldWidth(): Breite des Spielfelds
=== Radar ===
* robocode.Robot#turnRadarLeft(double)|turnRadarLeft(double): Nach links drehen
* robocode.Robot#turnRadarRight(double)|turnRadarRight(double): Nach rechts drehen
* robocode.Robot#getRadarHeading()|getRadarHeading(): Aktuelle Richtung des Radars in Grad
=== Kanone ===
* robocode.Robot#turnGunLeft(double)|turnGunLeft(double): Nach links drehen
* robocode.Robot#turnGunRight(double)|turnGunRight(double): Nach rechts drehen
* robocode.Robot#getGunHeading()|getGunHeading(): Aktuelle Richtung des Radars in Grad
* robocode.Robot#fire(E)|fire(double): Mit angegebener Energie **E** schiessen. Die Geschwindigkeit des Schusses beträgt 20 - 3 * **E**
* robocode.Rules#MIN_BULLET_POWER|Rules.MIN_BULLET_POWER: Minimale Energie eines Schusses (0.1)
* robocode.Rules#MAX_BULLET_POWER|Rules.MAX_BULLET_POWER: Maximale Energie eines Schusses (3)
* robocode.Rules#getBulletSpeed(double)|Rules#getBulletSpeed(E): Geschwindigkeit eines Geschosses mit der angegebenen Energie **E**
=== Gegner scannen ===
Wenn ein Roboter vom Radar erfasst wird, wird die Methode robocode.Robot#onScannedRobot(robocode.ScannedRobotEvent)|onScannedRobot() aufgerufen. Das mitgelieferte robocode.ScannedRobotEvent|ScannedRobotEvent enthält Informationen über den gegnerischen Roboter:
* robocode.ScannedRobotEvent#getBearing()|e.getBearing(): Richtung in Grad, in welcher der gescannte Roboter liegt relativ zur eigenen Fahrtrichtung
* robocode.ScannedRobotEvent#getDistance()|e.getDistance(): Distanz zum gescannten Roboter in Pixel
* robocode.ScannedRobotEvent#getEnergy()|e.getEnergy(): Energie des gescannten Roboters
* robocode.ScannedRobotEvent#getVelocity()|e.getVelocity(): Geschwindigkeit des gescannten Roboters
* robocode.ScannedRobotEvent#getHeading()|e.getHeading(): Fahrtrichtung des gescannten Roboters
* robocode.ScannedRobotEvent#getName()|e.getName(): Name des gescannten Roboters
Die absolute Richtung (//heading//) zum gescannten Roboter kann so ermittelt werden:
double headingToRobot = getHeading() + e.getBearing()
===== Allgemeines =====
* [[looks]]
* [[tracking]]
===== Bewegung =====
* [[anti-gravity]]
===== Zielen =====
Es gibt verschiedene Ansätze zum Zielen.
* [[target-none]]
* [[target-static]]
* [[target-linear-1]]
[[first-robot]]