## 3. Aufbau des Programms

In diesem Abschnitt werden wir den Aufbau des Programms beschreiben, außerdem die Art, wie die Roboter sich bewegen, schießen und den Radar kontrollieren, wann Punkte vergeben werden, und wie ein Turnier aufgebaut ist.

## 3.1 Roboterbewegung

Der Roboter verhält sich wie ein Fahrzeug mit Rädern, er rollt mit einer leichten Roll-Reibung nach vorne und gleitet mit einer wesentlich höheren Gleit-Reibung zur Seite. Die dritte verlangsamende Kraft ist der Luftwiderstand, der entgegen der Bewegungsrichtung des Roboters wirkt, und mit zunehmender Geschwindigkeit größer wird. Es gibt drei Wege, die Roboterbewegung zu beinflussen: Beschleunigen, Rotieren und Bremsen. Das Beschleunigen erhöht die Geschwindigkeit des Roboters in die Richtung in die der Roboter schaut. Man kann die Geschwindigkeit nicht direkt kontrollieren, Beschleunigen ist der einzige Weg den Roboter vom Fleck zu bewegen.

Wenn man den Roboter rotieren lässt, muss man beachten, dass dies nicht direkt die Richtung der Bewegung beinflusst, sondern nur die Richtung der sich der Roboter zuwendet. Die Gleit-Reibung wird die eigentliche Drehung des Roboters bewerkstelligen.

Bremsen wird die Roll-Reibung des Roboters auf den Maximalwert erhöhen. Das passiert, wenn die Räder blockiert sind, und der Roboter rutscht anstatt zu rollen. Vergiss nicht, die Bremse wieder zu lösen, wenn du wieder schneller werden willst.

## 3.2 Energie

Der Zustand des Roboters wird anhand seiner Energie gemessen. Es gibt mehrere Möglichkeiten, Energie zu verlieren. der Roboter kann:

- von einem Schuss getroffen werden,
- mit einem anderen Roboter oder einer Mauer zusammenstoßen,
- in eine Mine rennen oder
- einen Schuss abfeuern.

Die einzige Methode, Energie zu `gewinnen` ist einen Keks zu essen.

## 3.3 Das Radar

Das einzige Mittel, um Informationen über die Umgebung zu bekommen ist das Radar. Jedes Mal, wenn der Roboter aktuallisiert wird, wird ihm eine Radar-Nachricht zugeschickt, die ihm Informationen über das nächste Objekt in Radar-Richtung, d.h. Entfernung und Typ des Objekts gibt. Wenn das Objekt ein Roboter ist, wird auch die Energie dieses Roboters bekanntgegeben.

Da die Radar-Informationen alles sind, was der Roboter über seine Umwelt weiß, ist es extrem wichtig das Radar möglichst gut zu nutzen. Außerdem ist es wichtig, das Radar richtig zu bewegen, damit das Radar brauchbare Informationen sammeln kann.

## 3.4 Die Position des Robters

Seit RealTimeBattle Version 1.0.5 ist es möglich, die Position des Roboter direkter zu bekommen. Anstatt die Umgebung mit dem Radar analysieren zu müssen und daraus die Position zu ermitteln, kann man RealTimeBattle so konfigurieren, dass es die Roboter Koordinaten übermittelt. Dieses Verhalten wird durch die Option Send robot coordinates gesteuert.

## 3.5 Schießen

Schießen ist die beste Methode andere Roboter zu eliminieren. In RealTimeBattle bewegt sich jeder Schuss mit konstanter Geschwindigkeit, die sich aus der Summe der Roboter-Geschwindigkeit und der Schuss-Geschwindigkeit in die Richtung in die die Kanone zeigt, errechnet. Der Schuss wird solange weiterfliegen, bis er mit irgendeinem Objekt kollidiert.

Wenn der Schuss abgefeuert wird, hat er eine bestimmte Energie, die den Schaden bestimmt, den ein getroffener Roboter erleiden wird. Die Energie ist jedoch begrenzt; die Mindest-Energie verbietet Schüsse mit sehr geringer Energie, die man z.B. zum Abschießen von Minen hätte verwenden können. Die Maximal-Energie wird von der momentanen potentiellen Schuss-Energie des Roboters begrenzt, die mit der Zeit zunimmt.

Schießen ist jedoch nicht ohne Risiko, da jeder abgegebene Schuss den Roboter eine gewisse Energie kostet, die proportional zur Schuss-Energie ist.

Wenn ein Keks oder eine Mine getroffen werden, werden sie zerstört, unabhängig von der Schuss-Energie. Daher sollte man minimalste Schuss-Energien verwenden, wenn man Minen abschießt.

