Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Solitär zug rückgänig machen (https://www.delphipraxis.net/158450-solitaer-zug-rueckgaenig-machen.html)

xxsasch4xx 18. Feb 2011 07:29

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.

http://www.solitaer-knacker.de/

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.

WM_CLOSE 18. Feb 2011 07:36

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.

xxsasch4xx 18. Feb 2011 07:43

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?

WM_CLOSE 18. Feb 2011 08:07

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;

himitsu 18. Feb 2011 08:09

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.

Memnarch 18. Feb 2011 11:32

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

stahli 18. Feb 2011 11:58

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.

Memnarch 18. Feb 2011 13:27

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 00:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz