Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 01.03.13 17:57 
Hallo!

Ich bastle mir gerade eine Wator-Simulation, ich habe folgendes deklariert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
type
  TElement = (srtWater, srtShark, srtFish, srtBorder);

type
  TSort = packed record
    Element: TElement;
    X, Y, Age, Dir, Satt: Integer;
    aBoard: array [-1..66, -1..64of TElement;
  end;

const
  iMaxH   = 66;
  iMaxV   = 64;
//...

var
  Form1: TForm1;
  Waqua: TSort;
//...

aBoard ist, wie der Name schon sagt, das Spielbrett, damit kann ich auf einem TImage die zugehörigen Grafiken darstellen.
Aber ich kann nicht überprüfen, welches TElement das ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FishTimerTimer(Sender: TObject);
var
  x, y: Integer;
begin
  for x := 0 to iMaxH-1 do
    for y := 0 to iMaxV-1 do
  begin
    if Waqua.aBoard[x, y] = srtFish then  //bis hier ok, aber ...
    begin
      if Waqua.Dir = 1 then  // ... hierher komme ich nie!
      begin
        //Das Programm kommt hier nie hin, weil ich offenbar Waqua.Dir nicht abfragen kann!
      end;
    end;
  end;
end;


Ich kann also Waqua.Dir und vermutlich auch X, Y, Age, Dir, Satt nicht abfragen.
Warum nicht? Was mache ich falsch?

Moderiert von user profile iconNarses: Doppelposting entfernt.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!


Zuletzt bearbeitet von galagher am Fr 01.03.13 18:34, insgesamt 2-mal bearbeitet
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 01.03.13 18:22 
Hallo,
ich habe Deinen Text 1:1 übernommen und in einer Methode
ausblenden Delphi-Quelltext
1:
2:
    waqua.aBoard[2,4] := srtFish;
    waqua.dir:=1;

gesetzt. Die nachfolgende Prozedur
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button2Click(Sender: TObject);
var x, y: Integer;
begin
  for x := 0 to iMaxH-1 do
    for y := 0 to iMaxV-1 do
  begin
    if Waqua.aBoard[x, y] = srtFish then  //bis hier ok, aber ...
    begin
      if Waqua.Dir = 1 then  // ... hierher komme ich nie!
      begin
        showmessage('Jetzt');
      end;
    end;
  end;
end;

stoppt genau dann, wenn Deine beiden Bedingungen erfüllt sind. Es funktioniert also.
Der Fehler liegt also wo anders. Du musst etwas mehr Quelltext zeigen, um den Fehler zu lokalisieren.
Nebenbei: srtfish, srtshark, ... sieht eher nach einer Wator-Simulation aus, weniger nach Game of Life.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 01.03.13 18:31 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
stoppt genau dann, wenn Deine beiden Bedingungen erfüllt sind. Es funktioniert also.
Der Fehler liegt also wo anders. Du musst etwas mehr Quelltext zeigen, um den Fehler zu lokalisieren.

Zunächst ist alles srtWater, dann befülle ich per Random mit srtShark und srtFish:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
{Board mit srtShark und srtFish befüllen, srtWater wird in ClearBoard gesetzt}
procedure TForm1.InitBoard;
var
  i, x, n: Integer;
begin
  ClearBoard;  {Erstmal alles leeren}

  for i := 0 to 500 do
  begin
    n := Random(12);
    case n of
      05 :
        begin
          Waqua.Element := srtWater;
          Waqua.Dir := dirWater;
        end;
      67 :
        begin
          Waqua.Element := srtShark;
         {Ausrichtung links oder rechts}
         if Random(2) = 0 then Waqua.Dir := dirSharkLeft
         else                  Waqua.Dir := dirSharkRight;
        end;
      8..11:
        begin
          Waqua.Element := srtFish;
          {Ausrichtung links oder rechts}
          if Random(2) = 0 then Waqua.Dir := dirFishLeft
          else                  Waqua.Dir := dirFishRight;
        end;
    end;

    Waqua.X := Random(iMaxH-1);
    Waqua.Y := Random(iMaxV-1);

    Waqua.aBoard[Waqua.X, Waqua.Y] := Waqua.Element;

//Zuweisungen fehlen noch:
//.Age
//.Satt

    DrawSort(Waqua);
  end;

//Zum Testen - klappt:
if Waqua.aBoard[00] = srtWater then label1.Caption := 'Water';
if Waqua.aBoard[00] = srtShark then label1.Caption := 'Shark';/////
if Waqua.aBoard[00] = srtFish then  label1.Caption := 'Fish';
end;


user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:

Nebenbei: srtfish, srtshark, ... sieht eher nach einer Wator-Simulation aus, weniger nach Game of Life.

Habe mich in der Eile geirrt :oops: und den Titel jetzt korrigiert!
//Edit: jetzt gibt's meine Eröffnung 2x, könnte das überflüssige 2. bitte jemand löschen?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 01.03.13 18:39 
Hallo,
funktioniert perfekt. Nach der Initialisierung stoppt die Testroutine mehrfach, wenn dir=1 ist und das Feldelement srtFish. Der Fehler ist also an anderer Stelle.
Allerdings habe ich dirSharkLeft, dirSharkRight, usw... Zahlwerte von 0 bis 2 zugewiesen, da ich nicht weiß, welche Werte diese bei Dir haben sollen.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 01.03.13 18:50 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
funktioniert perfekt. Nach der Initialisierung stoppt die Testroutine mehrfach, wenn dir=1 ist und das Feldelement srtFish. Der Fehler ist also an anderer Stelle.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings habe ich dirSharkLeft, dirSharkRight, usw... Zahlwerte von 0 bis 2 zugewiesen, da ich nicht weiß, welche Werte diese bei Dir haben sollen.


Ich habe das so gemacht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
const
  dirWater  = 0;
  dirSharkLeft  = 1;
  dirSharkRight = 2;
  dirFishLeft   = 3;  // <--
  dirFishRight  = 4;

Ich habe einfach "1" angegeben, weil ich der einfacheren Lesbarkeit hier keine Konstantenbezeichnungen verwenden wollte! Diese Konstanten geben den Index der Grafik in einer TImageList an, zugleich verwende ich sie, um abzufragen, welches "Vieh" sich gerade wo befindet.

Wenn ich es testweise mit nur einem srtFish initialisiere, klappt es, aber noch bekomme ich es nicht hin, dass der "alte" Bereich mit srtWater überzeichnet wird:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
{Board mit srtShark und srtFish befüllen, srtWater wird in ClearBoard gesetzt}
procedure TForm1.InitBoard;
var
  i, x, n: Integer;
begin
  ClearBoard;  {Erstmal alles leeren}

  Waqua.Element := srtFish;

  {Ausrichtung links oder rechts}
  if Random(2) = 0 then Waqua.Dir := dirFishLeft
  else                  Waqua.Dir := dirFishRight;

   Waqua.X := Random(iMaxH-1);
   Waqua.Y := Random(iMaxV-1);

   Waqua.aBoard[Waqua.X, Waqua.Y] := Waqua.Element;

   DrawSort(Waqua);
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 01.03.13 18:56 
Hallo,
da hast Du ja das Problem!
ausblenden Delphi-Quelltext
1:
2:
3:
const
  dirFishLeft   = 3;  // <--
  dirFishRight  = 4;

Wenn Du das Feld mit srtFish füllst, gibst Du entweder dirFishLeft = 3 oder dirFishRight = 4 an, d.h. niemals eine 1.
Damit kann
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
    if Waqua.aBoard[x, y] = srtFish then  //bis hier ok, aber ...
    begin
      if Waqua.Dir = 1 then  // ... hierher komme ich nie!
      begin
    ...

nie erreicht werden.

Beste Grüße
Mathematiker

Nachtrag: Blödsinn. Jetzt zitiere ich mich schon selbst. Bitte nachfolgenden Eintrag entfernen.

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein


Zuletzt bearbeitet von Mathematiker am Fr 01.03.13 19:02, insgesamt 2-mal bearbeitet
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 01.03.13 19:06 
Hallo!
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Du das Feld mit srtFish füllst, gibst Du entweder dirFishLeft = 3 oder dirFishRight = 4 an, d.h. niemals eine 1.
Damit kann
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
    if Waqua.aBoard[x, y] = srtFish then  //bis hier ok, aber ...
    begin
      if Waqua.Dir = 1 then  // ... hierher komme ich nie!
      begin
    ...

nie erreicht werden.


Der Code sieht jetzt so aus, es klappt aber nur mit einem einzigen srtFish:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
  for x := -1 to iMaxH do
    for y := -1 to iMaxV do
  begin
    if Waqua.aBoard[x, y] = srtFish then
    begin
      if Waqua.Dir = dirFishLeft then // <-- !
      begin
        {Altes Feld übermalen und ...}
        Waqua.Dir := dirWater;
        Waqua.aBoard[x, y] := srtWater;
        DrawSort(Waqua);

        {... srtFish ein Feld nach links versetzen}
        Waqua.X := Waqua.X-1;
        Waqua.Dir := dirFishLeft;
        Waqua.aBoard[x, y] := srtFish;
        DrawSort(Waqua);
      end;
    end;
  end;

Wenn ich mit Random initialisiere, tut sich gar nichts.
Ausserdem habe ich an den "Rändern" mit -1, iMaxV und iMaxH srtBorder gesetzt, das sind unsichtbare Dinger, die ausserhalb des sichtbaren Bereichs liegen und die Viecher einfach dort die Richtung ändern lassen soll, soweit bin ich aber noch nicht.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 01.03.13 19:15 
Hallo,
Du änderst nach dem Erkennen von srtfish die Variable dir auf dirwater:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    if Waqua.aBoard[x, y] = srtFish then
    begin
      if Waqua.Dir = dirFishLeft then 
      begin
        {Altes Feld übermalen und ...}
        Waqua.Dir := dirWater;   //<----

Da Waqua.Dir für das ganze(!) Feld gilt, wird dirfishleft nicht mehr erreicht.
Ich vermute, Du möchtest für jedes Feld die Größe dir haben, d.h.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    aBoard: array [-1..66, -1..64of record
         X, Y, Age, Dir, Satt: Integer;
         irgendetwas : TElement;
    end;

wäre besser, oder so ähnlich.

Beste Grüße
Mathematiker

Nachtrag: Ich melde mich erst einmal ab. Jetzt geht's zu Dieter Nuhr. :D

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 01.03.13 20:07 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Da Waqua.Dir für das ganze(!) Feld gilt, wird dirfishleft nicht mehr erreicht.
Ich vermute, Du möchtest für jedes Feld die Größe dir haben,
Genau das! Habe den Code aleso entsprechend umgebaut, sodass jedes einzelne (Teil-)Feld sowohl das Array als auch Dir, Age usw haben.
Allerdings funktioniert der Code im Timer jetzt nicht mehr...

//Edit: Hab's hinbekommen!

user profile iconMathematiker, vielen Dank!
Melde mich wieder, wenn ich nicht weiterkomme!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 02.03.13 11:44 
Hallo!

Jetzt schaffe ich es, dass srtFish waagrecht hin- und herlaufen, an einem "Hindernis" wie zB. srtShark die Richtung und zusätzlich die vertikale Position ändern.

Der Grundgedanke ist:
Bei links -> rechts: Setzt srtFish 1 Feld nach recht und überschreibe das Ursprungsfeld mit srtWater.
Bei rechts :> links: Setzt srtFish 1 Feld nach links und überschreibe das Ursprungsfeld mit srtWater.
Bei einem Hindernis wie zB. srtShark: Per Random ein Feld nach unten/oben.

Die Anzahl der srtFish müsste dabei doch eigentlich gleich bleiben, es werden aber immer weniger die Anzahl schwankt aber: wird zuerst weniger und schwankt dann!

Hier der Code - warum verringert sich die Anzahl an srtFish?
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
procedure TForm1.FishTimerTimer(Sender: TObject);
var
  x, y, i: Integer;
begin
  try
    {--------------------------- Von links nach rechts --------------------------}
    for x := -1 to iMaxH do
      for y := -1 to iMaxV do
    begin
      if Waqua.aBoard[x, y].Element = srtFish then
      begin
        if Waqua.aBoard[x, y].Dir = dirFishLeft then
        begin
          if Waqua.aBoard[x-1, y].Element <> srtWater then
          begin
            {Oberste Linie}
            if (y = 0then
            begin
              Waqua.aBoard[x, y+1].Dir := dirFishRight;
              Waqua.aBoard[x, y+1].Element := srtFish;

              Waqua.aBoard[x, y].Dir := dirWater;
              Waqua.aBoard[x, y].Element := srtWater;
            end;
            {Unterste Linie}
            if (y = iMaxV-1then
            begin
              Waqua.aBoard[x, y-1].Dir := dirFishRight;
              Waqua.aBoard[x, y-1].Element := srtFish;

              Waqua.aBoard[x, y].Dir := dirWater;
              Waqua.aBoard[x, y].Element := srtWater;
            end;


          {Alle anderen waagrechten Linien}
          if (x < iMaxH-1then//
            if (Random(2) = 0then//
            begin
              Waqua.aBoard[x, y-1].Dir := dirFishRight;
              Waqua.aBoard[x, y-1].Element := srtFish;

             {... das Ursprungsfeld mit srtWater überschreiben}
             Waqua.aBoard[x, y].Dir := dirWater;
             Waqua.aBoard[x, y].Element := srtWater;
            end
            else
            begin
              Waqua.aBoard[x, y+1].Dir := dirFishRight;
              Waqua.aBoard[x, y+1].Element := srtFish;

              {... das Ursprungsfeld mit srtWater überschreiben}
              Waqua.aBoard[x, y].Dir := dirWater;
              Waqua.aBoard[x, y].Element := srtWater;
            end;
          end
          else
          begin
            {srtFish ein Feld nach links versetzen und ...}
            Waqua.aBoard[x-1, y].Dir := dirFishLeft;
            Waqua.aBoard[x-1, y].Element := srtFish;

            {... das Ursprungsfeld mit srtWater überschreiben}
            Waqua.aBoard[x, y].Dir := dirWater;
            Waqua.aBoard[x, y].Element := srtWater;
          end;
        end;
      end;
    end;


    {--------------------------- Von rechts nach links --------------------------}
    for x := iMaxH downto -1 do
      for y := iMaxV downto -1 do
    begin
      if Waqua.aBoard[x, y].Element = srtFish then
      begin
        if Waqua.aBoard[x, y].Dir = dirFishRight then
        begin
          if Waqua.aBoard[x+1, y].Element <> srtWater then
          begin
            {Oberste Linie}
            if (y = 0then
            begin
              Waqua.aBoard[x, y+1].Dir := dirFishLeft;
              Waqua.aBoard[x, y+1].Element := srtFish;

              Waqua.aBoard[x, y].Dir := dirWater;
              Waqua.aBoard[x, y].Element := srtWater;
            end;
            {Unterste Linie}
            if (y = iMaxV-1then
            begin
              Waqua.aBoard[x, y-1].Dir := dirFishLeft;
              Waqua.aBoard[x, y-1].Element := srtFish;

              Waqua.aBoard[x, y].Dir := dirWater;
              Waqua.aBoard[x, y].Element := srtWater;
            end;


          {Alle anderen waagrechten Linien}
          if (x > 0then//
            if (Random(2) = 0then
            begin
              Waqua.aBoard[x-1, y-1].Dir := dirFishLeft;
              Waqua.aBoard[x-1, y-1].Element := srtFish;

             {... das Ursprungsfeld mit srtWater überschreiben}
             Waqua.aBoard[x, y].Dir := dirWater;
             Waqua.aBoard[x, y].Element := srtWater;
            end
            else
            begin
              Waqua.aBoard[x-1, y+1].Dir := dirFishLeft;
              Waqua.aBoard[x-1, y+1].Element := srtFish;

              {... das Ursprungsfeld mit srtWater überschreiben}
              Waqua.aBoard[x, y].Dir := dirWater;
              Waqua.aBoard[x, y].Element := srtWater;
            end;
          end
          else
          begin
            {srtFish ein Feld nach rechts versetzen und ...}
            Waqua.aBoard[x+1, y].Dir := dirFishRight;
            Waqua.aBoard[x+1, y].Element := srtFish;

            {... das Ursprungsfeld mit srtWater überschreiben}
            Waqua.aBoard[x, y].Dir := dirWater;
            Waqua.aBoard[x, y].Element := srtWater;
          end;
        end;
      end;
    end;

  finally
    {srtFish zählen}
    i := 0;
    //Die Anzahl schwankt!
    for x := -1 to iMaxH do
      for y := -1 to iMaxV do
    begin
      if Waqua.aBoard[x, y].Element = srtFish then
        Inc(i);
    end;
    Label2.Caption := inttostr(i);


    {Alles zeichnen}
    for x := -1 to iMaxH do
      for y := -1 to iMaxV do
        DrawSort(x, y, Waqua);
  end;
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Di 05.03.13 18:49 
Der Grundgedanke sollte sein:
1. Ermittle das Feld zu dem sich der Fisch bewegen soll.
1.a Kann die bisherige Bewegungsrichtung beibehalten werden, bewege den Fisch dort hin.
1.b Wenn nicht ermittle für alle möglichen Bewegungsrichtungen die freien Felder.
1.b.a Wenn mindestens ein Feld frei ist, wähle eines der Felder aus, übernimm die Richtung und bewege den Fisch.
1.b.b Wenn kein Feld frei ist, tu nichts.
2. Markiere den Fisch als bereits in dieser Runde bewegt!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 05.03.13 20:02 
user profile iconBlup hat folgendes geschrieben Zum zitierten Posting springen:
Der Grundgedanke sollte sein:
1. Ermittle das Feld zu dem sich der Fisch bewegen soll.
1.a Kann die bisherige Bewegungsrichtung beibehalten werden, bewege den Fisch dort hin.
1.b Wenn nicht ermittle für alle möglichen Bewegungsrichtungen die freien Felder.
1.b.a Wenn mindestens ein Feld frei ist, wähle eines der Felder aus, übernimm die Richtung und bewege den Fisch.
1.b.b Wenn kein Feld frei ist, tu nichts.
2. Markiere den Fisch als bereits in dieser Runde bewegt!

Ok, das habe ich so ähnlich umgesetzt: Die Fische und Haie bewegen sich im Wesentlichen waagrecht, können dabei aber jeweils 1 Feld nach oben oder unten wechseln. Habe das natürlich nicht in der letzten Stunde seit deinem Beitrag gemacht, das hat ein bisschen länger gedauert!

Jetzt läuft es korrekt, die Anzahl bleibt konstant, ich habe auch schon eingebaut, dass sich die Haie die Fische schnappen. Funktioniert alles.

Das mache ich mit zwei Timern, und ich dachte, ein optisch guter Effekt wäre, wenn SharkTimer.Interval etwas kürzer ist als FishTimer.Interval und sich die Haie dann schneller bewegen. Man merkt erst ab SharkTimer.Interval := FishTimer.Interval-10; einen Unterschied, aber dann ruckelt alles. Wenn Interval für beide Timer gleich ist, läuft es flüssig.

Kurz: Wie kann ich einen Timer schneller laufen lassen, ohne das die Grafik dann ruckelt? Und warum ist das so?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 05.03.13 23:03 
Möglicherweise ist das mit dem Ruckeln sowas wie ein Moirée-Effekt (nur in der Zeit, statt im Raum. Moirée-Muster entstehen, wenn zwei Muster transparent übereinander mit einer geringfügig anderen Wellenlänge/Frequenz liegen. Dann gibt es dunklere und hellere Stellen.

Das in die Zeit übertragen, wäre dann dein Ruckeln. Warum machst Du das nicht in einem Timer?

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 05.03.13 23:17 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Warum machst Du das nicht in einem Timer?
Wollte ich zuerst, dann dachte ich, ich teile den Code besser auf zwei Timer auf, weil ich dann unterschiedliche Geschwindigkeiten einstellen kann, nur das klappt nicht so, wie ich will.
Habe Interval schon in den Timern selbst gesetzt, aber das Ruckeln bleibt. :nixweiss:

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 05.03.13 23:31 
Hallo,
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Habe Interval schon in den Timern selbst gesetzt, aber das Ruckeln bleibt. :nixweiss:

Da ich nicht weiß, wie schnell Dein Rechner ist, wie kurz die Intervalle des Timers sind und wie aufwendig das Erstellen der Grafik ist, rate ich einmal:
Die Intervalle sind zu kurz, d.h. der Computer kommt mit dem Zeichnen nicht nach. Dadurch siehst Du nicht jeden Zwischenschritt und somit ruckelt es.
Genaueres kann man aber nur sagen, wenn man von der Umsetzung mehr wüsste.

Wenn Du unter de.wikipedia.org/wiki/Wator nachliest, siehst Du, dass im Originalmodell Fische und Haie gleich schnell sind, d.h. ein Timer genügt. Die Effekte werden dann über die Lebensdauer der Haie ohne Futter gesteuert.
Mir ist aber klar, dass es reizvoll ist, auch unterschiedliche Geschwindigkeiten auszuprobieren.
Das kannst Du aber auch in einem Timer simulieren, in dem Du einer gewissen Anzahl von zufällig gewählten Haien z.B. zwei Bewegungsschritt gönnst. Im Mittel sind die Haie dann schneller.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Mi 06.03.13 16:58 
Speichere dir bei jedem Fisch bzw. Hai, wann er sich das nächste mal bewegen soll.
Dann gehst du alle Fische periodisch in kurzem Abstand durch.
Die Fische, die gerade bewegt werden sollen, werden bewegt und der Zeitpunkt für die nächste Bewegung je nach Flinkheit des Fisches aktualisiert. Wurden Fische bewegt, muss das Bild anschließend in den betreffenden Bereichen aktualisiert werden.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mi 06.03.13 18:49 
Hallo,

da würde ich aber lieber mit Listen/Stacks für Zeitscheiben arbeiten.
Ich stelle mir das dann so vor:
Du hast einen Taktgeber z.B alle 10 ms ein Takt einer inneren Uhr.
Fische bewegen sich maximal alle 73 Takte { ~random (44)+30 } und Haie maximal alle 31.
Die längste Zeit zwischen zwei Bewegungen ist also 73 also erstellst Du 73 Listen/Stacks.
Die Uhr läuft nun modulo maximaleTakteZwischenBewegungen
Du schiebst jeden Fisch/pointer darauf entsprechend seiner Zeit auf den passenden Stack
Mit jedem Takt werden alle Elemente des Stacks für diesen Takt verarbeitet/entfernt und entsprechend ihrer Geschwindigkeit auf den neuen passenden Stack mit der Nummer {Jetzige Zeit + Geschwindigkeit des Fisches) MOD maximaleTakteZwischenBewegungen} geschoben.
Damit braucht kein Fisch eine Zeit speichern, sondern nur seine Geschwindigkeit, und Du mußt nicht immer alle 3000 Fische abklappern.
Die Geschwingkeit kann dann nämlich extrem erhöht werden, indem Du völlig ohne Timer arbeitest, sondern jeden Durchlauf als einen Takt nimmst zudem werden immer nur Zeiger umgehängt und keine Daten verschoben, der Speicheraufwand bleibt konstant.

Gruß Horst
P.S:
Wieso überlege ich so lang, um etwas schneller hinzubekomen, was ich gar nicht brauche....
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 06.03.13 20:13 
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
da würde ich aber lieber mit Listen/Stacks für Zeitscheiben arbeiten.
Ich stelle mir das dann so vor:
Du hast einen Taktgeber z.B alle 10 ms ein Takt einer inneren Uhr.

Das wäre ja dann wie ein Timer, oder? Es geht doch darum, regelmässig und andauernd das gesamte Array zu durchlaufen, um alle darin enthaltenen Daten "zu verschieben", also irgendeine Veränderung darin zu erzeugen (ein zweidimensionales Array kann ich mir gut als ein reales Schachbrett vorstellen). Danach wird das Array grafisch umgesetzt.

user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Wieso überlege ich so lang, um etwas schneller hinzubekomen, was ich gar nicht brauche....
Kannst es ja immer noch in eine Wator-Simulation umsetzen! :mrgreen:

Deinen Lösungsansatz kann ich aber, denke ich, nicht umsetzen...

Ich habe aber eine andere Lösung gefunden: Haie und Fische laufen zwar gleich schnell, aber die Haie wechseln im Gegensatz zu den Fischen per Random die horizontale Linie, das wirkt dann optisch so, also ob sie "jagen" würden, und zugleich ist die Einförmigkeit der Bewegungen aufgehoben!

Warum habe ich zwei Timer?
Zum Einen ist der Code jeweils doch unterschiedlich, zum anderen kann ich so den Code sauber trennen. Natürlich könnte ich die Sub-Prozeduren und -Funktionen mit Parametern versehen, sodass sie einmal für Fische, dann für Haie arbeiten, dann könnte ich noch mit if's Fisch- und Haie-Code trennen; klar geht das.
Aber ich denke, dann wird der Code zu unübersichtlich.

Mal sehen, wohin ich da noch komme, ich denke nämlich daran, dass das "Plankton" nicht wie im Original einfach da ist, sondern, dass man die Fische füttern muss, damit sie überleben.

Die Haie fressen ja die Fische, und im Moment ist es so, dass die Fische einfach weggefressen werden.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mi 06.03.13 23:08 
Hallo,
ich habe mein Wator ausgekramt und noch ein paar kleine Änderungen vorgenommen.
Vielleicht hilft es ja etwas; wenn nicht, dann einfach ignorieren. :P

Beste Grüße
Mathematiker
Einloggen, um Attachments anzusehen!
_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Do 07.03.13 05:30 
Zum Plankton: Das ist auch in der Natur nicht einfach da. Wenn z.B. widrige Umweltbedingungen (Extrem kalt, Vergiftung des Wassers, Dunkelheit) vorherrschen, ist auch da Ebbe. Eine komplexe Umweltsituation ist schwer nachzusimulieren, weil sich viele Faktoren gegenseitig beeinflussen. Viele Fische, viel Fäkalien, viele Algen, wenig Fische, wenig Fäkalien, wenig Algen, Und bei den Räubern noch extremer, da sie zumeist größer sind. Dann noch äußere Einflusse (z.B. durch den Menschen) All dies zu berücksichtigen, ist eben nicht ganz so trivial. Aber im Kleine zu zeigen, dass das Drehen an einer Schraube eben nicht immer das gewünschte Ergebnis liefert, ist - bei aller Ungenauigkeit des Ergebnisses - schon die Anstrengung wert.

Steffen: Eine realistische Umsetzung des Themas. Bei einem Screensaver zu dem Thema ernährten häufig 7000 Fische 10000 Haie, total unrealistisch!

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.