Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schwierigkeiten mit Game of Life Algorithmus (https://www.delphipraxis.net/58734-schwierigkeiten-mit-game-life-algorithmus.html)

alzaimar 12. Dez 2005 13:39

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Autsch, aber bitte bedenken, das Delphi die Gross/Kleinschreibung ignoriert, was bei deinem Code zu dezent perversen Effekten führt... :zwinker:

fabiO 12. Dez 2005 15:01

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von alzaimar
Deine Funktion zum Zählen der Nachbarn ist doch fast schon perfekt, nur musst Du eben dafür sorgen, das nur legale Felder gezählt werden. Du kannst dazu aber der Einfachheit halber dein Feld etwas größer machen und die zusätzlichen Randfelder einfach leer lassen:
Delphi-Quellcode:
Var
  LifeWelt : Array [-1..51,-1..51] Of Integer; // bzw. Byte, reicht ja

Ich hab das mal überdacht, wobei mir etwas aufgefallen ist.
Wenn ich das Feld größer mache und hierbei die randfelder Leer lassen, also somit eine umrandung schaffe, funktioniert das programm ja auch nicht.

aber wenn ich mir andere, z.B. Java-Applets, anschaue, dann verhalten die sich genau wie mein programm,
also wirds wohl doch irgendwo richtig sein :?:

gibts ansonsten keine andere möglichkeit dieses quasi "runde" array zu verwirklichen ?

ach ja, und danke für die andere nachbar-ermittlung, aber die bereitet mir weniger probleme als dieses Randfeld-Dilemma :(

ps. hab ma mein programm angehängt, damit's deutlicher wird :)

gruß fabiO

alzaimar 12. Dez 2005 15:12

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Zitat:

Zitat von fabiO
Ich hab das mal überdacht, wobei mir etwas aufgefallen ist.
Wenn ich das Feld größer mache und hierbei die randfelder Leer lassen, also somit eine umrandung schaffe, funktioniert das programm ja auch nicht.

Ach ja, Eckenfelder haben ja seltener 3 Nachbarn... Soll das so sein? Hab ich nie gemacht, aber egal. Wenn Du aber einen Überlauf haben willst, also der linke Nachbar von A[i,0] soll A[i,50] sein, dann versuche Dein Glück mal mit 'modulo'.
Dein Array ist also so definiert:
Delphi-Quellcode:
Var
  LifeWelt : Array [0..N-1, 0..M-1] Of Byte;

Function ZaehleNachbarn (i,j : Integer) : Integer;
Var
  dx,dy : Integer;

Begin
  Result := -alt[i,j]; // Wir zählen Alles, auch uns selbst
  For dx:=-1 to 1 do
    for dy:=-1 to 1 do
       If alt [(i + N + dx) mod N , (j + M + dy) mod M] = 1 then
          inc(Result);
End;
Probe:
Linker Nachbar von j=0 soll sein: M-1. dy=-1, also ergibt j+M-1 mod M = M-1, q.e.d
Rechter Nachbar von j=M-1 soll sein:0. dy= 1, also ergibt (M-1)+M +1 mod M = 2M mod M = 0. q.e.d
Für alle anderen Fälle ist (j+M+dy) mod M = j+dy. q.e.d

Gleiches gilt für oben/unten... oder (prüf mal selbst)

fabiO 12. Dez 2005 18:45

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Erhm also so ganz hab ich dein modulo nich gerafft :)
Und dazu sagt mir Delphi, dass es weder N, noch M kennt ([Error] Unit1.pas(30): Undeclared identifier: 'N') :)

Kannst du nochma schaun, warum das nicht ganz funktionieren könnte?
Danke schonmal für die Idee

gruß fabiO

alzaimar 12. Dez 2005 18:47

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Du musst Dir doch dein N und M selbst deklarieren...
Mach einfach
Delphi-Quellcode:
Const
  N = 50;
  M = 50;
[delphi]
Dann ist dein Life-Array 50x50 felder gross...

Modulo ist nur der 'Rest' einer Division. 17 mod 5 = 2, weil 12 geteilt durch 5 ist 3 Rest 2. Der 'Rest' ist der modulo. Ganz einfach, oder? :zwinker:

fabiO 12. Dez 2005 19:07

Re: Schwierigkeiten mit Game of Life Algorithmus
 
yo logisch, sorry stand bissl auf der leitung :)
kannte nur mod, wusste nich, dass es modulo heisst ;)

Naja ich habe das mal in den Code eingesetzt, es funktioniert wie mit meinem code, also keine veränderung...
Aber ich denke, da in den anderen Life-Programmen es genauso gemacht wird, werde ich es einfach so lassen...

Danke für die Tipps!

fabiO 12. Dez 2005 22:41

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Liste der Anhänge anzeigen (Anzahl: 1)
hab einfach ma zum Abschluss mein fertiges ( :hello: :party: :hello: ) programm drangehangen...
Falls also jemand mal die selbe Aufgabe bekommen sollte, kann er sich ja gern bedienen. :cheers:

gruß fabiO

Nikolas 13. Dez 2005 14:03

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Sieht gut aus, nur: Was bedeutet der Button 'Lebende Nachbarn'? Was du vielleicht noch machen könntest, wäre die Option verschiedene Formationen erzeugen zu lassen, wie einen r-Pentomino oder andere interessante Objekte.

fabiO 13. Dez 2005 16:13

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi...

ich hab mich doch nochma rangesetzt, und mir is ne ziemlich einfache lösung für das Problem des umlaufenden Feldes eingefallen, die ich jetzt einfach ma poste:

Delphi-Quellcode:
function nachbarn(x,y : Integer):Integer;
var a,a1,b,b1,c : Integer;
begin
  c := 0;

  for a:=x-1 to x+1 do
    for b:=y-1 to y+1 do
      begin
        a1 := a;
        b1 := b;
        if a1 = 0 then a1:=50;
        if a1 = 51 then a1:=1;
        if b1 = 0 then b1:=50;
        if b1 = 51 then b1:=1;
        if ((a1<>x) or (b1<>y)) and (alt[a1,b1] = 1) then inc(c);
      end;

  nachbarn := c;

end;
die werte für a1 und b1 kann man einfach durch die jeweiligen Feldgrenzen (+/- 1) ersetzen...

gruß fabiO

ps. der button war nur zu beginn von nutzen, um zu sehn, ob die function nachbarn funktioniert :)
das mit den verschiedenen Formationen bau ich bald ma ein, danke für die idee :)

Quaigon 12. Jan 2006 19:40

Re: Schwierigkeiten mit Game of Life Algorithmus
 
Ich hatte mir mal überlegt, wenn ich life programmiert habe, dass ich des erweitere .. aber da ich von dem programm was hier zum dl steht mal nur nen kleinen Teil verstehe, dauert das wohl noch .. aber ihr könnt das bestimmt.

ich wollte zellen nicht sofort sterben und leben lassen, sondern wenn sie "belebt wird, wird sie erstmal ne runde grün und wenn sie stirbt ne runde rot .. und an sich hab ich schwarz für tod und weiss für lebend ..

vielleicht will ja jemand von euch das probieren .. ^^ hf

MfG Q


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr.
Seite 2 von 3     12 3      

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