Ich versuche gerade eine einfache Wator - Simulation (Räuber-Beute-Modell) zu programmieren. Alle denen WATOR nichts sagt, können hier nachlesen
Wikipedia - Wator.
Jedoch hab ich bei der Berechnung der nächsten Generation das Problem, das das Programm nach einigen neuen Generationen sich komplett aufhängt. Je mehr Individuen ich dabei zu Begin setze, desto eher hängt sich das Programm auf. Irgendetwas in meiner Prozedure sogrt vermutlich für einen Speicherüberlauf oder eine entlosschleife, jedoch habe ich keine Ahnung, wo der Fehler liegt.
Hier nun mal mein Code:
Delphi-Quellcode:
procedure TForm1.StartClick(Sender: TObject);
var x, y: integer;
x2, y2: integer;
Nachbarn: integer;
tempWator: TWator;
//Array [0..124, 0..124] of Record aus Gattung, Fasten, Alter: jeweils integer
begin
randomize;
for x := 1
to 123
do
begin
for y := 1
to 123
do
begin
x2 := x;
y2 := y;
if Wator[x, y].Gattung <> 0
then //0 markiert leere Felder
begin
Nachbarn := Nachbarschaft(x, y);
//Nachbarschaft ermittel ob ein Feld in der Umgebung frei ist bzw. ein Hai einen Fisch finden kann
if Nachbarn
in [1, 2]
then
begin
repeat //ermittelt freies Nachbarfeld
x2 := x;
y2 := y;
case Random(4)
of
1: inc(x2);
2:
dec(x2);
3: inc(y2);
4:
dec(y2);
end;
until ((Wator[x2, y2].Gattung = 0)
and (Nachbarn = 1))
or //Abbruch bei Fischen sobald ein freies Nachbarfeld gefunden wurde
((Wator[x2, y2].Gattung = 2)
and (Nachbarn = 2));
//bei Haien, wenn sie einen Fisch gefunden haben (falls überhaupt verfügbar)
end;
end;
tempWator[x2, y2].Gattung := Wator[x, y].Gattung;
//tempWator dient als Zwischenspeicher für für
tempWator[x2, y2].Alter := Wator[x, y].Alter + 1;
//nächste Generation
tempWator[x2, y2].Gattung := Wator[x, y].Fasten + 1;
end;
end;
Wator := tempWator;
//geändert
PaintWator;
//gibt Array grafisch aus
ShowMessage('
Ende');
//als Test, ob durchlauf abgeschlossen
end;
sämtliche speziellen Routinen wie Vermehrung fehlen natürlich noch.
Vielleicht sieht jemand die Stelle, wo der Overhead - oder sonstwas - entsteht.
Johannes M.