Autor Beitrag
Myrrh
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 14.05.12 02:05 
Hallo liebe Mitprogrammierer~
Ich bin zwar neu hier im Forum, aber ich hoffe, dass das Thema hier nicht fehl am Platze ist.

Also, wie der Titel schon verrät versuche ich ein Brettspiel nachzubauen. Das Problem was ich grade habe ist allerdings logischer Art.

Das Feld besteht, im Gegensatz zu den meisten anderen Brettspielen, aus einigen verzweigten Wegen, die vor- und rückwärts abgegangen werden können.

D.h. ich habe nach sagen wir 10 Feldern einen verzweigten Weg, der sich nach links und rechts aufteilt.

Normalerweise könnte ich ja einfach alle Felder durchnummerieren und der 'Spielfigur' eine entsprechende Positionsvariable zuweisen, die dem Feld entspricht, auf dem sie sich grad befindet. Nun habe ich aber zwei Felder, die (der Reihenfolge nach gesehen) beide die Nummer 11 tragen würden. Mir fällt grade partout keine andere Art ein, ein Spielfeld über Zahlen in einem Programm zu definieren, Ich muss ja mittels dem Würfelergebnis (2W6) in der Lage sein, jedes Feld 'ausrechnen' zu können.

Hat da zufällig jemand Erfahrung mit, bzw. einen spontanen Einfall, wie man ein solches Spielfeld definieren und abfragen kann?

Danke im Voraus schonmal an alle, die sich Gedanken machen.

Myrrh~
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Mo 14.05.12 07:07 
Hallo Myrrh und :welcome:

Du kannst am "linken" Weg einfach 100 dazuzählen und am "rechten" Weg z.B. 200.
Dann hast Du für jeden Weg weitere 90 Felder zur Verfügung.

Oder:

Du kannst in der Tag-Eigenschaft des Controls eine Kennung setzen, die Dir den Weg weist.

Da gibt es sicherlich viele Möglichkeiten.

_________________
Gruss
mats74
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mo 14.05.12 09:34 
Du kannst auch jedem Feld eine eindeutige Nummer zuordnen (Reihenfolge ist erstmal egal, du kannst auch X und Y Koordinaten hernehmen).

Jetzt ist es interessant, ob jedes Feld nur in einer Richtung begehbar ist. Falls das so ist, kannst du in jedes Feld zwei Listen einbauen: Vorgänger und Nachfolger. Wenn du jetzt auf einem Feld stehst, und eine 8 würfelst kannst du relativ schnell ausrechnen, welche Felder genau 8 Züge entfernt sind.

Falls die Felder in beiden Richtungen begehbar sind, wird die Suche ein kleines bisschen aufwändiger: Du musst darauf achten, dass ein Feld in dem Weg nicht zweimal vorkommen darf. (Man darf nicht einfach "umdrehen" und wieder zurück zum Start gehen)

Falls du in diese Geschichte tiefer einsteigen willst: Dieses Ansatz nennt sich Graph ( de.wikipedia.org/wik...aph_(Graphentheorie) ) und ist ein sehr mächtiges Werkzeug. (Mit anderen Worten: Am Anfang schwer zu verstehen, aber damit lässt sich das Problem auf jeden Fall lösen...)
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 14.05.12 09:55 
Und das rekursive Durchlaufen eines Graphes nach der Versuch-und-Irrtum-Methode nennt sich Backtracking.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 14.05.12 10:08 
Naja, wenn man hier mit Graphen anfängt, dann wird aber noch kein Backtracking gebraucht. Alle Felder (Knoten), die x Schritte entfernt sind, bekommt man über eine normale Breiten- oder Tiefensuche. Das geht auch ohne Rekursion und Trial&Error. :)

Wenn das Spielfeld beliebig aussehen kann, würde ich auch einen Graph-Ansatz empfehlen. Ein "Feld" hätte dann z.B. für jedes Nachbarfeld einen Eintrag. Das kann in Form einer Liste passieren, wenn es beliebig viele geben kann, oder einfacher vier einzelne Variablen "NachbarOben", "NachbarUnten", usw. Das wäre dann eine einfache Graphstruktur.

Zum Ausrechnen der erlaubten Felder dann eine Breitensuche, in der du dir die Entfernung vom Startknoten merkst, und so die "erlaubten Felder" ermittelst.

_________________
We are, we were and will not be.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mo 14.05.12 11:42 
Das mit dem Ansatz von X-Y-Koordinaten für die Felder ist schon ganz gut. Kann auch bei 3D-Spielen dann auf X-Y-Z erweitert werden. Dann sollte jedes Feld einen Nachfolger bzw. Vorgänger bekommen. Dann kannst Du rekursiv von Feld zu Feld wandern. Sowohl vor, als auch zurück.

Da wäre es sinnvoll, das Feld als Objekt zu definieren. Dann kannst Du den Nachfolger/Vorgänger dort einbinden, mit dem jeweiligen Sprungkriterium (z.B. Feld(1,1) mit 6 nach Feld(2,2), ansonsten nach Feld(2,1) ....) Dazu benötigst Du eine Sprungroutine im Objekt Feld.

Beim Sprung von Feld zu Feld reduzierst Du dann jeweils die Würfelzahl um einen Punkt, und arbeitest die Sprungroutine des Nachfolgerfeldes ab bis der Wert der Würfelzahl 0 ist. Das sollte dann funktionieren.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.