Schüsse, die kollidieren, werden nicht automatisch vernichtet, sondern ihre Energie wird gegeneinander aufgerechnet. Wenn die Schüsse in die gleiche Richtung fliegen, wird ihre Energie aufaddiert, wenn sie in entgegengesetzte Richtungen fliegen, heben sich ihre Energien auf.

## 3.6 Kollisionen

Roboter sind zerbrechliche Objekte, die von Kollisionen mit Mauern oder anderen Robotern Schaden erleiden. Bei Kollisionen verhalten sich die Roboter wie Gummibälle: sie springen zurück. Es gibt drei Faktoren, die ihr Verhalten beinflussen, der Bounce-Koeffizient, der Härte-Koeffizient und der Schutz-Koeffizient. An der Vorderseite sind die Roboter aus anderem Material gebaut, das härter ist und mehr Schutz gewährt. Das kann ausgenutzt werden um andere Roboter zu rammen; man teilt so weit mehr Schaden aus, als man selber einstecken muss.

## 3.7 Kekse und Minen

Kekse und Minen sind gleichwertige Objekte, mit dem einzigen Unterschied, dass man bein Einsammeln von Keksen Energie bekommt, und beim 'Einsammeln' von Minen Energie verliert. Kekse und Minen werden während des Spiels zufällig in der Arena auftauchen. Die Energie, die man von ihnen bekommt/verliert, und die Häufigkeit mit der sie erscheinen, kann durch Optionen kontrolliert werden.

## 3.8 Zeit

Wie der Name des Programms schon andeutet, wird als Zeit die Echtzeit benutzt. Es ist einzig und allein die Aufgabe der Roboter, auf Signale und Nachrichten des Programms rechtzeitig zu antworten. Während des Spiels wird regelmässig die update-Funktion aufgerufen. Zwischen diesen Aufrufen müssen sich die Roboter die verbleibende CPU-Zeit aufteilen. Um Roboter daran zu hindern, nicht zuviel Prozessorleistung zu veranschlagen, ist ihre CPU-Zeit im Competition-Modus beschränkt. Die entsprechenden CPU-Optionen geben dazu mehr Infomationen.

Die 'Echtzeit-ness' kann aber unter Umständen verändert werden. Man kann die Spielgeschwindigkeit beschleunigen oder verlangsamen, indem man die Timescale-Option verändert, und es gibt eine Methode, die Unterbrechung des Spiels zu verhindern, wenn die Systemlast zu hoch ist. Wenn die Zeit zwischen zwei Updates länger als MaxTimestep ist, wird das Spiel entsprechend langsamer gemacht.

## 3.9 Ein Spiel

Am Anfang eines Spiels haben die Roboter eine zufällige Position auf dem Spielfeld, mit einer zufälligen Ausrichtung. Das Radar und die Kanone zeigen beide nach vorne und die potentielle Schuss-Energie ist Null. Das Ziel der Roboter ist es nun, solange wie möglich zu überleben und gleichzeitig möglichst viele andere Roboter zu zerstören. Ein Roboter erhält einen Punkt für jeden gegnerischen Roboter, den er überlebt. Ein Extra-Punkt geht jedoch auch an alle teilnehmenden Roboter. Roboter die gleichzeitig sterben, bekommen genausoviele Punkte, wie sie bekommen hätten, wenn sie nicht gleichzeitig gestorben wären(d.h. sie bekommen einen halben Punkt für den jeweils anderen, der gleichzeitig stirbt).

Ein Spiel ist beendet wenn entweder die Anzahl der lebenden Roboter weniger als zwei ist, oder die Zeit abgelaufen ist.

## 3.10 Eine Sequenz

Eine Sequenz ist eine Reihe von Spielen, in denen immer die gleichen Roboter kämpfen. Am Anfang der Sequenz werden die Roboter-Prozesse gestartet. Die Anzahl der Roboter in einer Sequenz ist, wegen der Beschränkung auf maximal 256 offene File-Deskriptoren in Linux, auf 120 begrenzt. Es werden für jeden Roboter zwei Pipes als Kommunikations-Kanäle geöffnet.

Nachdem eine bestimmte Anzahl von Spielen gespielt wurden, werden die Roboter-Prozesse schliesslich gekillt.

## 3.11 Ein Turnier

Ein Turnier ist eine Folge von Sequenzen. Die Anzahl der Roboter in einem Turnier ist(theorethisch) unbegrenzt. Eine beliebige Anzahl von Sequenzen ist erlaubt, um aber das Turnier fair zu gestalten, sollte man eine Anzahl von Sequenzen aussuchen, sodass alle Roboter die gleiche Anzahl von Spielen spielen (d.h. #Sequenzen = #Roboter pro Spiel / ggT(#Roboter pro Spiel, #Roboter im Turnier)).