Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte (https://www.delphipraxis.net/108234-game-life-ich-koennte-etwas-hilfe-gebrauchen-bitte.html)

Lenuam 9. Feb 2008 12:49


Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Hallo zusammen,

ich bin neu hier im Forum :).
Ich muss für den Informatik Unterricht bis nächste Woche das altbekannte "Game Of Life" programmieren. Das Problem ist, dass ich nicht wirklich viel Ahnung von Programmieren habe, und demnach mit dieser eigentlich wohl leichten Schülerübung so meine Probleme habe. Ich hänge daran die nächste Generation ausgeben zu lassen...

Hier mal mein Code:

Delphi-Quellcode:
var
  Form1: TForm1;
  Leben: Boolean;
  OL, NL: Array [1..10,1..10] of Boolean;
  i, j: Integer;
  counter: integer;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
begin
    Randomize;
    for i := 1 to 8 do
      for j:= 1 to 8 do
        if Random(10) >1 then
           OL[i,j] := true
        else
           OL[i,j] := false;

      Anzeige;
end;

procedure TForm1.Anzeige;
begin
  for i := 1 to 8 do
    for j:= 1 to 8 do
      if OL[i,j] then StringGrid1.Cells[i,j] := '0'
      else StringGrid1.Cells[i,j] := '';
end;

procedure TForm1.AnzeigeN;
begin
  for i := 1 to 8 do
    for j:= 1 to 8 do
      if NL[i,j] then StringGrid1.Cells[i,j] := '0';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
     Button4.Caption := 'Weiter';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin

  for i := 1 to 8 do
    for j:= 1 to 8 do

     if OL[i-1,j-1] then counter := counter +1;
     if OL[i+1,j+1] then counter := counter +1;
     if OL[i+1,j-1] then counter := counter +1;
     if OL[i-1,j+1] then counter := counter +1;
     if OL[i,j-1] then counter := counter +1;
     if OL[i,j+1] then counter := counter +1;
     if OL[i-1,j] then counter := counter +1;
     if OL[i+1,j] then counter := counter +1;

     if (counter = 2) or (counter = 3) then NL[i,j] := true
     else NL[i,j] := false;

      if NL[i,j] then StringGrid1.Cells[i,j] := '0';

end;

end.
Ich wäre euch für jede Hilfe überaus dankbar. Ich glaube es dauert noch ein wenig bis ich mir das logische Denken angewöhnt habe dass für's Programmieren erforderlich zu sein scheint...

Vielen Dank im Vorraus!

marabu 9. Feb 2008 14:04

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Herzlich willkommen in der Delphi-PRAXiS, Lenuam.

In Pascal (Delphi) kannst du mit einem IF-Statement immer nur ein einzelnes Statement ausführen. Willst du dort mehrere Statements ausführen, dann musst du sie zu einem Block zusammenfügen.

Delphi-Quellcode:
const
  LifeSymbol: array [Boolean] of Char = (' ', '0'); // 0 = Leben, Leerzeichen = kein Leben

procedure TForm1.Button3Click(Sender: TObject);
var
  i, j, counter: Integer; // hier und nicht anderswo
begin
  for i := 1 to 8 do
    for j:= 1 to 8 do
    begin // block beginnen
      counter := 0; // initialisieren
      Inc(counter, Ord(OL[i - 1, j - 1]));
      Inc(counter, Ord(OL[i + 1, j + 1]));
      Inc(counter, Ord(OL[i + 1, j - 1]));
      Inc(counter, Ord(OL[i - 1, j + 1]));
      Inc(counter, Ord(OL[i, j - 1]));
      Inc(counter, Ord(OL[i, j + 1]));
      Inc(counter, Ord(OL[i - 1, j]));
      Inc(counter, Ord(OL[i + 1, j]));
      NL[i,j] := counter in [2, 3];
      StringGrid1.Cells[i, j] := LifeSymbol[NL[i, j]];
    end; // block beenden
