![]() |
Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Hallo zusammen,
ich bin neu hier im Forum :). Ich muss für den Informatik Unterricht bis nächste Woche das altbekannte "Game Of Life" programmieren. Das Problem ist, dass ich nicht wirklich viel Ahnung von Programmieren habe, und demnach mit dieser eigentlich wohl leichten Schülerübung so meine Probleme habe. Ich hänge daran die nächste Generation ausgeben zu lassen... Hier mal mein Code:
Delphi-Quellcode:
Ich wäre euch für jede Hilfe überaus dankbar. Ich glaube es dauert noch ein wenig bis ich mir das logische Denken angewöhnt habe dass für's Programmieren erforderlich zu sein scheint...
var
Form1: TForm1; Leben: Boolean; OL, NL: Array [1..10,1..10] of Boolean; i, j: Integer; counter: integer; implementation {$R *.DFM} procedure TForm1.Button2Click(Sender: TObject); begin Randomize; for i := 1 to 8 do for j:= 1 to 8 do if Random(10) >1 then OL[i,j] := true else OL[i,j] := false; Anzeige; end; procedure TForm1.Anzeige; begin for i := 1 to 8 do for j:= 1 to 8 do if OL[i,j] then StringGrid1.Cells[i,j] := '0' else StringGrid1.Cells[i,j] := ''; end; procedure TForm1.AnzeigeN; begin for i := 1 to 8 do for j:= 1 to 8 do if NL[i,j] then StringGrid1.Cells[i,j] := '0'; end; procedure TForm1.Button4Click(Sender: TObject); begin Button4.Caption := 'Weiter'; end; procedure TForm1.Button3Click(Sender: TObject); begin for i := 1 to 8 do for j:= 1 to 8 do if OL[i-1,j-1] then counter := counter +1; if OL[i+1,j+1] then counter := counter +1; if OL[i+1,j-1] then counter := counter +1; if OL[i-1,j+1] then counter := counter +1; if OL[i,j-1] then counter := counter +1; if OL[i,j+1] then counter := counter +1; if OL[i-1,j] then counter := counter +1; if OL[i+1,j] then counter := counter +1; if (counter = 2) or (counter = 3) then NL[i,j] := true else NL[i,j] := false; if NL[i,j] then StringGrid1.Cells[i,j] := '0'; end; end. Vielen Dank im Vorraus! |
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Herzlich willkommen in der Delphi-PRAXiS, Lenuam.
In Pascal (Delphi) kannst du mit einem IF-Statement immer nur ein einzelnes Statement ausführen. Willst du dort mehrere Statements ausführen, dann musst du sie zu einem Block zusammenfügen.
Delphi-Quellcode:
Freundliche Grüße
const
LifeSymbol: array [Boolean] of Char = (' ', '0'); // 0 = Leben, Leerzeichen = kein Leben procedure TForm1.Button3Click(Sender: TObject); var i, j, counter: Integer; // hier und nicht anderswo begin for i := 1 to 8 do for j:= 1 to 8 do begin // block beginnen counter := 0; // initialisieren Inc(counter, Ord(OL[i - 1, j - 1])); Inc(counter, Ord(OL[i + 1, j + 1])); Inc(counter, Ord(OL[i + 1, j - 1])); Inc(counter, Ord(OL[i - 1, j + 1])); Inc(counter, Ord(OL[i, j - 1])); Inc(counter, Ord(OL[i, j + 1])); Inc(counter, Ord(OL[i - 1, j])); Inc(counter, Ord(OL[i + 1, j])); NL[i,j] := counter in [2, 3]; StringGrid1.Cells[i, j] := LifeSymbol[NL[i, j]]; end; // block beenden end; |
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
hab auch mal ein
![]() der Ord Befehl wandelt Boolean nach integer um bei False = 0 und bei True = 1 deswegen fallen bei Marabu's code die ganzen inneren Ifs weg. |
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Schon mal vielen Dank euch beiden - ich werde das nachher ausprobieren :)
|
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Zitat:
Delphi-Quellcode:
(Ungetestet)
const
LifeSymbol: array [Boolean] of Char = (' ', '0'); // 0 = Leben, Leerzeichen = kein Leben procedure TForm1.Button3Click(Sender: TObject); var i, j, counter: Integer; // hier und nicht anderswo begin for i := 1 to 8 do for j:= 1 to 8 do begin // block beginnen counter := 0; // initialisieren for k := -1 to 1 do for l := -1 to 1 do Inc(counter, Ord(OL[i+k, j+l])); NL[i,j] := counter in [2, 3]; StringGrid1.Cells[i, j] := LifeSymbol[NL[i, j]]; end; // block beenden end; |
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Okay, die Methode von marabu funktioniert schon mal prima. Jetzt muss ich nur noch irgendwie unterscheiden zwischen 2 und 3 Nachbarn...bei 2 und 3 bleibt eine Zelle besetzt, bei 3 wird aber auch eine leere Zelle besetzt.
Kann mir vielleicht noch jemand erklären wofür genau LifeSymbol verwendet wird und was eine Char Variable ist? Ach so, steht Inc einfach für increase? Dann muss ich noch einen Timer programmieren...mal schaun ob ich das hinbekomme. Ich würde gern einfach ein bestimmtes Sekundenintervall vom User als String angeben lassen... Ach so, und in Stringgrid kann man keine Grafiken einbinden oder? Eigentlich schade, ich hätte gern ein paar Lebensformen dafür designt ^^... |
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Zitat:
Delphi-Quellcode:
@inherited:
NeuerZustand = (tot and cnt=3) or (lebendig and cnt in [2,3]);
Du hast ein if i=0 and j=0 then continue; vergessen. So wird noch das eigentlich Zelle mitgezählt. |
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Zitat:
|
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Hi,
Zitat:
Delphi-Quellcode:
Übrigens machst du dann genau das, was Nikolas und Nikolai als Fehler erkannt zu haben glauben.
begin
for i := 1 to 8 do for j:= 1 to 8 do begin // block beginnen counter := 0; // initialisieren Inc(counter, Ord(OL[i - 1, j - 1])); Inc(counter, Ord(OL[i + 1, j + 1])); Inc(counter, Ord(OL[i + 1, j - 1])); Inc(counter, Ord(OL[i - 1, j + 1])); Inc(counter, Ord(OL[i, j - 1])); Inc(counter, Ord(OL[i, j + 1])); Inc(counter, Ord(OL[i - 1, j])); Inc(counter, Ord(OL[i + 1, j])); Inc(counter, Ord(OL[i, j])); StringGrid1.Cells[i, j] := LifeSymbol[counter > 2]; end; // block beenden end; Wenn du die von Nikolai vorgeschlagene Code-Vereinfachung durch Schleifenbildung verstehst, dann kannst du sie ruhig benutzen. Wenn du Grafiken verwenden möchtest, dann nimm statt des StringGrid ein DrawGrid. Freundliche Grüße |
Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
Also ich bleibe lieber bei dem einfacheren Code ^^. Ich habe jetzt StringGrid1.Cells[i, j] := LifeSymbol[counter > 2]; eingefügt, aber so ganz funktioniert es immer noch nicht. Ich bin mir auch nicht sicher ob meine Arrays überhaupt korrekt sind...ich habe ein 10x10 Stringgrid, aber Arrays von 1-8, weil wir den äußeren Rand des Grids nicht verwenden sollen...stimmt das überhaupt so?
Das mit dem Drawgrid muss ich mir mal anschauen, hoffentlich ist es nicht zu kompliziert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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