Autor |
Beitrag |
Krypt0
      
Beiträge: 21
|
Verfasst: Di 14.10.08 17:11
Also, folgendes ist mein Konzept zum Speichern eines Spielstands in Conways Spiel des Lebens (Ich mach dieses Programm so ausführlich, weil es im Informatikunterricht bewertet wird):
Ich möchte, dass sobald der Speichern-Button gedrückt wird, dass eine Stringlist erstellt wird, für jede Zelle ein 1 für Leben bzw. 0 für tot.
diese soll nun in Form eines Textdokumentes abgespeichert werden, jedoch als Datei mit der Endung .sdl
Sobald der Laden button gedrückt wird, wird die Datei wieder abgerufen und die Zellen gefüllt / leer gelassen.
In wie fern lässt sich das realisieren und was brauche ich dafür?
dake
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 14.10.08 17:39
Moin und  im Forum!
Krypt0 hat folgendes geschrieben : | (Ich mach dieses Programm so ausführlich, weil es im Informatikunterricht bewertet wird) |
Na dann helfen wir mal nicht zu viel, sonst müsstest du uns ja was von deiner Note abgeben...
Krypt0 hat folgendes geschrieben : | In wie fern lässt sich das realisieren und was brauche ich dafür? |
Dann man los
Krypt0 hat folgendes geschrieben : | Ich möchte, dass sobald der Speichern-Button gedrückt wird, |
Einen Button auf´s Formular legen und doppelt anklicken, dann Code in die Handler-Methode einfügen.
Krypt0 hat folgendes geschrieben : | dass eine Stringlist erstellt wird, |
In der Methode eine Instanz von TStringList anlegen, natürlich vorher z.B. durch var SL: TStringList; deklarieren.
Krypt0 hat folgendes geschrieben : | für jede Zelle ein 1 für Leben bzw. 0 für tot. |
Dafür brauchst du eine Schleife, die über alle Elemente deiner (Spiel-)Welt läuft und die Werte in die Stringliste einfügt.
Krypt0 hat folgendes geschrieben : | diese soll nun in Form eines Textdokumentes abgespeichert werden, jedoch als Datei mit der Endung .sdl |
Dafür dann SL.SaveToFile('Meine Datei.sdl'); aufrufen, fertig.
Krypt0 hat folgendes geschrieben : | Sobald der Laden button gedrückt wird, wird die Datei wieder abgerufen und die Zellen gefüllt / leer gelassen. |
Wie oben, noch ein Button, Stringliste deklarieren, Instanz anlegen ( SL := TStringList.Create;), dann mit SL.LoadFromFile('Meine Datei.sdl'); die Daten holen und mit einer Schleife wieder in deine Spielwelt bringen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 14.10.08 17:42
Abgesehen davon, dass ein String nicht unbedingt das optimale Speicherformat ist, sollte das kein großes Problem darstellen. Ich würde die Zellen auf der Y-Achse durchlaufen und auf der X-Achse zu einem String zusammenfügen. Anschließend mit Stringlist.SaveTofile(Dateiname) abspeichern. Beim Laden geht das genau andersherum.
|
|
Krypt0 
      
Beiträge: 21
|
Verfasst: Di 14.10.08 18:56
Zitat: |
Dafür brauchst du eine Schleife, die über alle Elemente deiner (Spiel-)Welt läuft und die Werte in die Stringliste einfügt
|
Und wie sieht der Quelltext dafür aus?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 14.10.08 19:16
Moin!
Krypt0 hat folgendes geschrieben : | Und wie sieht der Quelltext dafür aus? |
Wie ist denn deine Welt "definiert"? Wie speicherst du, ob ein Feld belegt oder frei ist? Davon hängt der Quelltext für das Speicher/Laden ab.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 14.10.08 19:19
In etwa so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| const sTot: array[Boolean] of char = ('0','1'); var i,j: integer; sl: TStringlist; s: string; begin sl := TStringlist.Create; SetLength(s,XZellen.Count); try for i := 0 to YZellen.Count - 1 do begin for j := 0 to XZellen.Count - 1 do s[j] := sTot[tot(XZellen,YZellen)]; sl.Add(s); end; sl.SaveToFile(Dateiname); finally sl.Free; end; end; |
Ohne Gewähr, da aus dem Kopf dahergetippt.
|
|
Krypt0 
      
