AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Solitär zug rückgänig machen

Ein Thema von xxsasch4xx · begonnen am 18. Feb 2011 · letzter Beitrag vom 18. Feb 2011
Antwort Antwort
xxsasch4xx

Registriert seit: 1. Mär 2010
210 Beiträge
 
#1

Solitär zug rückgänig machen

  Alt 18. Feb 2011, 08:29
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.
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#2

AW: Solitär zug rückgänig machen

  Alt 18. Feb 2011, 08:36
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.
  Mit Zitat antworten Zitat
xxsasch4xx

Registriert seit: 1. Mär 2010
210 Beiträge
 
#3

AW: Solitär zug rückgänig machen

  Alt 18. Feb 2011, 08:43
Wie speicher ich das in ein Record?
Hab mit dem Record noch nicht soviel Erfahrung.
Kannst du vieleicht einen Code Ansatz liefern?
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Solitär zug rückgänig machen

  Alt 18. Feb 2011, 09:07
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

AW: Solitär zug rückgänig machen

  Alt 18. Feb 2011, 09:09
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#6

AW: Solitär zug rückgänig machen

  Alt 18. Feb 2011, 12:32
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
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Solitär zug rückgänig machen

  Alt 18. Feb 2011, 12:58
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#8

AW: Solitär zug rückgänig machen

  Alt 18. Feb 2011, 14:27
@Stahli: Öh...Solitär als Brettspiel ist ein Einzelspielerspiel o.O. Dementsprechen ist der verlauf total Linear.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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