Programm in C#
Schreiben Sie ein Programm, das ein Labyrinth von der Kommandozeile einliest und
graphisch darstellt.
Das Labyrinth ist in der Datei [login to view URL] mit dem folgenden Inhalt abgelegt:
19
13
###################
#.................#
#.#.###.#.#.###.#.#
#.#.#...#.#...#.#.#
#.#.###.#.#.###.#.#
#.................#
#.#.#.### ###.#.#.#
#.................#
#.#.###.#.#.###.#.#
#.#.#...#.#...#.#.#
#.#.###.#.#.###.#.#
#.................#
###################
Der Wert in der ersten Zeile gibt die Anzahl der Spalten, der Wert in der zweiten Zeile die
Anzahl der Zeilen an. Danach folgt das Labyrinth, wobei die Zeichen '#' Wände darstellen.
Die '.' sind aufzusammelnde “Items”. Der Aufruf des Programms
[login to view URL] < [login to view URL] stellt das Labyrinth graphisch dar, beispielsweise wie in der Abbildung gezeigt: siehe Datei
Die Spielfigur – hier durch das Zeichen '@' charakterisiert – soll in der Mitte des Labyrinths
platziert werden. Mit der Tastatur soll es nun möglich sein, die Spielfigur durch das
Labyrinth zu steuern, wobei die “Items” aufgesammelt (d.h. aus dem Labyrinth entfernt)
werden sollen und die Wände nicht durchdrungen werden dürfen.
Die Spielfigur soll nun alle Items in dem Labyrinth automatisch aufsammeln. Hierzu müssen
Sie einen Wegefindungsalgorithmus implementieren, wofür sich beispielsweise eine
Breitensuche gut eignet. Für die Breitensuche benötigen Sie eine Warteschlange (eine
Queue) sowie eine Hashtable (alternativ: Dictionary). Der Algorithmus lässt sich wie folgt
skizzieren:
1. füge die aktuelle Spielerposition (x,y-Koordinaten) in die leere Queue ein;
2. so lange die Queue nicht leer ist,
2.1 hole das erste Koordinatenpaar aus der Queue;
2.2 falls sich hier ein Item befindet, breche ab: die Suche war erfolgreich.
2.3 für alle direkten Nachbarn (links, oben, rechts, und unten) dieser Koordinaten:
2.3.1 falls nicht blockiert (kein '#') und noch nicht in der Hashtable enthalten:
füge den Nachbarn in die Queue ein;
füge den Nachbarn als Key und die aktuellen Koordinaten als Value in die
Hashtable ein;
2.4 weiter mit 2.
Die Hashtable enthält nun Koordinatenpaare, wobei jedes besuchte Feld als Key vorkommt.
Der zugehörige Value ist das Koordinatenpaar, von dem aus man in der Suche gekommen ist
(from). Um nun von der Spielerposition zum Ziel zu finden, müssen Sie den Weg rückwärts
in der Hashtable suchen. Hierzu eignet sich ein Stack in der folgenden Art:
1. falls ein Ziel gefunden wurde, lege die Zielposition auf den leeren Stack;
2. lese den zugehörigen Value (die vorherige Position from) aus der Hashtable;
3. so lange from nicht der Ausgangsposition entspricht:
3.1 lege from auf den Stack;
3.2 lese die vorherige Position von from aus der Hashtable und weise diese from zu;
3.3 weiter mit 3.
Für den Weg der Spielfigur zum Ziel müssen Sie nun nur noch den Stack abarbeiten.
Machen Sie sich an einem einfachen Beispiel klar, dass der Algorithmus funktioniert.
Schreiben Sie eine Klasse ComputerPlayer, die diesen Wegefindungsalgorithmus
implementiert. Die Spielfigur soll nun selbständig mit einem Timer gesteuert alle Items des
Labyrinths aufsammeln. Die Suche startet also erneut von der aktuellen Position, wenn ein
item aufgesammelt wurde. Das wird solange wiederholt, bis das komplette Labyrinth leer
gefressen ist.
Erstellen Sie auch mindestens ein eigenes Labyrinth.
Hinweis: verwenden Sie die Klasse [login to view URL] zur Speicherung der
Koordinaten in den Collections-Datenstrukturen, da diese Klasse bereits die für die
Hashtable benötigten Methoden Equals und GetHashCode implementiert.
Ich habe das College of Computer Science abgeschlossen und ich mache mehr von diesem Projekt als Aufgabe oder Mission, wenn Sie mich für dieses Angebot annehmen, dann werde ich diese Angelegenheit in weniger als 3 Tagen beenden und wenn Sie nach Algorithmen oder Strukturen fragen möchten ich werde verfügbar sein