Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2009 W

8. Laborübungsaufgabe

Themen:

Exceptions, nebenläufige Programmierung

Termine:

Ausgabe: 09.12.2009
reguläre Abgabe: 16.12.2009, 13:45 Uhr
nachträgliche Abgabe: 13.01.2010, 13:45 Uhr

Abgabeverzeichnis:

Gruppe/Aufgabe8

Programmaufruf:

java Test

Grundlage:

Skriptum bis Seite 149, Schwerpunkt auf den Abschnitten 3.5 und 3.6

Aufgabe

Welche Aufgabe zu lösen ist:

In einem dem Computerspiel GartenSchlacht nachempfundenen Spiel versuchen verschiedene Gartentiere von einem Ende eines Weges durch den Garten an das andere Ende zu gelangen, um die dort wachsenden wohlschmeckenden Blumen zu fressen. Der Garten ist rechteckig und besteht ähnlich einem Schachbrett aus einer Anzahl an quadratischen Feldern. Ein Weg durch den Garten ist eine Folge von schlangenförmig aneinandergereihten Feldern mit einem Start- und einem Endfeld. Auf jedem Feld des Weges können sich beliebig viele Tiere befinden, auf jedem Feld außerhalb des Weges höchstens eine Kampfpflanze. Kampfpflanzen versuchen die Wanderung der Tiere zu verhindern, indem Sie Giftkapseln in ihrer Umgebung verstreuen. Es gibt verschiedene Arten von Kampfpflanzen, die sich in der Reichweite (= Größe des Quadrats rund um die Kampfpflanze, über das die Pflanze Giftkapseln gleichmäßig verstreut), der Stärke der Giftkapseln (= Giftmenge in der Kapsel) und der Zeit zum Produzieren von Giftkapseln (= Zeit zwischen dem Ausstreuen zweier Giftkapseln). Der Inhalt einer Giftkapsel landet auf genau einem Feld innerhalb der Reichweite der Giftpflanze. Dieses Feld wird in einer fixen Reihenfolge bestimmt, die alle Felder in der Reichweite der Pflanze einschließt. Die Tiere sind verschieden schnell unterwegs (abhängig von der Zeit, um auf das nächste Feld am Weg vorzurücken) und vertragen unterschiedliche Giftmengen, bevor sie vernichtet sind. Jedesmal, wenn ein Tier vorrückt, nimmt es die gesamte am neuen Feld liegende Giftmenge auf. Erreicht ein Tier das Ende des Weges, ist das Spiel beendet und der Spieler (der die Kampfpflanzen positioniert) hat verloren. Sind alle Tiere vernichtet, so ist das Spiel ebenso beendet und der Spieler hat gewonnen.

Simulieren sie das Spiel mittels eines nebenläufigen Java-Programms. Stellen sie dabei jedes Tier und jede Kampfpflanze durch einen eigenen Thread dar. Jedes Tier bewegt sich nach einer gewissen Zeit (wenige Millisekunden) von einem Feld des vorgegebenen Weges zum nächsten, jede Kampfpflanze platziert nach einer gewissen Zeit (wenige Millisekunden) die nächste Giftkapsel. Simulieren Sie Wartezeiten mittels der Methode Thread.sleep(n). Achtung: sleep behält alle Monitore (= Locks); Sie sollten sleep daher nicht innerhalb einer synchronized-Methode oder -Anweisung aufrufen wenn während der Wartezeit von anderen Threads aus auf dasselbe Objekt zugegriffen werden soll. Wenn ein Tier das Endfeld erreicht hat, geben Sie aus, welche Tiere noch leben und beenden alle Threads (Tiere und Pflanzen). Verwenden Sie Thread.interrupt() um einen Thread zu unterbrechen, geben Sie, falls es sich um ein Tier handelt, den Namen und die noch verbliebenen Lebenspunkte (= Giftmenge, die das Tier noch aufnehmen kann, bevor es vernichtet ist) aus, und beenden Sie den Thread. Wenn ein Tier die auf einem Feld liegende Giftmenge aufnimmt, reduzieren sich seine Lebenspunkte entsprechend. Wenn der Wert kleiner 0 wird, beenden Sie den Thread des Tieres. Stirbt das letzte Tier, beenden Sie alle Pflanzenthreads und geben Sie für jede Kampfpflanze aus, wieviele Giftkapseln sie produziert hat.

Die Klasse Test soll (nicht interaktiv) Testläufe des Spiels durchführen und die Ergebnisse in allgemein verständlicher Form in der Standardausgabe darstellen. Bitte achten Sie darauf, dass die Testläufe nach kurzer Zeit terminieren (maximal 10 Sekunden für alle zusammen). Führen Sie mindestens drei Testläufe mit unterschiedlichen Einstellungen durch:

Warum die Aufgabe diese Form hat:

Das Spiel soll die nötige Synchronisation bildlich veranschaulichen und ein Gefühl für eventuell auftretende Sonderfälle geben. Beispielsweise müssen Tiere erkennen, wann sie tot sind. Einen speziellen Sonderfall stellt das Spielende dar, das (aus Sicht einer Pflanze oder eines Tieres) jederzeit in jedem beliebigen Zustand auftreten kann. Dabei wird auch geübt, nach einer an einer beliebigen Programmstelle aufgetretenen Exception den Objektzustand so weit wie nötig zu rekonstruieren, um ein sinnvolles Ergebnis zurückliefern zu können.

Wie die Aufgabe zu lösen ist:

Überlegen Sie sich genau, wie und wo Sie Synchronisation verwenden. Halten Sie die Granularität der Synchronisation möglichst klein, um unnötige Beeinflussungen anderer Threads zu reduzieren. Vermeiden Sie aktives Warten, indem Sie immer sleep aufrufen, wenn Sie eine bestimmte Zeit warten müssen. Beachten Sie, dass ein Aufruf von sleep innerhalb einer synchronized-Methode oder -Anweisung den entsprechenden Lock nicht freigibt.

Testen Sie Ihre Lösung bitte rechtzeitig auf der g0, da es im Zusammenhang mit Nebenläufigkeit große Unterschiede zwischen den einzelnen Plattformen geben kann. Ein Programm, das auf einem Rechner problemlos funktioniert, kann auf einem anderen Rechner (durch winzige Unterschiede im zeitlichen Ablauf) plötzlich nicht mehr funktionieren.

Nebenläufigkeit kann die Komplexität eines Programms gewaltig erhöhen. Achten Sie daher besonders darauf, dass Sie den Programm-Code so klein und einfach wie möglich halten. Jede unnötige Anweisung kann durch zusätzliche Synchronisation (oder auch fehlende Synchronisation) eine versteckte Fehlerquelle darstellen und den Aufwand für die Fehlersuche um vieles stärker beeinflussen als in einem sequentiellen Programm.

Was im Hinblick auf die Beurteilung zu beachten ist:

Der Schwerpunkt bei der Beurteilung liegt auf korrekter nebenläufiger Programmerierung und der richtigen Verwendung von Synchronisation sowie dem damit in Zusammenhang stehenden korrekten Umgang mit Exceptions. Punkteabzüge gibt es für

Was im Hinblick auf die Abgabe zu beachten ist:

Verzichten Sie wie üblich auf die Verwendung von packages und Verzeichnissen innerhalb des Abgabeverzeichnisses. Geben Sie (abgesehen von geschachtelten Klassen) nicht mehr als eine Klasse in jede Datei, und verwenden Sie aussagekräftige Namen. Achten Sie darauf, dass Sie keine Java-Dateien abgeben, die nicht zu Ihrer Lösung gehören.
Complang
Puntigam
   Kontakt
   Research
   Lehre
      OOP
      Typsysteme
      EP2
      FOOP
      Prog.spr.
      frühere Lehre
         LVAs 2017 W
         LVAs 2017 S
         LVAs 2016 W
         LVAs 2016 S
         LVAs 2015 W
         LVAs 2015 S
         LVAs 2014 W
         LVAs 2014 S
         LVAs 2013 W
         LVAs 2013 S
         LVAs 2012 W
         LVAs 2012 S
         LVAs 2011 W
         LVAs 2011 S
         LVAs 2010 W
         LVAs 2010 S
         LVAs 2009 W
            OOP
               1. Aufgabe
               2. Aufgabe
               3. Aufgabe
               4. Aufgabe
               5. Aufgabe
               6. Aufgabe
               7. Aufgabe
               8. Aufgabe
               9. Aufgabe
               Cacao
            Typsysteme
         LVAs 2009 S
         LVAs 2008 W
         LVAs 2008 S
         LVAs 2007 W
         LVAs 2007 S
         LVAs 2006 W
         LVAs 2006 S
         LVAs 2005 W
         LVAs 2005 S
         LVAs 2004 W
         LVAs 2004 S
         LVAs 2003 W
   Links
Sitemap
Kontakt
Schnellzugriff:
Tutoren
Skriptum
Folien
vorige Aufgabe
nächste Aufgabe
Fakultät für Informatik
Technische Universität Wien
Anfang | HTML 4.01 | Datenschutzerklärung | letzte Änderung: 2009-12-09 (Puntigam)