end;
Freundliche Grüße

Corpsman 9. Feb 2008 14:09

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
hab auch mal ein Game of Live gemacht , falls du noch inspiration brauchst.

der Ord Befehl wandelt Boolean nach integer um

bei False = 0 und bei True = 1

deswegen fallen bei Marabu's code die ganzen inneren Ifs weg.

Lenuam 9. Feb 2008 15:10

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Schon mal vielen Dank euch beiden - ich werde das nachher ausprobieren :)

inherited 9. Feb 2008 16:41

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Zitat:

Zitat von marabu
Delphi-Quellcode:
const
  LifeSymbol: array [Boolean] of Char = (' ', '0'); // 0 = Leben, Leerzeichen = kein Leben

procedure TForm1.Button3Click(Sender: TObject);
var
  i, j, k, l, counter: Integer; // hier und nicht anderswo
begin
  for i := 1 to 8 do
    for j:= 1 to 8 do
    begin // block beginnen
      counter := 0; // initialisieren
      Inc(counter, Ord(OL[i - 1, j - 1]));
      Inc(counter, Ord(OL[i + 1, j + 1]));
      Inc(counter, Ord(OL[i + 1, j - 1]));
      Inc(counter, Ord(OL[i - 1, j + 1]));
      Inc(counter, Ord(OL[i, j - 1]));
      Inc(counter, Ord(OL[i, j + 1]));
      Inc(counter, Ord(OL[i - 1, j]));
      Inc(counter, Ord(OL[i + 1, j]));
      NL[i,j] := counter in [2, 3];
      StringGrid1.Cells[i, j] := LifeSymbol[NL[i, j]];
    end; // block beenden
end;

Geht auch kürzer:
Delphi-Quellcode:
const
  LifeSymbol: array [Boolean] of Char = (' ', '0'); // 0 = Leben, Leerzeichen = kein Leben

procedure TForm1.Button3Click(Sender: TObject);
var
  i, j, counter: Integer; // hier und nicht anderswo
begin
  for i := 1 to 8 do
    for j:= 1 to 8 do
    begin // block beginnen
      counter := 0; // initialisieren
      for k := -1 to 1 do
        for l := -1 to 1 do
          Inc(counter, Ord(OL[i+k, j+l]));
      NL[i,j] := counter in [2, 3];
      StringGrid1.Cells[i, j] := LifeSymbol[NL[i, j]];
    end; // block beenden
end;
(Ungetestet)

Lenuam 9. Feb 2008 17:38

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Okay, die Methode von marabu funktioniert schon mal prima. Jetzt muss ich nur noch irgendwie unterscheiden zwischen 2 und 3 Nachbarn...bei 2 und 3 bleibt eine Zelle besetzt, bei 3 wird aber auch eine leere Zelle besetzt.

Kann mir vielleicht noch jemand erklären wofür genau LifeSymbol verwendet wird und was eine Char Variable ist? Ach so, steht Inc einfach für increase?

Dann muss ich noch einen Timer programmieren...mal schaun ob ich das hinbekomme. Ich würde gern einfach ein bestimmtes Sekundenintervall vom User als String angeben lassen...

Ach so, und in Stringgrid kann man keine Grafiken einbinden oder? Eigentlich schade, ich hätte gern ein paar Lebensformen dafür designt ^^...

Nikolas 9. Feb 2008 17:57

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Zitat:

Kann mir vielleicht noch jemand erklären wofür genau LifeSymbol verwendet wird und was eine Char Variable ist? Ach so, steht Inc einfach für increase?
LifeSymbol ordnet True das Leerzeichen und False eine 0 zu. Für char und inc kannst du einfach mal F1 fragen. (char ist ein einzelnes Zeichen wie "a" und bei inc hast du recht).

Delphi-Quellcode:
NeuerZustand = (tot and cnt=3) or (lebendig and cnt in [2,3]);
@inherited:
Du hast ein if i=0 and j=0 then continue; vergessen. So wird noch das eigentlich Zelle mitgezählt.

