Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Seite 1 von 4  1 23     Letzte »    

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