Einzelnen Beitrag anzeigen

Benutzerbild von Maya
Maya

Registriert seit: 15. Jun 2011
Ort: Potsdam-Mittelmark
107 Beiträge
 
Delphi 2010 Enterprise
 
#16

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte

  Alt 15. Jun 2011, 14:50
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.
Miniaturansicht angehängter Grafiken
screen01.png   screen02.png  

Geändert von Maya (15. Jun 2011 um 15:59 Uhr)
  Mit Zitat antworten Zitat