Institut für Programmierung und Reaktive Systeme 8. Januar Programmieren I. 6. Übungsblatt

Ähnliche Dokumente
Institut für Programmierung und Reaktive Systeme 9. Januar Programmieren I. 6. Übungsblatt

Institut für Programmierung und Reaktive Systeme 18. Dezember Programmieren I. 6. Übungsblatt

Institut für Programmierung und Reaktive Systeme 5. Dezember Programmieren I. 5. Übungsblatt

Institut für Programmierung und Reaktive Systeme 11. Dezember Programmieren I. 5. Übungsblatt

Institut für Programmierung und Reaktive Systeme 4. Dezember Programmieren I. 5. Übungsblatt

Institut für Programmierung und Reaktive Systeme 8. Mai Programmieren II. 10. Übungsblatt

Institut für Programmierung und Reaktive Systeme 27. Juni Programmieren II. 14. Übungsblatt

Institut für Programmierung und Reaktive Systeme 20. November Programmieren I. 4. Übungsblatt

Institut für Programmierung und Reaktive Systeme 24. Juni Programmieren II. 14. Übungsblatt

Humboldt-Universität zu Berlin Wintersemester 2010/11 Institut für Informatik Grundlagen der Programmierung. 6. Übungsblatt

Institut für Programmierung und Reaktive Systeme 10. Mai Programmieren II. 11. Übungsblatt

Institut für Programmierung und Reaktive Systeme 26. April Programmieren II. 10. Übungsblatt

1 Abstrakte Klassen, finale Klassen und Interfaces

Institut für Programmierung und Reaktive Systeme 6. November Programmieren I. 3. Übungsblatt

12 Abstrakte Klassen, finale Klassen und Interfaces

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Programmieren in Java

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Institut für Programmierung und Reaktive Systeme 31. Mai Programmieren II. 12. Übungsblatt

Wissenschaftliches Rechnen

14 Abstrakte Klassen, finale Klassen, Interfaces

Abgabe: (vor 24 Uhr)

Abgabe: (vor 12 Uhr)

Klausur Grundlagen der Programmierung

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Programmieren in Java

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Die Klasse java.lang.object. Thorsten Treffer

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Abschlussklausur Lösung. Bitte in Druckschrift leserlich ausfüllen!

Programmierung für Mathematik (HS13)

Tutorial zu Einführung in die Informatik für LogWi- Ings und WiMas Wintersemester 2015/16. 1 Zauberer und Zwerge, Aufgabenteil 1

Javakurs für Anfänger

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierte Programmierung Studiengang Medieninformatik

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Objektorientierte Programmierung Studiengang Medieninformatik

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Übungsblatt 1. Java Vorkurs (WS 2017)

Objektorientierte Programmierung Studiengang Medieninformatik

Probeklausur: Programmierung WS04/05

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015. Musterlösung

Sommersemester Jewgeni Rose. Technische Universität Braunschweig

Algorithmen und Datenstrukturen

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

1 Einleitung Generizität Syntax... 2

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

EPROG 2.Teilprüfung. Aufgabe 1:

Schriftlicher Test (120 Minuten) VU Einführung ins Programmieren für TM. 24. Juni 2016

Aufgabenblatt 3. Kompetenzstufe 2. Allgemeine Informationen zum Aufgabenblatt:

Name:... Matr.-Nr... Bearbeitungszeit: 120 Minuten

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Java für Bauingenieure

Die Welt in unseren Programmen false -1.4E-12. false. Klassen

Strukturiertes Programmieren

JAVA für Nichtinformatiker - Probeklausur -

Programmieren in Java -Eingangstest-

// compiliert, aber Programmabbruch zur Laufzeit: einesuppe = ((EßbarerPilz)einPilz).kochen();

Institut für Programmierung und Reaktive Systeme 19. August Programmier-Labor. 1. Übungsblatt

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Einführung in die Java- Programmierung

Institut für Programmierung und Reaktive Systeme 27. Mai Programmieren II. 12. Übungsblatt

