AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wator - Problem mit Arrayberechnung

Ein Thema von monta · begonnen am 4. Mär 2006 · letzter Beitrag vom 11. Mär 2006
 
monta

Registriert seit: 18. Okt 2004
Ort: Dresden
141 Beiträge
 
#1

Wator - Problem mit Arrayberechnung

  Alt 4. Mär 2006, 14:57
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.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz