Vorlesung Informatik 1

Transcrição

Vorlesung Informatik 1
Vorlesung Informatik 1
Fachhochschule für Technik Esslingen
Studiengang Wirtschaftsinformatik
Robocode
Dr. rer. nat. Andreas Rau
http://www.hs-esslingen.de/~rau
[email protected]
© Andreas Rau, 18.12.09
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#1
Einleitung
Robocode ist eines von vielen „Programmierspielen“ die verwendet werden
können, um einige Prinzipien der Programmierung mit Spaß kennenzulernen.
Ziel des Spiels ist es, eine Steuerung für einen ferngesteuerten Panzer zu
programmieren damit dieser eine Schlacht mit anderen Panzern überlebt. Dabei
kommen wichtige Konzepte wie Vererbung oder Event-Handling zur
Anwendung. Der Wettbewerbsfaktor sorgt dabei für zusätzliche Motivation.
Einige weitere Beispiele für Programmierspiele (siehe Java-CD) sind:
Turtle Grafik (mit einer programmierbaren Schildkröte Grafiken erzeugen)
● Der Java Hamster (mit einem Hamster Aufgaben in einem Labyrinth lösen)
● Core Wars (Assembler Programme, die sich im Speicher bekämpfen)
● …
●
© Andreas Rau, 18.12.09
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#2
Basiselemente von Robocode
Das Programmpaket Robocode besteht aus verschiedenen Bestandteilen. Die
wichtigsten davon sind:
Turnier-Manager (Hauptprogramm zur Turnierplanung und -Durchführung)
● Robot-Editor (Einfacher Editor zur Implementierung von Roboter-Steuerungen)
● Robot-Framework (Basisklassen und API Dokumentation zur Entwicklung)
● Beispielroboter (Einfache Roboter, die grundlegende Strategien illustrieren)
●
Weitere Informationen finden sich unter http://robocode.sourceforge.net/
© Andreas Rau, 18.12.09
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#3
Turnierablauf
Die Robot-Arena ist ein rechteckiger, durch Mauern abgeschlossener Raum in
dem sich die Roboter frei bewegen können. Dazu kann ein Roboter folgende
Aktionen ausführen:
Fortbewegung vorwärts/rückwärts: ahead() / back()
● Drehung Karosserie rechts/links: turnRight() / turnLeft()
● Schwenk Radarantenne rechts/links: turnRadarRight() / turnRadarLeft()
● Schwenk Kanone rechts/links: turnGunRight() / turnGunLeft()
● Kanone abfeuern: fire()
●
Während des Turniers werden alle Roboter-Steuerungen „parallel“ ausgeführt.
Das Turnier läuft rundenbasiert in Echtzeit ab, d.h. Aktionen wie Fortbewegung,
Radar-Scan, Kanone feuern etc. benötigen Zeit die dann für andere Aktionen
ggf. fehlt. Jeder Roboter hat eine bestimmte Menge an Lebenspunkten sowie
Energie für die Kanone. Jeder Schuss kostet Energie, die bei einem Treffer
zurückgegeben wird. Jeder feindliche Treffer kostet ebenfalls Energie. Erreicht
die Energie den Wert 0, explodiert der Roboter. Ist die Kanone überhitzt, kann
sie kurzzeitig nicht mehr verwendet werden.
© Andreas Rau, 18.12.09
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#4
Koordinatensystem
Basisoperationen
Kanone nach Norden
turnGunLeft( gunHeading)
Kanone in Fahrrichtung (gunHeading = heading)
turnGunLeft( gunHeading – heading)
Bearing
(Winkel relativ zu Heading)
Kanone nach rechts
turnGunLeft( gunHeading - heading - 90)
Heading
GunHeading
Kanone nach links
turnGunLeft( gunHeading – heading + 90)
Kanone auf Ziel ausrichten
turnGunLeft( gunHeading – heading + bearing)
RadarHeading
Hinweis: Die Radarantenne wird mit der Kanone
mitgedreht. Das ist jedoch langsamer als nur die
Antenne zu drehen.
© Andreas Rau, 18.12.09
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#5
Programmablauf
Die Steuerung eine Roboters besteht aus 2 Teilen:
Eine run()-Methode die das Grundverhalten implementiert
● sog. Event-Handler, mit denen der Roboter auf Ereignisse reagiert, z.B.
● Aufprall auf eine Mauer: onHitWall()
● Erkennung eines anderen Roboters: onScannedRobot()
● Zusammenprall mit anderem Roboter: onHitRobot()
● Schuss und Treffer eines anderen Roboters: onBulletHit()
● Treffer durch einen anderen Roboter: onHitByBullet()
● …
●
Diese Ereignisse treten als Folge einer Basisaktion in der run()-Methode auf.
Eine genaue Beschreibung der verfügbaren Event-Handler ist im Robot-Editor
unter Dokumentation abrufbar.
© Andreas Rau, 18.12.09
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#6
Strategien
Die Strategie zum Überleben in der Arena besteht aus mehren teilen
Viel treffen, wenig getroffen werden
● In Bewegung bleiben, ausweichen bei Treffern
● Wenig Zeit für Scan, viel für Bewegung
● Kanone nicht überhitzen
● ...
●
Ausgefeiltere Steuerungen können ggf. auch auf bewegte Ziele schießen (mit
Vorhalten) und gezielt zwischen Angriff und Rückzug wechseln oder günstige
Positionen an der Wand oder in der Ecke einnehmen.
Um die Entwicklungsumgebung und die Bedeutung der Aktionen und Ereignisse
kennenzulernen wird empfohlen, zunächst schrittweise einen eigenen Roboter
mit einfachem Verhalten von Grund auf zu bauen und erst nach und nach von
den vorhandenen (komplizierten) Beispielrobotern abzuschreiben.
© Andreas Rau, 18.12.09
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#7
Beispielroboter: Patrol (Basisverhalten)
package examples;
import robocode.*;
public class Patrol extends Robot
{
/**
* run: Patrol's default behavior
*/
public void run() {
turnLeft( getHeading());
turnGunLeft( getGunHeading());
turnRadarLeft( getRadarHeading());
while(true) {
ahead( 128);
turnRadarLeft( 360);
}
}
© Andreas Rau, 18.12.09
// Fahrzeug nach Norden ausrichten
// Kanone nach Norden ausrichten
// Radar nach Norden ausrichten
// Weiterfahren
// Rundum Scan durchführen
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#8
Beispielroboter: Patrol (Reaktionen)
/**
* onHitWall: What to do when you hit a wall
*/
public void onHitWall(HitWallEvent event) {
turnLeft(90);
}
/**
* onScannedRobot: What to do when you see another robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
double b = e.getBearing();
turnGunRight( b);
fire(1);
turnGunLeft( b);
}
// Gegen Wand gefahren!
// Linksdrehung um 90 Grad
// Zielrichtung auslesen
// Kanone auf Ziel
// Feuer!
// Kanone wieder in Fahrtrichtung
/**
* onHitByBullet: What to do when you're hit by a bullet
*/
public void onHitByBullet(HitByBulletEvent e) {
}
}
© Andreas Rau, 18.12.09
D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-praxis-robocode.odp
#9