Informatik 1 Programmierwettbewerb
Endergebnisse
Ergebnisse der Runde 1
Ergebnisse der Vorrunde
Roboball Paket (tar.gz)
Roboball Paket (zip)
Programmieranleitung
Überblick (Presentation)
Javadoc der Klasse Player
Javadoc der Klasse SoccerAction
Ergebnisse der Bonusrunde:
In der Bonusrunde trat jedes Team drei mal gegen den TestPlayer an. Bei 6 oder
mehr erreichten Punkten erhalten die Teammitglieder jeweils 5 Bonuspunkte in der Klausur,
ansonsten
3 für die erfolgreiche Teilnahme am Wettbewerb.
|
|
Bonusspiel 1 |
|
|
Bonusspiel 2 |
|
|
Bonusspiel 3 |
|
|
|
|
| Team |
ID |
Tore |
Gg.Tore |
Punkte |
Tore |
Gg.Tore |
Punkte |
Tore |
Gg.Tore |
Punkte |
Gesamt |
Bonuspunkte |
| Abgefahrn |
01 |
6 |
0 |
3 |
5 |
0 |
3 |
4 |
1 |
3 |
9 |
5 |
| FC Kaffeekanne |
02 |
5 |
0 |
3 |
3 |
1 |
3 |
0 |
1 |
0 |
6 |
5 |
| Breadless Art |
03 |
3 |
0 |
3 |
5 |
0 |
3 |
2 |
0 |
3 |
9 |
5 |
| T-Team |
04 |
0 |
2 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
3 |
| Grim Reapers |
05 |
4 |
1 |
3 |
4 |
0 |
3 |
7 |
0 |
3 |
9 |
5 |
| 3-Zeiler |
06 |
3 |
1 |
3 |
1 |
1 |
1 |
3 |
0 |
3 |
7 |
5 |
| Mein Team |
07 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
3 |
4 |
3 |
| Steaua |
08 |
0 |
1 |
0 |
1 |
2 |
0 |
2 |
0 |
3 |
3 |
3 |
| vRobots |
09 |
2 |
1 |
3 |
2 |
0 |
3 |
1 |
0 |
3 |
9 |
5 |
| MST Kickers |
10 |
8 |
0 |
3 |
7 |
0 |
3 |
7 |
0 |
3 |
9 |
5 |
| Die Abgeschloffenen |
11 |
7 |
0 |
3 |
2 |
2 |
1 |
2 |
1 |
3 |
7 |
5 |
| Digital Player |
13 |
5 |
0 |
3 |
4 |
0 |
3 |
4 |
0 |
3 |
9 |
5 |
News
Ablauf des Wettbewerbs
Ihre Aufgabe ist es, ein Team aus virtuellen Fußballspielern zu entwickeln.
Ihr Team wird in drei Runden (1x vor Weihnachten, 2x im Februar) gegen die Konkurrenten
antreten. Nach jeder Runde werden die Gesamttabelle und die einzelnen Spielergebnisse
auf dieser Internetseite veröffentlicht. Sie können die einzelnen Spiele
herunterladen und mit einem Visualisierungsprogramm analysieren. Nach jeder Runde
können Sie Ihr Team verbessern.
- Bis zu 3 Programmierer pro Team
- Termine:
- Vorrunde (keine Wertung): 19. Dez 2006 (Abgabe bis 18. Dez, 12 Uhr mittags)
- 1. Runde: 30. Jan 2007 (Abgabe bis 29. Jan, 12 Uhr mittags)
- 2. Runde: 13. Feb 2007 (Abgabe bis 12. Feb, 12 Uhr mittags)
- Die Anmeldung erfolgt durch Einreichung einer ersten Team-Version zur Vorrunde.
So funktioniert die Abgabe:
- E-Mail an info1@informatik.uni-freiburg.de
- Eindeutiger Teamname (nur Buchstaben und Zahlen)
- Namen und Matrikelnummern aller Programmierer
- Eine Java Datei fuer jeden ihrer virtuellen Spieler
- Die Datei lineup.xml, in der die Spielerzuordnungen angegeben sind
(im Verzeichnis teams/DemoTeam1 finden Sie ein Beispiel)
- Die Java-Dateien muessen sich mit Java 2 (1.4) übersetzen und
ausfuehren lassen. Es darf nur das in der Programmieranleitung dargestellte
Interface verwendet werden (keine Threads, Systemaufrufe, Introspection, etc.).
Die Spiele werden auf einem separaten Rechner ausgeführt und der Code wird
vor der Übersetzung auf Fairness hin ueberprueft.
- Durch die Teilnahme am Wettbewerb können Sie Bonuspunkte für die
Informatik 1 Klausur erwerben. Sie erhalten
- 3 Bonuspunkte, wenn Ihr Team an allen drei Runden teilnimmt, sich
fehlerfrei übersetzen und ausführen läßt und sich deutlich
vom TestPlayer (DemoTeam2) unterscheidet.
- 5 Bonuspunkte, wenn Ihr Team die Bedingungen für 3 Bonuspunkte
erfüllt und zusätzlich besser als der TestPlayer (DemoTeam2) abschneidet
- In jeder Runde spielen alle Teams gegeneinander. Bewertung erfolgt durch
die übliche Punkteverteilung beim Fußball (Sieg 3P, Niederlage 0P,
Unentsch. 1P). Bei Gleichstand zühlt das Torverhältnis
- Nach jeder Runde werden die Ergebnisse als Tabelle ins Netz gestellt
und die einzelnen Spiele koennen als XML-Datei heruntergeladen und
mit einem Tool abgespielt werden.
Bei Fragen oder Problemen wenden Sie sich bitte an Ihren Informatik 1 Tutor oder
an die Adresse info1@informatik.uni-freiburg.de.
Vielen Dank an Mathias Retzlaf, Hendrik Dahlkamp, Holger Kujath, Till Krullmann
und den i-n-k e.V., mit denen zusammen die Wettkampfidee
und der Simulator entstanden sind.
Spielregeln
Spielzeit:
Ein Spiel dauert 90 Spielzüge (d.h. jeder Spieler macht 90
Züge). Dann wird abgepfiffen. Nach 45 Spielzügen ist
Halbzeit. Die Position der Spieler
wir zu Beginn jeder Halbzeit und nach jedem Tor zufällig
gewählt (jeder in seiner Hälfte).
Es gibt keine Nachspielzeit und keine Verlängerung.
Tore:
Ein Tor ist erzielt, wenn der Ball auf in einem der beiden Torbereiche
liegt. Der Torbereich des eigenen Tores umfasst alle Felder mit
y-Koordinate 0. Das gegnerische Tor alle Felder mit y-Koordinate 14.
Für Spieler sind die Torbereiche ganz normaler Bestandteil des
Spielfelds.
Fouls:
Ein Spieler, der versucht einen gegnerischen oder eigenen Spieler auf
ein Feld zu schieben, welches nicht frei ist, begeht ein Foul. Bei
einem Foul tauschen die beiden beteiligten Spieler ihre Plätze.
Nach 3 Fouls bekommt ein Spieler die rote Karte. Er wird dann
automatisch vom Spielkontrollprogramm aus dem Spiel genommen.
Zu Begin jeder Halbzeit und nach jedem Tor dürfen vom Feld
gestellte Spieler wieder mitspielen und alle Foul-Zähler werden
auf 0 zurückgesetzt.
Aufstellung:
Die Spieler werden zu Beginn zufällig verteilt. Die Reihenfolge,
in der die Spieler ziehen dürfen, ist ebenfalls zufällig;
jeweils abwechselnd ein Spieler beider Teams. Diese Reihenfolge wird
während des Spiels beibehalten, auch nach einem Tor (Es beginnt
dann derjenige Spieler, der nach dem Torschützen dran gekommen
wäre). Nach Toren und nach der Halbzeit werden die Spieler
wiederum zufällig verteilt.
How-To: Einen eigenen Spieler erstellen
- TestPlayer.java als Vorlage verwenden
- Der java Datei und der enthaltenen Klasse einen neuen Namen geben
- Die Methode makeMove() anpassen
- Die Programmieranleitung lesen (siehe Link am Anfang dieser Seite)
- Den Spieler kompilieren mit
- javac -classpath JustPlay.jar MeinSpieler.java
How-To: Ein Spiel analysieren
Die Klasse LogPlayer stellt eine Methode
writeLogFile( String message ) zur Verfügung, um
Nachrichten in eine Textdatei zu schreiben. So können Sie
leichter nach Fehlern in Ihren Programmen suchen.
Datei-Name: 〈Klassenname〉.log
Einträge: 〈Iteration〉 [〈Klassenname〉: 〈XY-Position〉] 〈message〉
Empfehlung: Erstellen Sie eine eigene Klasse für jeden Ihrer Spieler. So lassen
sich die Spiele und Log-Dateien am Einfachsten analysieren. Falls mehrere Spieler
derselben Logik folgen sollen, geben Sie ihnen eine gemeinsame Superklasse. Eine
interaktive Steuerung der Spieler ist nicht möglich, da die Spiele erst
vollständig ausgeführt und anschließend visualisiert werden.
How-To: Ein Testspiel ausführen
- java -jar JustPlay.jar
- Dies öffnet ein Dialogfenster, durch das sich zwei Teams zusammen-
stellen lassen. Als Player koennen alles Klassen-Dateien ausgewählt
werden, die sich im aktuellen Verzeichnis befinden.
- Wird JustPlay (wie in diesem Beispiel) ohne Parameter aufgerufen,
müssen sich die Klassendateien im aktuellen Verzeichnis befinden.
How-To: Ein aufgezeichnetes Spiel analysieren
- java -jar ReplayGame.jar
- Es öffnet sich ein Dialogfenster zur Auswahl einer XML-Datei.
- Aufgezeichnete Spiele können nach den offiziellen Spielrunden von der
Homepage geladen werden oder selbst nach einem Testspiel (mit JustPlay)
gespeichert werden
How-To: Viele Testspiele ausführen
- java -jar JustPlay.jar DemoTeam1 DemoTeam2
- Wem die ständige Eingabe von Spielerklassen zu mühsam ist, der kann
bei JustPlay zwei Teams als Parameter angeben.
- Die zwei Teams müssen in der Datei teams.xml angelegt werden und ein
eigenes Unterverzeichnis im Verzeichnis teams besitzen. Die Datei
lineup.xml im Team-Unterverzeichnis gibt dabei an, welcher Spieler durch
welche Klasse gespielt werden soll. Diese Klassen müssen sich in dem
jeweiligen Unterverzeichnis befinden
How-To: Verwendung der Richtungskonstanten in Player.class
- die Funktion Player.getRelativeDirection(from,to) liefert einen integer Wert als
Richtungsangabe zurueck. Dieser stellt ein bitweises Oder der Konstanten
Player.UP, Player.DOWN, Player.LEFT und
Player.RIGHT dar.
- Liegt z.B. der Punkt to von from aus links oben, so wird
LEFT | UP zurückgegeben.
- Die Abfrage dafür würde also lauten:
if (getRelativeDirection(from,to) == LEFT | UP
- Die Konstanten HORIZONTAL und VERTICAL vereinfachen einem die
Abfrage für diese Richtungen:
if (getRelativeDirection(from,to) == HORIZONTAL