AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Game Of Life - ich könnte etwas Hilfe gebrauchen, bitte

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

Ein Thema von Lenuam · begonnen am 9. Feb 2008 · letzter Beitrag vom 16. Jun 2011
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Lenuam

Registriert seit: 29. Jan 2008
6 Beiträge
 
#1

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

  Alt 9. Feb 2008, 12:49
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!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

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

  Alt 9. Feb 2008, 14:04
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
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

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

  Alt 9. Feb 2008, 14:09
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.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Lenuam

Registriert seit: 29. Jan 2008
6 Beiträge
 
#4

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

  Alt 9. Feb 2008, 15:10
Schon mal vielen Dank euch beiden - ich werde das nachher ausprobieren
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 9. Feb 2008, 16:41
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)
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
Lenuam

Registriert seit: 29. Jan 2008
6 Beiträge
 
#6

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

  Alt 9. Feb 2008, 17:38
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 ^^...
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#7

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

  Alt 9. Feb 2008, 17:57
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).

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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 9. Feb 2008, 18:02
Zitat von Nikolas:
Du hast ein if i=0 and j=0 then continue; vergessen. So wird noch das eigentlich Zelle mitgezählt.
Stimmt.
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

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

  Alt 9. Feb 2008, 18:36
Hi,

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
  Mit Zitat antworten Zitat
Lenuam

Registriert seit: 29. Jan 2008
6 Beiträge
 
#10

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

  Alt 10. Feb 2008, 10:42
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 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