Droidbattles – Roboterkämpfe am PC
Ein sehr gutes, kleines Spiel für Linux habe ich heute im Netz gefunden: Droidbattles. Dort geht es darum, den besten Roboter zu bauen, welcher dann andere Roboter besiegen muss. Zu diesem Zweck muss man sowohl Ausrüstung (z.B. Plasmagun) als auch Programmierung selber festlegen. Hier kommen wir auch gleich zum Lehrreichen: Um den Roboter programmieren zu können, bedient man sich einer an Assembler angelehnten Sprache.
Als Einstieg in dieses Spiel, hier ein kleiner von mir geschriebener Beispielbot. Um diesen nachzubauen (und zu programmieren), startet man Droidbattles und öffnet den Bot Creator. Nun wählen wir ersteinmal folgende Ausrüstung aus:
1. CPU (Stufe 5): Einen Prozessor braucht jeder Roboter, um die Programmierung auszuführen. Je höher die Stufe, desto höher die Geschwindigkeit.
2. Plasmagun (Stufe 5): Mit der Plasmagun schießt der Roboter auf andere Schiffe – so kann er gewinnen. Je höher die Stufe, desto kürzer die benötigte Zeit zwischen zwei Schüssen!
3. Scanner (Stufe 5): Durch den Scanner sieht der Roboter andere Schiffe, was dazu führt, dass er gezielt schießen kann und nicht nur wild herumballert! Je höher die Stufe, desto größer der Sichtbereich
4. Armor (Stufe 5): Ohne Schutz wäre der Roboter schon beim ersten Treffer eines gegnerischen Schiffes besiegt worden. Je höher die Stufe, desto stärker der Schutz!
5. Armor (Stufe 5): Siehe Oben
6. Turret (Stufe 5): Hiermit können Geräte gedreht werden. (In diesem Beispiel der Scanner und die Plasmagun).
Je höher die Stufe, desto schneller die Drehgeschwindigkeit.
7. Turret (Stufe 5): Siehe Oben
Das wäre schonmal die Ausrüstung. Wer sich schon ein bisschen mit Droidbattles auskennt wird sich fragen, wieso hier der Antrieb und der Treibstoff fehlt. Der Grund dafür ist, dass dieser Roboter nicht herumlaufen (fliegen?) wird, sondern einfach auf einer Stelle bleibt und nur Plasmagun so wie Sichtbereich bewegt.
Nun fehlt nur noch die Programmierung des Bots:
out Scanner0_SetScanWidth,10
:loop
out Scanner0_Scan,1
hwait
in ax, Scanner0_GetScanDistance
cmp ax, 60000
jae next
out Plasmagun0_Shoot,1
:next
jna next2
out Turret0_AdjustOffset,10
out Turret1_AdjustOffset,10
:next2
in ax, Scanner0_GetScanAccuracy
cmp ax, 2
jae next3
out Turret0_AdjustOffset,-10
out Turret1_AdjustOffset,-10
:next3
jna next4
out Turret0_AdjustOffset,10
out Turret1_AdjustOffset,10
:next4
jmp loop
Die Programmierung ist eine (stark) modifizierte Version des Codes aus dem Beispiel im Droidbattles Handbuch.
Sehen wir uns den Code genauer an:
In der ersten Zeile wird der Scanner angewiesen, sich auf eine (relativ geringe) Breite von 10 zu begrenzen, was dazu führt, dass der Bot sehr weit sehen kann. Jetzt wird eine Sprungmarke definiert – so kann man jeder Zeit einfach zu dieser Stelle im Code zurrückehren. Daraufhin wird ein Scanpulse ausgestoßen (out Scanner0_Scan,1), das Ergebnis eingelesen (in ax,16) und mit 60000 verglichen (cmp ax, 60000), weil die Zahl größer als 60000 ist, falls sich ein Bot im Sichtbereich befindet. Die Nächste Anweisung (jae next) besagt etwa folgendes: Falls ax gleich/größer als 60000 ist, dann gehe zu next. Dies führt dazu, dass nur geschossen wird, falls sich ein Bot im Sichtbereich befindet. Der nächste Bereich (zwischen jna next2 und :next2) wird nur ausgeführt, falls kein Bot im Sichtbereich ist. Er sorgt dafür, dass dann dieser (Sichtbereich) + die Plasmakanone ein Stück gedreht wird. Jetzt wird es wieder ein bisschen komplizierter. Nun wird nämlich geprüft, wo der Bot sich im Scanbereich befindet. Wenn dieser nämlich zu weit links befindet, müssen sowohl Plasmagun als auch Scanner in diese Richtung gedreht werden. Also: Falls zu weit links, nach links drehen, falls zu weit rechts, nach rechts drehen. Die letzte Zeile sorgt nur dafür, dass dieser Bereich endlos wiederholt wird.
Alles in allem bin ich der Meinung, das dieses Spiel nach einer (nicht ganz so) kurzen Eingewöhnungsphase eine Menge Spaß macht, und man dabei auch noch etwas lernt! Einziger Nachteil: Komplett auf Englisch ist Droidbattles für Englischmuffel eher schwer zu verstehen.
Wie immer: Ich warte auf eure Kommentare! Wir würdet ihr den Bot verbessern? Oder meint ihr, ihr habt einen besseren? Oder schafft ihr das gleiche mit einem billigerem Bot?





Kommentare
(verstecken) RSSFalco
August 15, 2009 @21:16:50
hi, i created a bot that defeats your bots every turn and it is much cheaper:
Hardware:
CPU – 5
fuel- 2
armor – 2
armor – 2
plasmagun – 2
shild – 2
fuel -2 (added later…)
scanner – 5 (cause higher range)
steering – 2
fuel -2 (again fuel^^)
AS-rocket 2
Software:
out 29, 30
out 36, 40
out 20, 1
:loop
out 28, 1
hwait
in ax, 28
out 44, ax
cmp ax, 60000
jae turnaround
in ax, 29
cmp ax, 2
jae straight
cmp ax, 0
jae left
:turnaround
out 32, -5
jmp loop
:left
out 16, 1
out 45, 1
out 32, -5
jmp loop
:straight
cmp ax, 3
jae right
out 16, 1
out 45, 1
jmp loop
:right
out 16, 1
out 45, 1
out 32, 5
jmp loop
Arno Nym
January 13, 2010 @23:40:53
sorry für die dähmliche frage, aber wie kann ich die sachen aus dem Bot-creator als .bot datei speichern?
bei mir geht das nur als .bsam…
Gib deine Meinung ab!