Beiträge: 21
|
Verfasst: Di 14.10.08 19:24
Damit ihr euch ein Bild machen könnt, was mein Programm bereits drauf hat und wie es funktioniert...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, ExtCtrls, ComCtrls, Buttons, MPlayer, TabNotBk, Menus;
type TForm1 = class(TForm) Titel: TLabel; PLAY: TButton; SchrittVor: TButton; SpawnenOK: TButton; Exit: TButton; Timer: TTimer; Edit1: TEdit; Edit2: TEdit; Erstellen: TButton; Spielfeld: TStringGrid; Geschwindigkeit: TTrackBar; GroupBox1: TGroupBox; Zellenloeschen: TButton; Loeschen: TButton; GroupBox2: TGroupBox; StaticText1: TStaticText; Edit3: TEdit; Lebensbedigungen: TButton; StaticText5: TStaticText; Edit4: TEdit; StaticText2: TStaticText; Edit5: TEdit; StaticText3: TStaticText; Edit6: TEdit; StaticText4: TStaticText; GroupBox3: TGroupBox; MainMenu1: TMainMenu; hiho1: TMenuItem; Spielstandspeichern1: TMenuItem; Spielstandladen1: TMenuItem; Beenden1: TMenuItem; Hilfe1: TMenuItem; Laden: TOpenDialog; Speichern: TSaveDialog; procedure ExitClick(Sender: TObject); procedure ErstellenClick(Sender: TObject); procedure SchrittVorClick(Sender: TObject); procedure SpawnenOKClick(Sender: TObject); procedure TimerTimer(Sender: TObject); procedure GeschwindigkeitChange(Sender: TObject); procedure PLAYClick(Sender: TObject); procedure LoeschenClick(Sender: TObject); procedure ZellenloeschenClick(Sender: TObject); procedure LebensbedigungenClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Beenden1Click(Sender: TObject); procedure Spielstandspeichern1Click(Sender: TObject);
private public end;
var Form1: TForm1; a : Array [0..49,0..49] of boolean; Zeile, Spalte : integer; Minimum ,Maximum, NeuVon, NeuBis : Integer;
implementation
{$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin minimum := 2; NeuVon := 3; NeuBis := 3; maximum := 5; end;
procedure TForm1.ExitClick(Sender: TObject); begin close; end;
procedure TForm1.Beenden1Click(Sender: TObject); begin close; end;
procedure TForm1.ErstellenClick(Sender: TObject);
begin Zeile := strtoint(edit1.text); Spalte := strtoint(edit2.text); spielfeld.cells[Zeile,Spalte] := 'x' ; end;
procedure TForm1.LoeschenClick(Sender: TObject); begin Zeile := strtoint(edit1.text); Spalte := strtoint(edit2.text); spielfeld.cells[Zeile,Spalte] := '' ; end;
procedure TForm1.SpawnenOKClick(Sender: TObject); var f,g,k :integer; begin for f:= 1 to 49 do for g:= 1 to 49 do begin k:= random(2); If k = 1 then spielfeld.cells[f,g] := 'x' ELSE spielfeld.cells[f,g]:= '';
end; end;
procedure TForm1.ZellenloeschenClick(Sender: TObject); var i,j :integer; begin for i:=0 to 49 do begin for j:=0 to 49 do begin Spielfeld.cells[i,j] := ''; a[i,j] := false; end; end; end;
procedure TForm1.SchrittVorClick(Sender: TObject);
var i,j,k,Nachbarn: integer; begin for i:=1 to 49 do begin for j:=1 to 49 do begin Nachbarn:=0;
if Spielfeld.cells[i-1,j]='x' then Nachbarn:=Nachbarn+1; if Spielfeld.cells[i-1,j+1]='x' then Nachbarn:=Nachbarn+1; if Spielfeld.cells[i-1,j-1]='x' then Nachbarn:=Nachbarn+1; if Spielfeld.cells[i+1,j]='x' then Nachbarn:=Nachbarn+1; if Spielfeld.cells[i+1,j+1]='x' then Nachbarn:=Nachbarn+1; if Spielfeld.cells[i+1,j-1]='x' then Nachbarn:=Nachbarn+1; if Spielfeld.cells[i,j+1]='x' then Nachbarn:=Nachbarn+1; if Spielfeld.cells[i,j-1]='x' then Nachbarn:=Nachbarn+1;
if Nachbarn <=minimum then a[i,j] := false; if (Nachbarn >=NeuVon)AND(Nachbarn <=NeuBis) then a[i,j] := true; if Nachbarn >=maximum then a[i,j] := false;
end; end;
for i:=1 to 49 do begin for j:=1 to 49 do begin begin if a[i,j]= true then Spielfeld.cells[i,j]:='x'; if a[i,j]= false then Spielfeld.cells[i,j]:='' ; end; end; end; end;
procedure TForm1.TimerTimer(Sender: TObject); begin SchrittVor.Click; end;
procedure TForm1.GeschwindigkeitChange(Sender: TObject); begin
IF geschwindigkeit.position = 19 then timer.interval := 100; IF geschwindigkeit.position = 18 then timer.interval := 200; IF geschwindigkeit.position = 17 then timer.interval := 300; IF geschwindigkeit.position = 16 then timer.interval := 400; IF geschwindigkeit.position = 15 then timer.interval := 500; IF geschwindigkeit.position = 14 then timer.interval := 600; IF geschwindigkeit.position = 13 then timer.interval := 700; IF geschwindigkeit.position = 12 then timer.interval := 800; IF geschwindigkeit.position = 11 then timer.interval := 900; IF geschwindigkeit.position = 10 then timer.interval := 1000; IF geschwindigkeit.position = 9 then timer.interval := 1100; IF geschwindigkeit.position = 8 then timer.interval := 1200; IF geschwindigkeit.position = 7 then timer.interval := 1300; IF geschwindigkeit.position = 6 then timer.interval := 1400; IF geschwindigkeit.position = 5 then timer.interval := 1500; IF geschwindigkeit.position = 4 then timer.interval := 1600; IF geschwindigkeit.position = 3 then timer.interval := 1700; IF geschwindigkeit.position = 2 then timer.interval := 1800; IF geschwindigkeit.position = 1 then timer.interval := 1900; IF geschwindigkeit.position = 0 then timer.interval := 2000; end;
procedure TForm1.PLAYClick(Sender: TObject); begin if timer.enabled = false then begin timer.enabled:=true; PLAY.Caption:='PAUSE'; end else begin timer.Enabled:=false; PLAY.Caption:='PLAY'; end; end;
procedure TForm1.LebensbedigungenClick(Sender: TObject); begin Minimum :=strtoint(Edit3.text); NeuVon :=strtoint(Edit5.text); NeuBis :=strtoint(Edit6.text); Maximum :=strtoint(Edit4.text);
If (maximum>8)then maximum := 8; if (minimum<NeuVon)AND(NeuVon<=NeuBis)AND(NeuBis<maximum) then begin edit3.Text := inttostr (minimum); edit5.Text := inttostr (NeuVon); edit6.Text := inttostr (NeuBis); edit4.Text := inttostr (maximum); end; end;
end. |
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 14.10.08 19:35
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 14.10.08 19:40
Moin!
Krypt0 hat folgendes geschrieben : | Und wie sieht der Quelltext dafür aus? |
Diese Methode ist doch schonmal ein guter Ansatz:
Krypt0 hat folgendes geschrieben : | Delphi-Quelltext 1:
| procedure TForm1.SpawnenOKClick(Sender: TObject); | |
Zusammen mit dem Vorschlag von DeddyH hast du doch schon eigentlich alles zusammen.
Dann mach doch mal einen Versuch und wir schauen mal, ob´s klappt.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Krypt0 
      
Beiträge: 21
|
Verfasst: Di 14.10.08 20:53
XZellen.Count ist wahrscheinlich eine Variable, oder? Aber als was soll ich sie deklarieren??
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 14.10.08 20:56
Moin!
Krypt0 hat folgendes geschrieben : | XZellen.Count ist wahrscheinlich eine Variable, oder? Aber als was soll ich sie deklarieren?? |
Nein, das ist keine Variable, sondern die Anzahl der Zellen in X-Richtung.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Krypt0 
      
Beiträge: 21
|
Verfasst: Di 14.10.08 21:09
aber XZellen wird immer als undefinierter bezeichner angegeben...
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 14.10.08 21:12
Moin!
Krypt0 hat folgendes geschrieben : | aber XZellen wird immer als undefinierter bezeichner angegeben... |
Klar, du musst es ja auch durch die in deinem Programm verwendete Variable ersetzen, einfach nur c&p wird nix.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|