inherited 9. Feb 2008 18:02

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Zitat:

Zitat von Nikolas
Du hast ein if i=0 and j=0 then continue; vergessen. So wird noch das eigentlich Zelle mitgezählt.

Stimmt.

marabu 9. Feb 2008 18:36

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Hi,

Zitat:

Zitat von Lenuam
... Jetzt muss ich nur noch irgendwie unterscheiden zwischen 2 und 3 Nachbarn...bei 2 und 3 bleibt eine Zelle besetzt, bei 3 wird aber auch eine leere Zelle besetzt. ...

betrachten wir das doch mal so: Du betrachtest acht Nachbarn einer Zelle. Eine Leerzelle wird lebendig, wenn sie mindestens drei lebende Nachbarzellen hat. Eine lebende Zelle überlebt, wenn sie mindestens zwei lebende Nachbarzellen hat. Nimm einfach einen Test für die aktuelle Zelle mit auf und schon klappt das:

Delphi-Quellcode:
begin
  for i := 1 to 8 do
    for j:= 1 to 8 do
    begin // block beginnen
      counter := 0; // initialisieren
      Inc(counter, Ord(OL[i - 1, j - 1]));
      Inc(counter, Ord(OL[i + 1, j + 1]));
      Inc(counter, Ord(OL[i + 1, j - 1]));
      Inc(counter, Ord(OL[i - 1, j + 1]));
      Inc(counter, Ord(OL[i, j - 1]));
      Inc(counter, Ord(OL[i, j + 1]));
      Inc(counter, Ord(OL[i - 1, j]));
      Inc(counter, Ord(OL[i + 1, j]));
      Inc(counter, Ord(OL[i, j]));
      StringGrid1.Cells[i, j] := LifeSymbol[counter > 2];
    end; // block beenden
end;
Übrigens machst du dann genau das, was Nikolas und Nikolai als Fehler erkannt zu haben glauben.

Wenn du die von Nikolai vorgeschlagene Code-Vereinfachung durch Schleifenbildung verstehst, dann kannst du sie ruhig benutzen.

Wenn du Grafiken verwenden möchtest, dann nimm statt des StringGrid ein DrawGrid.

Freundliche Grüße

Lenuam 10. Feb 2008 10:42

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Also ich bleibe lieber bei dem einfacheren Code ^^. Ich habe jetzt StringGrid1.Cells[i, j] := LifeSymbol[counter > 2]; eingefügt, aber so ganz funktioniert es immer noch nicht. Ich bin mir auch nicht sicher ob meine Arrays überhaupt korrekt sind...ich habe ein 10x10 Stringgrid, aber Arrays von 1-8, weil wir den äußeren Rand des Grids nicht verwenden sollen...stimmt das überhaupt so?

Das mit dem Drawgrid muss ich mir mal anschauen, hoffentlich ist es nicht zu kompliziert.

marabu 10. Feb 2008 18:19

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Hallo Manuel,

ich würde beim Grid die FixedCols und FixedRows auf 0 setzen und die Dimensionen anpassen (RowCount = ColCount = 8) und anstelle von Bildern würde ich einfach die Zellen einfärben.

Freundliche Grüße

Lenuam 10. Feb 2008 20:36

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Okay, FixedCols und FixedRows sind schon auf 0. Könnte ich das StringGrid nicht einfach trotzdem auf 10x10 lassen, dem entsprechend aber auch die Arrays und Schleifen von 1-10 durchlaufen lassen?

marabu 10. Feb 2008 20:40

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Du musst einfach nur beides aufeinander abstimmen, weil du ja die Ausgangszustände für die Berechnung der nächsten Generation aus dem Grid auslesen willst. Am einfachsten ist das sicher, wenn du auch dein Array bei 0 starten lässt.

