Hallo ihr Lieben,
da ich kein neues Topic aufmachen wollte und fand, dass das bisher besprochene hier ganz gut zu meinen Problem passt, dachte ich mir, ich nutze einfach mal den Thread hier.
Wie ihr euch sicherlich denken könnt, bastel ich mir gerade mein eigenes GoL zusammen. Es gelten bei mir die typischen 23/3-Regeln, bei dem die Ränder grundsätzlich tot sein sollen.
Damit ich mich erstmal in Ruhe an das Thema heranmachen kann, habe ich mir aus Panels ein 4x4-Feld gebastelt und einen Gleiter als Figur gewählt. Sinn der Sache soll sein, damit ich erstmal eine funktionierende Funktion (ach, tolle Grammatik) bauen kann. Im Anhang seht ihr, wie ich mir das aufbaute.
Jetzt zu meinen Problem: wie ihr im zweiten Screen seht, stimmt die erste Generation schon nicht. Eigentlich müsste es mit dem hier:
http://upload.wikimedia.org/wikipedi..._Lebens%29.gif übereinstimmen. Ich bin schon seit Tagen auf der Suche (gut, nicht kontinuierlich, aber es nagt an mir), aber finde leider den Fehler nicht.
Beim debuggen ist mir aber folgendes aufgefallen.
Wenn ich bei dem Kästchen angekommen bin, wo eigentlich eine lebendige Zelle sein müsste, errechnet die Funktion 4 Nachbarn, anstatt nur drei. Die Funktion ist der Meinung, dass "unten links", wo eigentlich ja nichts ist, eine lebendige Zelle ist. Dies lässt mich vermuten, dass ich das Array falsch erstellt habe.
So, ich hoffe, dass ihr mir helfen könnt.
Delphi-Quellcode:
var
Form1: TForm1;
Zellen: array[1..4,1..4] of Integer;
function GameOfLife(x,y: Integer): Integer;
var Temp: Integer;
begin
Temp:=0;
if (Zellen[x-1,y-1]=1) then Temp:=Temp+1;
if (Zellen[x,y-1]=1) then Temp:=Temp+1;
if (Zellen[x+1,y-1]=1) then Temp:=Temp+1;
if (Zellen[x-1,y]=1) then Temp:=Temp+1;
if (Zellen[x+1,y]=1) then Temp:=Temp+1;
if (Zellen[x-1,y+1]=1) then Temp:=Temp+1;
if (Zellen[x,y+1]=1) then Temp:=Temp+1;
if (Zellen[x+1,y+1]=1) then Temp:=Temp+1;
case Temp of
0,1,4..8: Result:=0;
2: if (Zellen[x,y]=1) then Result:=1 else Result:=0;
3: Result:=1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Zaehler, i,j: Integer;
Help: TComponent;
begin
Zaehler:=1;
for j:=1 to 4 do
begin
for i:=1 to 4 do
begin
Help:=Form1.FindComponent('Panel'+IntToStr(Zaehler));
if (TPanel(Help).Color=clblack) then Zellen[i,j]:=1
else Zellen[i,j]:=0;
Zaehler:=Zaehler+1;
end;
end;
Zaehler:=1;
for j:=1 to 4 do
begin
for i:=1 to 4 do
begin
Help:=Form1.FindComponent('Panel'+IntToStr(Zaehler));
if (GameOfLife(i,j)=1) then TPanel(Help).Color:=clblack
else TPanel(Help).Color:=clwhite;
Zaehler:=Zaehler+1;
end;
end;
end;
end.
Achso: das ist eine Aufgabe u.A. für die Berufsschule und da war gewollt, dass wir ein zweidimensionales Array für nehmen. Nur falls jemand auf eine andere Lösung kommt.