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