Lenuam 12. Feb 2008 16:34

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
So, wir hatten heute wieder Unterricht, und ich bin auch ganz gut weitergekommen.
Dummerweise habe ich komischerweise noch eine etwas ältere Version auf meinem Usb Stick mitgenommen, auf welcher ich den Timer noch nicht implementiert hatte. Irgendwie falsch abgespeichert anscheinend...leider habe ich vergessen wie genau das mit dem Timer funktioniert.

Ich will dass der Timer beim "Leben starten" Button anfängt zu laufen mit einem Intervall von 1 Sekunde. Bei Pause/Weiter soll entsprechend der Prozess pausiert und fortgeführt werden, und mit der Scrollleiste soll das Intervall veränderbar sein.

Außerdem wäre ich euch sehr dankbar, wenn ihr mir erklären könntet wie ich möglichst leicht die Zellen des StringGrids einfärben kann...also das immer wenn momentan ein * erscheint, sich anstattdessen die Zelle färbt.

Hier ist mal mein aktueller Code:

Delphi-Quellcode:
var
  Form1: TForm1;
  Leben: Boolean;
  OL, NL: Array [0..70,0..70] of Boolean;
  i, j: Integer;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
begin
    Randomize;
    for i := 1 to 68 do
      for j:= 1 to 68 do
        if Random(7) > 5 then
           OL[i,j] := true
        else
           OL[i,j] := false;

      Anzeige;
end;

procedure TForm1.Anzeige;
begin
  for i := 1 to 68 do
    for j:= 1 to 68 do
      if OL[i,j] then StringGrid1.Cells[i,j] := '*'
      else StringGrid1.Cells[i,j] := '';
end;

procedure TForm1.NewGen;
var
  counter: integer;

  begin

    for i := 1 to 68 do
      for j:= 1 to 68 do
    begin

     counter := 0;
     if OL[i-1,j-1] then counter := counter +1;
     if OL[i+1,j+1] then counter := counter +1;
     if OL[i+1,j-1] then counter := counter +1;
     if OL[i-1,j+1] then counter := counter +1;
     if OL[i,j-1] then counter := counter +1;
     if OL[i,j+1] then counter := counter +1;
     if OL[i-1,j] then counter := counter +1;
     if OL[i+1,j] then counter := counter +1;

     if (counter = 2) and OL[i,j] = true then NL[i,j] := true
     else if (counter = 3) then NL[i,j] := true
     else NL[i,j] := false;

    end;

    OL := NL;
    Anzeige;
    end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  NewGen;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Interval := 500;
  NewGen;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  Close;
end;

end.

marabu 14. Feb 2008 19:25

Re: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Hi,

Zitat:

Zitat von Lenuam
... Ich will dass der Timer beim "Leben starten" Button anfängt zu laufen mit einem Intervall von 1 Sekunde. ...

das Standardintervall ist 1000 (Angabe in Millisekunden). Der Timer feuert das Ereignis OnTimer() nur, wenn seine Eigenschaft Enabled auf True gesetzt wird. Also solltest du Enabled im Object Inspector auf False setzen und diese Eigenschaft über deinen Button verändern.

Zitat:

Zitat von Lenuam
... Bei Pause/Weiter soll entsprechend der Prozess pausiert und fortgeführt werden, und mit der Scrollleiste soll das Intervall veränderbar sein. ...

Den Scrollbalken baust du selbst ein. Die momentane Position kannst du beim Ereignis OnChange als Intervall des Timers festlegen.

Zitat:

Zitat von Lenuam
... Außerdem wäre ich euch sehr dankbar, wenn ihr mir erklären könntet wie ich möglichst leicht die Zellen des StringGrids einfärben kann...also das immer wenn momentan ein * erscheint, sich anstattdessen die Zelle färbt. ...

Das könnte etwa so aussehen:

Delphi-Quellcode:
const
  LifeColor: array [Boolean] of TColor = (clWhite, clBlue);

