Entwickler-Ecke

Dateizugriff - Speichern eines Arrays von Verbunden mit integriertem Array


Necroscope - Mo 05.03.07 23:01
Titel: Speichern eines Arrays von Verbunden mit integriertem Array
Für ein Informatikprpjekt haben wir ein Brettspiel nachprogrammiert.
Ich wollte nun die FUnktion einbauen, das SPiel zu speichern und später wieder neu laden zu können.
Dazu müssten folgende Dinge gespeichert werden.

Das Brett hat 64 Felder. Wir haben einen Datentyp TSpielfeld.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
    TSpielfeld = record
      Position:TPoint;
      Ebene:array[1..5]of Tfarbe;        {die Felder können Spielsteintürme bis zu einer Höhe von 5 
                                          Steinen beinhalten und das Feld ist nicht ganz 
                                         quadratisch. Die Felder in den Ecken fehlen jeweils, daher "Benutzbar"}

      Benutzbar:Boolean;
      end;
    Tfarbe=(rot,gruen,gelb,blau,leer);   {Spielsteinfarben}

    Tspielerstatus = record
      reserve,verloren:integer;
      amZug:Boolean;
    end;


Nun müsste das Array Feld[1..64of TSpielfeld und Spielerstatus von Spieler1,SPieler2,SPieler3 und SPieler4 sowie 2 Boolean gespeichert werden. (Boolean: THAnz,VierSp)

Das Problem was mich am meisten beshcäftigt ist, dass nach erfolgreichem Laden Feld[1..64] mit dem gespeicherten Wert abgeglichen wird.

Meine makabren und Source-vergewaltigenden Verscuhe möchte ich euch hier gar nciht erst posten, darum bitte ich um komplett neue Ideen.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


MrFox - Di 06.03.07 00:22

Um das Spiel zu speichern, würde ich das ganze Array in einen Stream (TFileStream) packen.

Für TSpielfeld würde ich eine Methode "WriteToStream(stream: TStream)" einführen, die dann alle Daten in den Stream
schreibt. Beim Speichern wird dann das ganze Array durchlaufen und jedes Spielfeld in den Stream geschrieben.

In der Methode WriteToStream werden die Daten so in etwa in den Stream geschrieben:


Delphi-Quelltext
1:
stream.Write(Position, sizeof(Position));                    


Zum Laden braucht man dann noch eine "ReadFromStream" Funktion mit der man das Umgekehrte wie beim Speichern macht.

Mit den Spielern kann man ähnlich verfahren. Und für die Eigenschaft Ebene des Spielfelds muss man natürlich auch nochmal jede Ebene einzeln durchlaufen.

Mfg Julian


Narses - Di 06.03.07 01:28

Moin!

In diesem speziellen Fall scheint mir eine INI-Datei sicher auch eine gute Lösung zu sein. Such mal nach Suche in: Delphi-Forum, Delphi-Library TINIFILE, gibt´s genug Source zu. ;) Hat nämlich den Vorteil, dass es leichter zu debuggen ist (was nicht ganz unwichtig ist, wenn man mit FileIO noch nicht soo firm ist... :D)

Ach ja: irgendwie kann ich mit dem Titel dieses Topics nicht wirklich was anfangen... :?!?:

cu
Narses


jasocul - Di 06.03.07 09:09

Hallo,

bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien [http://www.entwickler-ecke.de/richtlinien.html]:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

Viele Grüße,
Peter


Necroscope - Di 06.03.07 22:16

Ja danke erstmal für die Hilfe
Jetzt noch ne andere Frage

Wenn ich per Netzwerkmodus 2 dieser Feld Variablen vershcicken will, wie mach ich das am besten?

Also Auswahl und Zioel damit der dann auf dem anderen Computer nen Zug macht


JayEff - Di 06.03.07 22:43

Dazu musst du dir ein Protokoll schreiben... Aber grundsätzlich gilt:
Das hat nichts mit der ersten Frage zu tun, darum: Neue Frage - Neuer Thread, bitte! :mahn: Das hat den Sinn, dass ein Suchender nicht lauter "Ich hab 6 Fragen:" und "537 Probleme, bitte helft!" Themen findet ;)
Der Vollständigkeit halber trotzdem: Ein Protokoll ist in dem Fall eine Regel, nach der du Nachrichten überträgst, die dein Programm auslesen kann. Hast du zum Beispiel einen Record wie den Folgenden:

Delphi-Quelltext
1:
2:
3:
4:
type XY = record
    Name:String;
    wert1, wert2: Integer
end;

dann wäre ein sinnvolles Protokoll vielleicht

Quelltext
1:
#XY: $Name="DiesIstDerName" $wert1="123" $wert2="321"#                    

mit # machst du klar, dass nun eine Nachricht an dein Programm folgt, XY sagt, welcher Record übertragen wird. $ sagt: jetzt kommt ein Variablenname! = sagt: nun kommt der Wert der Variable! und das abschließende # sagt: Ende der Übertragung.
Die Auswertung musst du selbst programmieren, natürlich ;)


Gut wäre es, wenn du ein neues Thema erstellen würdest, das diese Frage behandelt, und dann meinen Post hier zitieren würdest. Das würde der Übersichtlichkeit sehr beitragen. :)