Aufgabenblatt 1. Kompetenzstufe 2. Allgemeine Informationen zum Aufgabenblatt:

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 16. Juli Klausur

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Ausnahmen. Exceptions. Definition Ausnahmen erzeugen Ausnahmen abfangen Ausnahmen weiterleiten. Dr. Beatrice Amrhein

Programmiertechnik Klassenvariablen & Instantiierung

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Institut fu r Informatik

Übung Informatik I - Programmierung - Blatt 8

Programmierkurs Java

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

Informatik Hochschule Mainz Geoinformatik und Vermessung. Wiederholung. Frohes Fest und Guten Rutsch!

Klausur Algorithmen und Datenstrukturen I SS 03

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 8. Blatt Für den 16. und

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

hue13 January 30, 2017

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Informatik II Übung 6

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

Vorlesung Objektorientierte Programmierung Klausur

Ein einfaches Adventure-Game für die Stufe EF, entwickelt von U. Helmich, inspiriert durch viele bekannte Spiele.

Vererbung und Polymorphie

Algorithmen und Datenstrukturen Sommersemester Übung Abgabe bis , 10:00 Uhr

Einführung in die Programmierung. (K-)II/Wb17

Name:... Matr.-Nr... Bearbeitungszeit: 120 Minuten. Lesen Sie die Aufgaben jeweils bis zum Ende durch; oft gibt es hilfreiche Hinweise!

Methoden und Wrapperklassen

Prüfung Softwareentwicklung II (IB)

pue08 December 9, 2016

Transkript:

Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 8. Januar 2015 Programmieren I 6. Übungsblatt Hinweis: Ihre Lösung der Pflichtaufgabe dieses Übungsblatts müssen Sie bis spätestens zum 18. Januar 2015 auf der Web-Seite http://ips.rz.tu-bs.de/programmieren-abgabe abgeben. Beachten Sie, dass Sie Ihre Lösung auch Ihrem Tutor erläutern müssen. Halten Sie sich bei der Programmierung an die in der Vorlesung vorgestellten Richtlinien zur Formatierung von Java-Programmen. Auf der Internetseite zu dieser Veranstaltung finden Sie eine Zusammenstellung dieser Richtlinien. Kommentieren Sie Ihre Lösung der Pflichtaufgabe. Der Kommentar muss Ihren Namen, Ihre Matrikelnummer und Ihre Übungsgruppe sowie eine Beschreibung Ihrer Lösung enthalten. Auf der Abgabeseite finden Sie eine Möglichkeit, die Formatierung Ihrer Lösung zu checken. Aufgabe 31: Eine Uhrzeit wird die durch die Angabe einer Stunde (0 23), einer Minute (0 59) und einer Sekunde (0 59) festgelegt. Beispiel: 14:59:01 Uhr. Schreiben Sie eine Klasse Uhrzeit, die eine Zeitangabe durch die drei privaten Attribute stunden, minuten und sekunden vom Datentyp int repräsentiert. Neben diesen Attributen soll Ihre Klasse mindestens die folgenden Methoden enthalten: a) Konstruktoren: Der parameterlose Konstruktor Uhrzeit() initialisiert die Zeit mit 00:00:00 Uhr. Der Konstruktor Uhrzeit(int stunden, int minuten, int sekunden) setzt die Zeit auf die Parameterwerte. b) Get- und Set-Methoden: Die folgenden Methoden sollen die jeweiligen Attribute als Ergebnis liefern bzw. die entsprechenden Attribute setzen: getstunden() getminuten() getsekunden() setuhrzeit(int stunden, int minuten, int sekunden) c) Überlagerung von Methoden der Klasse Object: Die Methode tostring() soll die aktuelle Uhrzeit in der Form 14:59:01 Uhr liefern.

Die Methode equals(object o) soll den Parameter mit dem aktuellen Objekt vergleichen. Die Methode clone() soll ein neues Objekt der Klasse Uhrzeit mit der Zeit des aktuellen Objekts liefern. d) Die Methoden add(uhrzeit u), sub(uhrzeit u) und früher(uhrzeit u) sollen die durch den Parameter übergebene Uhrzeit zur aktuellen Uhrzeit addieren, von der aktuellen Uhrzeit subtrahieren bzw. mit der aktuellen Uhrzeit vergleichen. Stellen Sie sicher, dass die Stundenwerte stets im Bereich 0 23 und die Minuten- und Sekundenwerte im Bereich 0 59 liegen. Sie dürfen bei der Implementierung der Methoden Hilfsattribute und -methoden verwenden. Aufgabe 32: Gegeben seien die Klassen class D extends C { public void ausgabe() { System.out.println("Dies ist Klasse D."); class C extends B { class B extends A { public void ausgabe() { System.out.println("Dies ist Klasse B."); class A { private void ausgabe() { System.out.println("Dies ist Klasse A."); sowie die folgenden Deklarationen und Aufrufe: A a = new A(); B b = new B(); C c = new C(); D d = new D(); a.ausgabe(); b.ausgabe(); c.ausgabe(); d.ausgabe(); Welche der Aufrufe sind zulässig? Was geben diese Aufrufe aus? 2

Aufgabe 33: In dieser Aufgabe werden die grundlegenden Konzepte der objektorientierten Programmierung behandelt. Eine rationale Zahl wird durch die Angabe eines Vorzeichens, eines Zählers ( 0) und eines Nenners (> 0) festgelegt. Beispiel: x = 122. Rationale Zahlen sollten stets gekürzt 12 gespeichert werden: x = 61. Eine rationale Zahl kann auch als gemischte Zahl dargestellt 6 werden. In dieser Darstellung wird der ganzzahlige Anteil explizit notiert: x = 10 1 6. Die Zahl 0 soll durch 0 repräsentiert werden. 1 Schreiben Sie eine Klasse RationalNumber, die eine rationale Zahl durch die drei privaten Attribute signum, numerator und denominator der Datentypen boolean bzw. int repräsentiert. Neben diesen Attributen soll Ihre Klasse mindestens die folgenden Methoden enthalten: a) Konstruktoren: Der parameterlose Konstruktor RationalNumber() initialisiert das Objekt durch die Zahl 0. Der Konstruktor RationalNumber(boolean signum, int numerator, int denominator) setzt die rationale Zahl auf die entsprechenden Parameterwerte. b) Get- und Set-Methoden: Die folgenden Methoden sollen die jeweiligen Attribute als Ergebnis liefern bzw. die entsprechenden Attribute setzen: getsignum() getnumerator() getdenominator() setrationalnumber(boolean signum, int numerator, int denominator) c) Überlagerung von Methoden der Klasse Object: Die Methode tostring() soll die aktuelle Zahl als gemischte Zahl liefern. Die Methode equals(object o) soll den Parameter mit dem aktuellen Objekt vergleichen. Die Methode clone() soll ein neues Objekt der Klasse RationalNumber mit der Zahl des aktuellen Objekts liefern. d) Rechenmethoden: Die Methode RationalNumber add(rationalnumber x) soll den Parameter zum aktuellen Objekt addieren und die Summe als Ergebnis liefern. Entsprechende Methoden soll es für die Subtraktion, Multiplikation und Division geben. e) Freiwillige Zusatzaufgabe: Implementieren Sie die Methode compareto der Schnittstelle Comparable, die den Parameter der Methode compareto und das aktuelle Objekt hinsichtlich ihrer Größen vergleicht. Stellen Sie sicher, dass eine Zahl stets gekürzt, der Zähler stets 0 und der Nenner stets > 0 ist. Sie dürfen bei der Implementierung Hilfsattribute und -methoden verwenden. 3

Aufgabe 34: Gegeben sei die folgende abstrakte Klasse: abstract class Figur implements Comparable { abstract double inhalt(); abstract double umfang(); public int compareto(object object) {... Vervollständigen Sie die Methode public int compareto(object object), sodass die zugehörigen Figuren nach der Größe ihres Flächeninhalts verglichen werden. Schreiben Sie dann zunächst zwei konkrete Klassen Dreieck und Kreis, die jeweils die abstrakte Klasse Figur erweitern. Ein Dreieck wird durch drei Punkte, ein Kreis durch einen Punkt (Mittelpunkt) und den Radius festgelegt. Die Klassen sollen entsprechende Konstruktoren enthalten. Verwenden Sie für Punkte Objekte der Klasse Punkt. Zudem sollen die Klassen Dreieck und Kreis die Methoden equals, tostring und clone der Klasse Object überlagern sowie get- und set-methoden enthalten. Hinweis: Der Flächeninhalt A eines Dreiecks kann mit der sog. Heron-Formel berechnet werden: A = s(s a)(s b)(s c) mit s = 1 (a + b + c). a, b und c sind in der Formel die Seitenlängen des Dreiecks. 2 Testen Sie Ihre Klassen, indem Sie eine Klasse Test schreiben, die Testfälle für die Methoden enthält. Für die get- und set-methoden brauchen Sie keine eigenen Testfälle zu schreiben. Beispiel: Der Flächeninhalt und der Umfang des Dreiecks mit den Eckpunkten (0.0, 0.0), (3.0, 0.0) und (0.0, 4.0) und des Kreises mit dem Mittelpunkt (5.0, 5.0) und dem Radius 1.0 sollen wie folgt berechnet werden können: Punkt p1 = new Punkt(0.0, 0.0), p2 = new Punkt(3.0, 0.0), p3 = new Punkt(0.0, 4.0), p4 = new Punkt(5.0, 5.0); double r = 1.0; Figur f = new Dreieck(p1, p2, p3); System.out.printf("%9.5f%n", f.inhalt()); // Erwarteter Wert: 6.00000 System.out.printf("%9.5f%n", f.umfang()); // Erwarteter Wert: 12.00000 f = new Kreis(p4, r); System.out.printf("%9.5f%n", f.inhalt()); // Erwarteter Wert: 3.14159 System.out.printf("%9.5f%n", f.umfang()); // Erwarteter Wert: 6.28319 Welchen Flächeninhalt und welchen Umfang besitzt das Dreieck, das aus den Punkten ( 2.250, 7.375), (0.500, 0.500) und (3.750, 7.625) besteht? Beispielsweise besitzen Dreiecke, die aus denselben Punkten bestehen, die aber dem Kontruktor in unterschiedlichen Reihenfolgen übergeben werden, den gleichen Inhalt sowie den gleichen Umfang. Bei einer fehlerhaften Eingabe (zum Beispiel einem negativen Radius) soll das Programm eine entsprechende Meldung ausgeben. Zur Lösung dieser Aufgabe dürfen Sie Methoden der Klasse Math verwenden, aber keine Klassen importieren. Sie können natürlich den Klassen weitere Attribute und Methoden hinzufügen.

Aufgabe 35: In dieser Aufgabe geht es um die extends-beziehung von Klassen. Eine reelle Funktion f : R R bildet eine Zahl x R auf ihren Funktionswert f(x) R ab. In Java kann eine solche Funktion durch eine Methode mit dem Kopf double f(double x) näherungsweise realisiert werden. Gegeben sei die folgende abstrakte Basisklasse Funktion: p u b l i c abstract c l a s s Funktion { p u b l i c abstract double f ( double x ) ; p u b l i c abstract double g ( double x ) ; p u b l i c void t a b e l l e ( ) {... p u b l i c void newton ( double s ) {... a) Eine Funktion f : R R kann in einer Wertetabelle dargestellt werden, die für einige x-werte in regelmäßigen Abständen jeweils den Funktionswert f(x) auflistet. Definieren Sie in der Klasse Funktion die konkrete Methode tabelle, die eine solche Wertetabelle von einem kleinstem x-wert bis zu einem größten x-wert mit einem definierten Abstand zwischen zwei x-werten ausgibt. Wie Sie diese drei Werte der parameterlosen Methode tabelle() mitteilen, bleibt Ihnen überlassen. Beispielsweise können Sie der Basisklasse Funktion Attribute und weitere Funktionen hinzufügen. Die Signaturen der Methoden f, g, tabelle und newton dürfen aber nicht verändert werden. b) In der Veranstaltung wurde das Newton-Verfahren zur Bestimmung von Nullstellen von Funktionen vorgestellt. Definieren Sie in der Klasse Funktion die konkrete Methode newton, die das Newton-Verfahren umsetzt. Der Parameter double s ist der Startwert des Algorithmus. Die abstrakte Funktion g darf die Ableitung von f sein. c) Eine Parabel ist eine Funktion der Form f(x) = ax 2 + bx + c mit a, b, c R. Definieren Sie eine Klasse Parabel, die von der Klasse Funktion abgeleitet ist und deren Konstruktor a, b und c akzeptiert. d) Wählen Sie eine Parabel aus, für die Sie eine Wertetabelle ausgeben und eine Nullstelle bestimmen. Geben Sie außerdem für die Funktion f(x) = 2x 3 20x 2 6x + 30 eine Wertetabelle aus und bestimmen Sie zwei der drei Nullstellen dieser Funktion. Eine mögliche Wertetabelle dieser Funktion ist f(1.0) = +6.0000 f(1.1) = +1.8620 f(1.2) = -2.5440 f(1.3) = -7.2060 f(1.4) = -12.1120 f(1.5) = -17.2500 f(1.6) = -22.6080 f(1.7) = -28.1740 f(1.8) = -33.9360 f(1.9) = -39.8820 f(2.0) = -46.0000 Hinweis: Eine Nullstelle von f ist näherungsweise 1.142990.

Pflichtaufgabe 36: (40 Punkte) In dieser Aufgabe soll das Kampfsystem der vorherigen Aufgabe wiederum erweitert werden. Außerdem soll das Kampfsystem nun als Bestandteil eines größeren Spiels verwendet werden, dessen Ziel das Entkommen aus einem Labyrinth ist. Es sollen zwei Teilaufgaben gelöst werden: a) (Vererbung) Schauen sie sich nochmal ihre Klassen Player und Monster aus der vorherigen Aufgabe an. Diese beiden Klassen verfügen über viele Gemeinsamkeiten. Lagern sie diese Gemeinsamkeiten in eine eigene Klasse Character aus und leiten sie von dieser Klasse die Klassen Player und Monster ab. Überlegen sie sich, was nun aus Monster und Player alles entfernt werden kann, da es schon in der Oberklasse passend vorhanden ist und passen sie Player und Monster dementsprechend an. Als nächstes soll etwas mehr Abwechslung in die Gegner gebracht werden. Überlegen sie sich zwei verschiedene Gegnertypen, die sich entweder im Angriffsverhalten oder in der Art, wie sie Schaden nehmen, von der Klassen Monster und untereinander unterscheiden sollen. Möglichkeiten sind z. B.: Der neue Gegnertyp greift manchmal nicht sofort an, sondern lädt sich eine Runde auf und greift dann mit 2,5-facher ATK an. Der neue Gegnertyp nimmt von normalen Angriffen nur 0,5-fachen Schaden, aber von Fähigkeiten 1,5-fachen Schaden. Leiten sie von Monster zwei Klassen für diese Gegnertypen ab und implementieren sie das Verhalten, welches sie sich überlegt haben. Welche Methoden müssen sie anpassen? Können sie ihre Ideen ohne zusätzliche Methoden und Attribute implementieren? Reicht es, Methoden aus der Oberklasse zu überladen? Müssen auch andere Klassen angepasst werden? Denken sie während der Implementierung über diese Fragen nach. Passen sie außerdem ihr Kampfsystem so an, dass nun auch die neuen Monstertypen als Gegner auftreten können. b) (Eigener Klassenentwurf und Arrays) In dieser Aufgabe soll das Spiel zu einem einfachen Dungeon Crawler werden. Es gibt ein zweidimensionales rechteckiges Spielfeld, welches aus mehreren einzelnen Feldern besteht, die in Zeilen und Spalten angeordnet sind, vergleichbar mit einem Schachbrett. Diese Felder sind entweder betretbar (z. B. offenes Gelände) oder nicht betretbar (z. B. Mauern, Berge etc.). Der Spieler startet auf einem vom Spielfeld festgelegtem Feld. Ziel des Spiels ist es, ein vom Spielfeld vorher festgelegtes Zielfeld zu erreichen. Dabei gibt es verschiedene Arten von betretbaren Feldern: Heilbrunnen stellen HP und AP des Spielers wieder her. Schmieden erhöhen dauerhaft die ATK des Spielers. Kampffelder lösen einen Kampf gegen einen Gegner aus (mit dem Kampfsystem der vorherigen Aufgaben). Auf freien Feldern passiert nichts Besonderes. 6

Es kann auch noch weitere Feldtypen geben, aber dies sind die vorgeschriebenen. Der Spieler kann sich jede Runde von seinem aktuellen Feld nach Norden, Süden, Osten und Westen auf eines der Nachbarfelder, die sich mit dem aktuellen Feld eine Kante teilen, bewegen. Voraussetzung: Das jeweilige Nachbarfeld ist betretbar. Schreiben sie eine Klasse Level, welche solch ein Spielfeld repräsentiert und die auch die Position des Spielers auf diesem Spielfeld verwaltet. Ihre Klasse Level muss über einen Konstruktor public Level(char[][] mapdata) verfügen. mapdata ist dabei ein 2D-Array, welches den Levelaufbau enthält. Die Feldtypen sind dabei durch verschiedene Zeichen gegeben: Freie Felder sind durch. gekennzeichnet. Schmieden sind durch T gekennzeichnet. Heilbrunnen sind mit O markiert. Kämpfe finden auf Feldern mit B statt. Das Startfeld ist mit S markiert und das Ziel mit Z. Nicht betretbare Felder sind mit x oder # markiert. Sie können auch weitere Zeichen für die einzelnen Felder nehmen, die oben vorgegebenen Zeichen müssen jedoch als ihr entsprechendes Feld behandelt werden. 7

Ein Beispiel für ein Spielfeld und den passenden Aufruf des Konstruktors von Level wäre z. B. char[][] mapdata = { { x, x, B, x, x, { x,., T, B, x, { x, S, x, O, Z, { x, x, x, x, x ; Level m = new Level(mapData); Ihre Klasse muss mit Spielfeldern verschiedener Größen funktionieren! Das Spielfeld ist nicht immer vier Zeilen und fünf Spalten groß! Schreiben sie eine weitere Klasse Crawler, welche die main-methode enthält und implementieren sie folgenden Spielablauf: Ausgeben der Karte auf der Konsole mit Markierung der aktuellen Spielerposition (z. B. mit einem P ). Die Startposition ist durch das Spielfeld vorgegeben. Einlesen einer Bewegungsrichtung: Es sollen nur betretbare Nachbarfelder vorgeschlagen und akzeptiert werden. Ändern der Position des Spielers. Behandeln des neu betretenen Feldes (Heilung, Kampf etc.). Falls das betretene Feld das Zielfeld war, dann soll das Spiel beendet und dem Spieler gratuliert werden. Falls der Spieler ein Kampffeld betreten hat und besiegt wurde, so soll das Spiel sich beenden und eine Game Over -Meldung ausgegeben werden. Ansonsten fange wieder mit der Ausgabe der Karte oben an. Überlegen sie sich, welche Methoden sie für die Klasse Level bereitstellen sollten, um die Implementierung der Spielelogik einfach und übersichtlich zu halten. (Hinweis: Was ist z. B. mit betretbaren Nachbarfeldern?) Überlegen sie sich auch, wie sie einige Fragen, die hier in der Aufgabe offen gelassen wurden, behandeln wollen (z. B. ob Brunnen mehrmals verwendbar sind, wie die Gegnerauswahl für die Kämpfe funktioniert etc.). Sie dürfen bei Bedarf auch die Musterlösung der letzten Pflichtaufgabe als Basis verwenden. 8