procedure TLifeForm.StringGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do
  begin
    Canvas.Brush.Color := LifeColor[OL[ARow, ACol]];
    InflateRect(rect, -2, -2);
    Canvas.FillRect(rect);
  end;
end;
Die Eigenschaft DefaultDrawing des Grids schaltest du dann einfach ab. Das Zeichnen des Grids erzwingst du durch StringGrid.Invalidate an geeigneter Stelle.

Freundliche Grüße

Maya 15. Jun 2011 13:50

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo ihr Lieben,

da ich kein neues Topic aufmachen wollte und fand, dass das bisher besprochene hier ganz gut zu meinen Problem passt, dachte ich mir, ich nutze einfach mal den Thread hier.

Wie ihr euch sicherlich denken könnt, bastel ich mir gerade mein eigenes GoL zusammen. Es gelten bei mir die typischen 23/3-Regeln, bei dem die Ränder grundsätzlich tot sein sollen.
Damit ich mich erstmal in Ruhe an das Thema heranmachen kann, habe ich mir aus Panels ein 4x4-Feld gebastelt und einen Gleiter als Figur gewählt. Sinn der Sache soll sein, damit ich erstmal eine funktionierende Funktion (ach, tolle Grammatik) bauen kann. Im Anhang seht ihr, wie ich mir das aufbaute.

Jetzt zu meinen Problem: wie ihr im zweiten Screen seht, stimmt die erste Generation schon nicht. Eigentlich müsste es mit dem hier: http://upload.wikimedia.org/wikipedi..._Lebens%29.gif übereinstimmen. Ich bin schon seit Tagen auf der Suche (gut, nicht kontinuierlich, aber es nagt an mir), aber finde leider den Fehler nicht.

Beim debuggen ist mir aber folgendes aufgefallen.
Wenn ich bei dem Kästchen angekommen bin, wo eigentlich eine lebendige Zelle sein müsste, errechnet die Funktion 4 Nachbarn, anstatt nur drei. Die Funktion ist der Meinung, dass "unten links", wo eigentlich ja nichts ist, eine lebendige Zelle ist. Dies lässt mich vermuten, dass ich das Array falsch erstellt habe.

So, ich hoffe, dass ihr mir helfen könnt.
Delphi-Quellcode:
var
  Form1: TForm1;
  Zellen: array[1..4,1..4] of Integer;

function GameOfLife(x,y: Integer): Integer;
var Temp: Integer;
begin
  Temp:=0;
  if (Zellen[x-1,y-1]=1) then Temp:=Temp+1;
  if (Zellen[x,y-1]=1) then Temp:=Temp+1;
  if (Zellen[x+1,y-1]=1) then Temp:=Temp+1;

  if (Zellen[x-1,y]=1) then Temp:=Temp+1;
  if (Zellen[x+1,y]=1) then Temp:=Temp+1;

  if (Zellen[x-1,y+1]=1) then Temp:=Temp+1;
  if (Zellen[x,y+1]=1) then Temp:=Temp+1;
  if (Zellen[x+1,y+1]=1) then Temp:=Temp+1;

  case Temp of
  0,1,4..8: Result:=0;
  2: if (Zellen[x,y]=1) then Result:=1 else Result:=0;
  3: Result:=1;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Zaehler, i,j: Integer;
    Help: TComponent;
begin
  Zaehler:=1;
  for j:=1 to 4 do
    begin
      for i:=1 to 4 do
        begin
          Help:=Form1.FindComponent('Panel'+IntToStr(Zaehler));
          if (TPanel(Help).Color=clblack) then Zellen[i,j]:=1
              else Zellen[i,j]:=0;
          Zaehler:=Zaehler+1;
        end;
    end;

  Zaehler:=1;
  for j:=1 to 4 do
    begin
      for i:=1 to 4 do
        begin
          Help:=Form1.FindComponent('Panel'+IntToStr(Zaehler));
          if (GameOfLife(i,j)=1) then TPanel(Help).Color:=clblack
              else TPanel(Help).Color:=clwhite;
          Zaehler:=Zaehler+1;
        end;
    end;


end;

end.
Achso: das ist eine Aufgabe u.A. für die Berufsschule und da war gewollt, dass wir ein zweidimensionales Array für nehmen. Nur falls jemand auf eine andere Lösung kommt.

DeddyH 15. Jun 2011 13:54

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Zitat:

Delphi-Quellcode:
if (Zellen[x-1,y-1]=1)

Im ersten Durchlauf werden hier für x und y jeweils 1 übergeben, d.h. Du bleibst unterhalb der Array-Grenzen, da Du ja auf Zellen[0,0] zugreifst. Das musst Du schon abfangen, genauso wie im umgekehrten Fall (also + 1 beim jeweils letzten Element).

Maya 15. Jun 2011 13:57

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Zitat:

Zitat von DeddyH (Beitrag 1106547)
Im ersten Durchlauf werden hier für x und y jeweils 1 übergeben, d.h. Du bleibst unterhalb der Array-Grenzen, da Du ja auf Zellen[0,0] zugreifst. Das musst Du schon abfangen, genauso wie im umgekehrten Fall (also + 1 beim jeweils letzten Element).

*Head meets desk* Natürlich!
Danke für die schnelle Antwort! *Stirn mit der Hand reib*

DeddyH 15. Jun 2011 14:04

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Tipp: Bereichsprüfung einschalten, dann fällt so etwas sofort auf ;)

implementation 15. Jun 2011 14:16

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Wenn du bei Panel (1,1) den Nachbarn links, oben, oder links oben betrachten willst, stößt du auf einen unbekannten Eintrag :stupid:
Genau wie die Nachbarn rechts, unten und rechts unten von (4,4).

Maya 15. Jun 2011 14:41

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Das dachte ich mir schon, als ich den Hinweis von DeddyH las.
Ich hab deswegen die Funktion jetzt wie folgt umgebaut.

Delphi-Quellcode:
function GameOfLife(x,y: Integer): Integer;
var Temp: Integer;
begin
  Temp:=0;
  if (x>1) and (y>1) and (Zellen[x-1,y-1]=1) then Temp:=Temp+1;
  if (y>1) and (Zellen[x,y-1]=1) then Temp:=Temp+1;
  if (x<4) and (y>1) and (Zellen[x+1,y-1]=1) then Temp:=Temp+1;

  if (x>1) and (Zellen[x-1,y]=1) then Temp:=Temp+1;
  if (x<4) and (Zellen[x+1,y]=1) then Temp:=Temp+1;

  if (x>1) and (y<4) and (Zellen[x-1,y+1]=1) then Temp:=Temp+1;
  if (y<4) and (Zellen[x,y+1]=1) then Temp:=Temp+1;
  if (x<1) and (y<4) and (Zellen[x+1,y+1]=1) then Temp:=Temp+1;

  case Temp of
  0,1,4..8: Result:=0;
  2: if (Zellen[x,y]=1) then Result:=1 else Result:=0;
  3: Result:=1;
  end;
end;
Leider stimmt das Ergebnis immer noch nicht mit dem überein, was eigentlich auftauchen sollte. Ist irgendwo ein Denkfehler noch enthalten?
Bei Optionen habe ich ausgestellt, dass die boolschen Ausdrücke vollständig überprüft werden.

Jumpy 15. Jun 2011 14:48

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Da man das nicht sehen kann: Arbeitest du auch mit zwei Arrays?
Dem alten und dem neuen, das danach zum alten wird?
Oder hast du nur ein Array, in dem du Einträge änderst, was Einfluss auf spätere Felder haben kann?

Maya 15. Jun 2011 17:03

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Ich lese in ein Array (Zellen) die ganzen Informationen ein, also ob das Feld schwarz ist (also lebt) oder weiß ist (tot).
Danach lese ich in der Funktion ja aus, wie viele Nachbarn die Zelle hat, das speichere ich in der Temp-Variable. D.h. das Array nutze ich eigentlich nur, um zu speichern, ob die Zelle lebendig ist oder nicht und am Ende um es immer wieder auszulesen.

