![]() |
Solitär zug rückgänig machen
Ich habe ein Programm geschrieben Solitär [Brettspiel], in welchem man durch das überspringen eines benachbarten Spielsteins in ein freies Feld springen kann. Der Übersprungende Spielstein wird dann gelöscht. Ich wollte mein Programm jetzt in sofern erweitern, dass ich 2 Buttons habe in den man Züge wieder rückgängig machen kann. Es soll möglich sein, dass man den gesamten Spielverlauf wieder rückgängig machen kann. Mit jedem Klick auf den Zurück Button soll also der letzte Zug wieder zurück gesetzt werden.
Zusatzinfo: Ich habe meinen 33 Image Komponenten Hints zugewiesen als Hinweis dafür ob da ein Bild ist oder eine freie Stelle. z.B.: Bild1 hat den Hint1 das heißt dort befindet sich ein Spielstein. Bild2 hat den Hint0, das heißt dort befindet sich eine freie Stelle. Ich lade die beiden Bilder (Freie Stelle & Spielstein) beim Start des Programmes über ein array in die Imagekomponenten. ![]() Hier ist ein Beispiel, sowie ich es am Ende gerne hätte. (Die beiden Buttons für das Zurück und vorwärts befinden sich unter dem Spielfeld) Ich habe es bis jetzt hinbekommen genau einen Zug rückgängig zu machen, aber ich weiß nicht wie ich den gesamten Spielverlauf speichern und quasi rückwärts ausführen kann. Danke schon mal im Vorraus. |
AW: Solitär zug rückgänig machen
Es goibt 2 Möglichkeiten:
1. Du speicherst allles was der Benutzer gemacht hat //--> fehleranfällig 2. Du speicherst dir Jede Runde den gegenwärtigen Spiel(zu)stand (in eineem Record). Den Record kannst du dann in einer Liste verwalten. |
AW: Solitär zug rückgänig machen
Wie speicher ich das in ein Record?
Hab mit dem Record noch nicht soviel Erfahrung. Kannst du vieleicht einen Code Ansatz liefern? |
AW: Solitär zug rückgänig machen
Als erstes solltest su alle Informationen, die relevant für das Spiel sind
in einem Record speichern: Hier ein Beispiel
Delphi-Quellcode:
type
TFeldStatus=(fsNichtBesetzt, fsBesetzt, fsNichtVorhanden); type TSpielStatus=record Felder:Array [7, 7] of TFeldStatus; //sonstige Eigenschaften des spiels z.b. Anzahl der Züge o.Ä end; pSpielStatus=^TSpielStatus; type TSpiel=class private SpielStatusListe:TList; AktuellerSpielStatus:pSpielStatus; public constructor Create; end; implementation constructor TSpiel.Create; begin SpielStatusListe:=TList.Create; New(AktuellerSpielStatus); SpielStatusListe.Add(AktuellerSpielStatus); end; procedure Zurueck(); begin AktuellerSpielStatus:=SpielStatusListe[Pred(SpielStatusListe.IndexOf(AktuellerSpielStatus))]; end; procedure Vor(); begin AktuellerSpielStatus:=SpielStatusListe[Succ(SpielStatusListe.IndexOf(AktuellerSpielStatus))]; end; |
AW: Solitär zug rückgänig machen
Es muß kein Record sein.
Du mußt nur "irgendwo" Speichern was gerade wo eingestellt ist. Diese Speicherpunkte kommen in irgendeine Liste. Nun kannste zurückgehn, dir einen Speicherpunkt aus dieser Liste rausholen und alles so einstellen, wie es da gespeichert war und schon ist der alte Zustand wiederhergestellt. |
AW: Solitär zug rückgänig machen
Ich würds so machen:
Jedesmal wenn der spieler mti einer >Figur springt(also ein Zug gemacht wird), speicher einfach von Wo nach WO gezogen und welches feld übersprungen wurde(was man auch eig. implizit aus dem sprungweg bekommt). Beim wieder herstellen wird einfach von WO nach WO umgekehrt(Figur also von aktuellem "Wo" zum alten "Wo" und auf em übersprungenen Feld wird eine neue Figur erstellt die die alte repräsentiert. WICHTIG: Solange der User vor und zurück "spult" brauchst du nichts machen. Hat der User aber gespult und macht dan einen zug, muss der gesamte Log von diesem Zug an gelöscht werden. Also z.B. Spieler hat 10 Züge gemacht. Spult auf zug 5 zurück und macht einen neuen Zug. Die alten Züge 6-10 müssen gelöscht werden und erst dann darf der "neue" 6. Zug gespeichert werden. MFG Memnarch |
AW: Solitär zug rückgänig machen
Memnarchs Ansatz hat aber dann Grenzen, wenn z.B. mit jedem Zug eines Spielers noch verschiedene Aktionen vom Programm berechnet werden (Zwischenergebnisse, Spieloptionen, Spielerzustände, Rangfolgen usw.).
Diese müssten dann ebenfalls mit "rückwärts gerechnet" werden, was gar nicht immer möglich ist. In solchen Fällen müsste man alternative Lösungen anwenden. |
AW: Solitär zug rückgänig machen
@Stahli: Öh...Solitär als Brettspiel ist ein Einzelspielerspiel o.O. Dementsprechen ist der verlauf total Linear.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz