Einzelnen Beitrag anzeigen

Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Hilfe bei einer Simulation

  Alt 1. Jan 2009, 09:50
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
Klaus
  Mit Zitat antworten Zitat