Daniela.S 15. Jun 2011 18:43

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
letzte Nachbarzelle...

Delphi-Quellcode:
function GameOfLife(x,y: Integer): Integer;
var Temp: Integer;
begin
  Temp:=0;
  if (x>1) and (y>1) and (Zellen[x-1,y-1]=1) then Temp:=Temp+1;
  if (y>1) and (Zellen[x,y-1]=1) then Temp:=Temp+1;
  if (x<4) and (y>1) and (Zellen[x+1,y-1]=1) then Temp:=Temp+1;

  if (x>1) and (Zellen[x-1,y]=1) then Temp:=Temp+1;
  if (x<4) and (Zellen[x+1,y]=1) then Temp:=Temp+1;

  if (x>1) and (y<4) and (Zellen[x-1,y+1]=1) then Temp:=Temp+1;
  if (y<4) and (Zellen[x,y+1]=1) then Temp:=Temp+1;
  if (x<4) and (y<4) and (Zellen[x+1,y+1]=1) then Temp:=Temp+1; // <----x<4

  case Temp of
  0,1,4..8: Result:=0;
  2: if (Zellen[x,y]=1) then Result:=1 else Result:=0;
  3: Result:=1;
  end;
end;

Maya 15. Jun 2011 19:06

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Zitat:

Zitat von Daniela.S (Beitrag 1106582)
letzte Nachbarzelle...

Delphi-Quellcode:
function GameOfLife(x,y: Integer): Integer;
var Temp: Integer;
begin

  if (x<4) and (y<4) and (Zellen[x+1,y+1]=1) then Temp:=Temp+1; // <----x<4

Dankeschön! Es klappt!

Maya 16. Jun 2011 10:02

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
So, ich stoße mal wieder an meine Grenzen.
Problem, ich möchte dynamisch viele Edit-Felder erzeugen, um das Gitternetz herzustellen. Das Erzeugen an sich ist nicht das Problem, aber der Nutzer soll über ein Edit-Feld eingeben, wieviele Zellen er haben möchte. Wenn also der Spieler jetzt sagt, er möchte 25 Zellen, würde man ja ein 5x5-Feld basteln. Aber wenn er jetzt z.B. 20 Zellen möchte, braucht man ein Feld von der Größe 4x5.

Jetzt ist mir schleierhaft, wie ich das berechnen soll. Könnte mir jemand einen Tipp geben?

DeddyH 16. Jun 2011 10:07

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Die Berechung an sich dürfte ja eine enfache Division sein, ich frage mich vielmehr, ob es da einen konstanten bzw. errechenbaren Faktor gibt (statt 4x5 könnten es ja auch 5x4 sein, wie soll das also festgelegt werden?).

Maya 16. Jun 2011 10:10

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Mh, bei 20 könnte man ja auch 2x10 rechnen. Deswegen ist es mMn nicht einfach nur 'ne simple Division. Wie sag ich dem also, dass ich lieber 4x5 haben möchte, anstatt 2x10? Ich glaube, das meinst du auch da mit dem Faktor, oder verstehe ich das jetzt falsch?

DeddyH 16. Jun 2011 10:11

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Genau das meinte ich. Spontan würde ich sagen, dass dieser Faktor ja nahe an der Wurzel der eingegebenen Zahl liegen muss.

Maya 16. Jun 2011 10:17

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Dachte ich mir auch schon und hab deswegen das hier gebastelt.

Delphi-Quellcode:
 

procedure TForm1.bbtn_ErzeugenClick(Sender: TObject);
var Anzahl, i, j, k: Integer;
    Ergebnis: real;
    Help: String;
