Autor |
Beitrag |
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 01.03.13 16:57
Hallo!
Ich bastle mir gerade eine Wator-Simulation, ich habe folgendes deklariert:
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..64] of 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:
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 begin if Waqua.Dir = 1 then begin 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 Narses: 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 17:34, insgesamt 2-mal bearbeitet
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Fr 01.03.13 17:22
Hallo,
ich habe Deinen Text 1:1 übernommen und in einer Methode
Delphi-Quelltext 1: 2:
| waqua.aBoard[2,4] := srtFish; waqua.dir:=1; |
gesetzt. Die nachfolgende Prozedur
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 begin if Waqua.Dir = 1 then 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
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 01.03.13 17:31
Mathematiker hat folgendes geschrieben : | 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:
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:
| procedure TForm1.InitBoard; var i, x, n: Integer; begin ClearBoard;
for i := 0 to 500 do begin n := Random(12); case n of 0, 5 : begin Waqua.Element := srtWater; Waqua.Dir := dirWater; end; 6, 7 : begin Waqua.Element := srtShark; if Random(2) = 0 then Waqua.Dir := dirSharkLeft else Waqua.Dir := dirSharkRight; end; 8..11: begin Waqua.Element := srtFish; 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;
DrawSort(Waqua); end;
if Waqua.aBoard[0, 0] = srtWater then label1.Caption := 'Water'; if Waqua.aBoard[0, 0] = srtShark then label1.Caption := 'Shark';if Waqua.aBoard[0, 0] = srtFish then label1.Caption := 'Fish'; end; |
Mathematiker hat folgendes geschrieben : |
Nebenbei: srtfish, srtshark, ... sieht eher nach einer Wator-Simulation aus, weniger nach Game of Life. |
Habe mich in der Eile geirrt 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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Fr 01.03.13 17: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
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 01.03.13 17:50
Mathematiker hat folgendes geschrieben : | funktioniert perfekt. Nach der Initialisierung stoppt die Testroutine mehrfach, wenn dir=1 ist und das Feldelement srtFish. Der Fehler ist also an anderer Stelle. |
Mathematiker hat folgendes geschrieben : | 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:
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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.InitBoard; var i, x, n: Integer; begin ClearBoard;
Waqua.Element := srtFish;
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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Fr 01.03.13 17:56
Hallo,
da hast Du ja das Problem!
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
Delphi-Quelltext 1: 2: 3: 4: 5:
| if Waqua.aBoard[x, y] = srtFish then begin if Waqua.Dir = 1 then 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 18:02, insgesamt 2-mal bearbeitet
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 01.03.13 18:06
Hallo!
Mathematiker hat folgendes geschrieben : | Wenn Du das Feld mit srtFish füllst, gibst Du entweder dirFishLeft = 3 oder dirFishRight = 4 an, d.h. niemals eine 1.
Damit kann
Delphi-Quelltext 1: 2: 3: 4: 5:
| if Waqua.aBoard[x, y] = srtFish then begin if Waqua.Dir = 1 then begin ... |
nie erreicht werden. |
Der Code sieht jetzt so aus, es klappt aber nur mit einem einzigen srtFish:
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 Waqua.Dir := dirWater; Waqua.aBoard[x, y] := srtWater; DrawSort(Waqua);
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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Fr 01.03.13 18:15
Hallo,
Du änderst nach dem Erkennen von srtfish die Variable dir auf dirwater:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if Waqua.aBoard[x, y] = srtFish then begin if Waqua.Dir = dirFishLeft then begin 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.
Delphi-Quelltext 1: 2: 3: 4:
| aBoard: array [-1..66, -1..64] of 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.
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 01.03.13 19:07
Mathematiker hat folgendes geschrieben : | 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!
Mathematiker, 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
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 02.03.13 10: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?
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 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 if (y = 0) then 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; if (y = iMaxV-1) then 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;
if (x < iMaxH-1) then if (Random(2) = 0) then 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 else 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; end else begin Waqua.aBoard[x-1, y].Dir := dirFishLeft; Waqua.aBoard[x-1, y].Element := srtFish;
Waqua.aBoard[x, y].Dir := dirWater; Waqua.aBoard[x, y].Element := srtWater; end; end; end; end;
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 if (y = 0) then 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; if (y = iMaxV-1) then 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;
if (x > 0) then if (Random(2) = 0) then begin Waqua.aBoard[x-1, y-1].Dir := dirFishLeft; Waqua.aBoard[x-1, y-1].Element := srtFish;
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;
Waqua.aBoard[x, y].Dir := dirWater; Waqua.aBoard[x, y].Element := srtWater; end; end else begin Waqua.aBoard[x+1, y].Dir := dirFishRight; Waqua.aBoard[x+1, y].Element := srtFish;
Waqua.aBoard[x, y].Dir := dirWater; Waqua.aBoard[x, y].Element := srtWater; end; end; end; end;
finally i := 0; 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);
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
Beiträge: 173
Erhaltene Danke: 43
|
Verfasst: Di 05.03.13 17: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
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 05.03.13 19:02
Blup hat folgendes geschrieben : | 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
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Di 05.03.13 22: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
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 05.03.13 22:17
Tranx hat folgendes geschrieben : | 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.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 05.03.13 22:31
Hallo,
galagher hat folgendes geschrieben : | Habe Interval schon in den Timern selbst gesetzt, aber das Ruckeln bleibt. |
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
Beiträge: 173
Erhaltene Danke: 43
|
Verfasst: Mi 06.03.13 15: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
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 06.03.13 17: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
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 06.03.13 19:13
Horst_H hat folgendes geschrieben : | 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.
Horst_H hat folgendes geschrieben : | Wieso überlege ich so lang, um etwas schneller hinzubekomen, was ich gar nicht brauche.... |
Kannst es ja immer noch in eine Wator-Simulation umsetzen!
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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mi 06.03.13 22:08
Hallo,
ich habe mein Wator ausgekramt und noch ein paar kleine Änderungen vorgenommen.
Vielleicht hilft es ja etwas; wenn nicht, dann einfach ignorieren.
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
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Do 07.03.13 04: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.
|
|
|