Zum Inhalt springen

[C#] Automatische "Wegfindung"


Gateway_man

Empfohlene Beiträge

Grüßt euch,

 

ich bin auf der Suche nach Inspiration und Ideen :).

Folgende Aufgabenstellung:

Es ist ein Labyrinth gegeben, das einen beliebigen Aufbau hat. Es gibt einen "KI Player" der zu Beginn immer in der Mitte platziert wird.

Jetzt soll die "KI Player" Instanz alleine alle erreichbaren Punkte im Labyrinth ablaufen. (Ohne schummeln, das heißt durch Wände springen ;))

Ich hatte mir überlegt das ich mit einer Rastersuche arbeite. Das heißt ausgehend von der aktuelle Position des KI Spielers ermittle ich alle umliegenden Punkte. Befindet sich dort ein noch nicht besuchter Punkt, so wird ein passender Weg ermittelt (bei diesem Punkt bin ich mir über die technische Umsetzung noch nicht so ganz im klaren), Ist jeder der Punkte bereits besucht, so wird der Suchraster erweitert.

 

Ich habe aktuell das Gefühl, das ich viel zu kompliziert gedacht habe. Wie würdet Ihr das ganze angehen?

 

Beste Grüße

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

@sas86ks: Danke ich schau es mir mal an.

@MartinSt: Es ist keine Aufgabe aus dem betrieblichen Alltag. Stell dir einfach ein Packman Spiel ohne Gegner vor.

Das Labyrinth existiert schon. Man kann es auch selbst ablaufen, jedoch fehlt jetzt noch die Möglichkeit, das die Spielfigur das auch autonom machen kann.

In der Aufgabenstellung selbst steht, wie man es machen könnte. Jedoch enthält diese Beschreibung mehrere Gedankliche Fehler. Wenn ich das so machen würde, dann würde ich irgendwann in einer Endlos Schleife landen oder es würde einfach nicht mehr weitergehen.

Aber ich kann gerne die Aufgabenstellung inklusive des "möglichen" Lösungsvorschlags hier zitieren:

Zitat

 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 System.Drawing.Point zur Speicherung der Koordinaten in den Collections-Datenstrukturen, da diese Klasse bereits die für die Hashtable benötigten Methoden Equals und GetHashCode implementiert. 

 

 

Beste Grüße

Gateway

Bearbeitet von Gateway_man
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, das nehme ich nicht an. Wenn ich immer nach rechts gehe, komme ich irgendwann in eine Sackgasse. Dort drehe ich um, komme zurück an die Abzweigung und laufe dann wieder rechts -> Geradeaus vom Originalweg. Das ganze wiederholt sich und somit laufe ich dann links vom Originalweg aus gesehen.

Sollte es mal nur geradeaus und links geben, so fällt einfach das erste drittel weg. ich laufe gerade, drehe irgendwann um, und komme dann zurück an die Abzweigung. Dort laufe ich dann rechts -> Also praktisch links von der Originalposition aus gesehen.

Es ist sehr unperformant und langsam, aber es kommt definitiv an alle erreichbaren Stellen.

Ich hoffe ich habs hlbwegs verständlich erklärt. Ist doof, ohne Zeichnung xD.

Sollte so funktionieren, oder habe ich einen Denkfehler?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mal so als nicht zu Ende gedachte Idee:

Mit einer Rekursion kannst du einfach alle erreichbaren Felder auffinden. Dabei kannst du deine Spielfigur auch direkt darstellen, dass sie immer im aktuell untersuchtem Feld steht und diese somit durch das Labyrinth wandert.

Das Problem ist aber, dass wenn du an das Ende eines Pfades kommst welche den aktuellen Rekursionslauf beenden würde du einen Sprung der Spielfigur zum letzten Feld hättest an dem es mehr als eine mögliche Richtung gibt und von dem dann die Rekursion fortgesetzt wird. Das heißt du müsstest im Fall einer Sackgasse die Rekursion (irgendwie) wieder Rückwärts bis zur letzten Kreuzung laufen lassen und von da an dann wieder ganz normal weiter in die nächste Richtung...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am ‎16‎.‎12‎.‎2016 um 10:14 schrieb Mttkrb:

Hi,
bei diesem Beispiel sollte die Methode nicht klappen.

Beispiel.PNG

An sowas hab ich gar nicht gedacht.

Danke :) Wieder etwas schlauer geworden.

 

Am ‎16‎.‎12‎.‎2016 um 10:36 schrieb Ulfmann:

Genau sowas mein ich :) 

Nach nochmaligen Lesen hab ich deine Anmerkung verstanden Ulfmann. Manchmal ist man einfach blind. Sorry

Bearbeitet von Chiyoko
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde das so lösen:

  1. Man bildet alle Wege in einem Baum ab. Der Startpunkt ist hierbei die Wurzel.
  2. Nun wird für jedes erreichbare Feld um den Spieler als ein Knoten hinzugefügt.
  3. Anschließend wird jeder Knoten weiter abgearbeitet, also jedes erreichbare Feld um den Knoten an diesen wiederum an den Knoten angehängt.
  4. Dies wiederhole man so lange, bis das Ziel erreicht ist.
  5. Die verbundenen Knoten an den Kanten Start-Ziel stellen nun die zu gehenden Felder von Start bis Ziel dar.
  6. Das ganze dann wiederholen, bis alle Punkte erreicht wurden

Um das zu optimieren, kann man noch die "Himmelsrichtung" hinzufügen und sich nur in diese bewegen. Also, wenn sich das Ziel rechts befindet, arbeite nur die Felder nach rechts ab. Muss dann aber auch rückgängig funktionieren, falls man in eine Sackgasse läuft.

 

Bearbeitet von pr0gg3r
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...