begin
  if (lbledt_Anzahl.Text='') then Showmessage('Bitte geben Sie eine Zahl ein!')
  else
    begin
      Anzahl:=StrToInt(lbledt_Anzahl.Text);
      Ergebnis:=sqrt(Anzahl);
      Help:=FloatToStr(Ergebnis);
      j:=StrToInt(Help);
      for i:=1 to j do
        begin
          for k:=1 to j do
            begin
              if TEdit(FindComponent('Edit'+IntToStr(Zahl)))=nil then
                begin
                  edFeld:=TEdit.Create(Self);
                  with edFeld do
                    begin
                      Parent:=Self;
                      AutoSize:=False;
                      Name:='Edit'+IntToStr(Zahl);
                      Left:=(34*i)+20;
                      Top:=(34*k)+105;
                      Width:=35;
                      Height:=35;
                      Color:=clwhite;
                      Ctl3D:=False;
                      Text:='';
                      onClick:=Edit1Click;
                    end;                           //with
                  Zahl:=Zahl+1;
                end;                               //if Komponenten suchen
            end;                                   //for k:=1
          end;                                         //for i:=1
    end;                                               //Fehlerabfang
end;
Haut soweit gut hin, solange es Zahlen wie 36 (Wurzel 6), 16(4) oder 25(5) sind. Bloß schon bei 20 scheiterte es, weil 4,4721... kein gültiger Integerwert ist. -.-

EDIT: Mh, ich will bei 20 ja z.B. 4 und 5 haben. Wenn ich dem jetzt sage, dass er für i abrunden und für j aufrunden soll? Dann hätte ich 4 und 5!

EDIT2: Nee, funktioniert nicht. Bsp: 14, da geht nur 2x7 und da ist nix mit auf- und abrunden.

DeddyH 16. Jun 2011 10:39

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Naja, ich frage mich sowieso, was Du bei Primzahlen machen willst. Ganz so einfach wird das also wohl doch nicht.

Memnarch 16. Jun 2011 10:56

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Kleine frage nebenbei:
Anstatt durch die Mauer zu rennen, nutz doch einfach die offene Tür daneben:

Der User soll einfach Breite/Höhe angeben und fertig.

Hab gestern nachdem ich das hier gelesen hab, auch nen GOF programmiert. Allerdings war es mir lieber ne Bitmap für die darstellung zu nehmen(ein Pixel = eine zelle).

Und glaub mir, der User will nicht nur 20Felder^^. Hab hier ne Welt von 512*512 Felder, das ist schon spannender :).

Wenn du das GOF programmiert hast, und alles soweit funktioniert, und du noch Zeit und Motivation hast, kannst du ja auchmal probieren das ganze so zu programmieren dass man das Regelwerk des GOF ändern kann :P. Aber das nur wenn du da am ende noch zeit für hast, als exkurs^^.
Dazu: Conways_Spiel_des_Lebens

Schätze mal deine welt funktioniert gerade nach den Conway Regeln :wink:

EDIT: Fail. Mein Post bezog sich auf den Threadersteller, aber das war ja 2008, der zwischenposter hat ja bereits geschrieben dass es nach den Connway regeln geht >.<.

Edit2(PS): War es nicht sowieso so, dass man eher neue Threads erstellen sollte als andere zu Hijacken?

MFG
Memnarch

Maya 16. Jun 2011 11:24

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Die Idee, Höhe und Breite anzugeben, finde ich trotzdem gut und werde sie umsetzten. ;)

DeddyH 16. Jun 2011 11:26

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Das dürfte auch das Einfachste sein ;)

Memnarch 16. Jun 2011 11:27

AW: Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte
 
Kein ding^^.

Hatte so halb den Postwechsel zwischen dir und den anderen gelesen, dann zum hauptpost gewechselt, um mal kurz ne übersicht zu bekommen und dann gepostet :D. Ohne die sache mit den Connway regeln wär die unordnung gar nicht aufgefallen :P.

@DeddyH: eben^^

PS: yuhu, roterkasten war da :D


MFG
Memnarch


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 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