Guten Morgen und ein frohes neues Jahr.
Ich habe mir mal Deinen Code angeschaut.
Dies ist aus der Procedure Leben_versetzen.
Delphi-Quellcode:
SetLength(Lebensform1, Length(LebenTemp)+8);
for iIndex := 0 to Length(LebenTemp)-1 do
begin
Lebensform1[iIndex].ix := LebenTemp[iIndex].ix;
Lebensform1[iIndex].iy := LebenTemp[iIndex].iy;
Lebensform1[iIndex].iNahrung := LebenTemp[iIndex].iNahrung;
Lebensform1[iIndex].iWasser := LebenTemp[iIndex].iWasser;
Lebensform1[iIndex].iSchwanger := LebenTemp[iIndex].iSchwanger;
Lebensform1[iIndex].bFortpflanzen := LebenTemp[iIndex].bFortpflanzen;
end;
Wenn Du dir das einmal genauer anschaust, wirst Du wahrscheinlich
auch feststellen, dass die letzten 8 Werte des Arrays Lebensform1 nicht initialisiert
werden.
In den .ix und .iy Feldern stehen irgendwelche undefinierten Werte und das
führt zu Problemen in der Procedure
Delphi-Quellcode:
procedure Bewegen(var Objekt: TLebensform);
var i: integer;
begin
repeat
case random(3) of
0: Objekt.ix := Objekt.ix - 1;
1: Objekt.ix := Objekt.ix;
2: Objekt.ix := Objekt.ix + 1;
end;
until Objekt.ix > 1;
repeat
case random(3) of
0: Objekt.iy := Objekt.iy - 1;
1: Objekt.iy := Objekt.iy;
2: Objekt.iy := Objekt.iy + 1;
end;
until Objekt.iy > 1;
end;
Wenn da sehr große negative Werte für ix und iy stehen
kann es eine Zeit lang brauchen bis .ix und .iy größer als 1 sind.
Wenn dann Dein Timer immer noch Problem machen sollte,
kannst Du ihn ja während der Berechnung uns Zeichnung deaktivieren.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
(sender as TTimer).Enabled:=false;
Lebensform_versetzen;
Welt_aendern;
Weltzeichnen;
Bildzeichnen;
TreeView_anpassen;
(sender as TTimer).Enabled:=true;
end;
.. und noch ein Nachtrag.
Wenn Du Deine Unterprogramme zu Methoden Deiner Form machst.
Dann kannst Du dir Konstrukte wie diese:
Delphi-Quellcode:
procedure TreeView_anpassen;
var i: integer;
begin
Form1.TreeView1.Items.Clear;
for i:= 0 to Length(Lebensform1)-1 do
begin
Form1.Treeview1.Items.Add(nil,'Lebensform ' + inttostr(i+1));
Form1.Treeview1.Items.Add(nil,'X = ' + inttostr(Lebensform1[i].ix));
Form1.Treeview1.Items.Add(nil,'Y = ' + inttostr(Lebensform1[i].iy));
Form1.Treeview1.Items.Add(nil,'Nahrung = ' + inttostr(Lebensform1[i].iNahrung));
Form1.Treeview1.Items.Add(nil,'Wasser = ' + inttostr(Lebensform1[i].iWasser));
end;
Form1.Treeview1.Items.Add(nil,'FeldWasser ' + inttostr(Welt[0,0].iWasser));
Form1.Treeview1.Items.Add(nil,'FeldNahrung ' + inttostr(Welt[0,0].iNahrung));
end;
Würde dann so aussehen:
Delphi-Quellcode:
procedure TForm1.TreeView_anpassen;
var i: integer;
begin
TreeView1.Items.Clear;
for i:= 0 to Length(Lebensform1)-1 do
begin
Treeview1.Items.Add(nil,'Lebensform ' + inttostr(i+1));
Treeview1.Items.Add(nil,'X = ' + inttostr(Lebensform1[i].ix));
Treeview1.Items.Add(nil,'Y = ' + inttostr(Lebensform1[i].iy));
Treeview1.Items.Add(nil,'Nahrung = ' + inttostr(Lebensform1[i].iNahrung));
Treeview1.Items.Add(nil,'Wasser = ' + inttostr(Lebensform1[i].iWasser));
end;
Treeview1.Items.Add(nil,'FeldWasser ' + inttostr(Welt[0,0].iWasser));
Treeview1.Items.Add(nil,'FeldNahrung ' + inttostr(Welt[0,0].iNahrung));
end;
.. und hat den Vorteil, wenn Du das Formular mal umbenennst
von Form1 nach Simulation o.ä. Du im QuellCode
nicht mehr allzuviel ändern mußt.
Grüße
Klaus