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 Spiel des Lebens (https://www.delphipraxis.net/91603-spiel-des-lebens.html)

Stillmatic 9. Mai 2007 14:06

Re: Spiel des Lebens
 
Bevor ich mich an die Rechnung der nächsten Generation mache muss ich zunächst einmal ein anderes problem lösen!!!

Bei unserem Programm kann man ja per Button das Spielfeld in der Höhe und Breite verändern!
Nun soll das StringGrid (Spielfeld) die Felder die Belegt sind aber ausserhalb des Spielfeldes liegen deaktiviert (also 'nicht besetzt') werden!
Z.B.

[ ] [ ] [ ] [ ] [ ]
[ ] [ ] [#] [ ] [ ]
[ ] [#] [ ] [#] [ ] ---> Sichtbarer bereich ( 5x5 )
[ ] [ ] [#] [ ] [ ]
[ ] [ ] [ ] [ ] [ ]

Und dann das Spielfeld verkleinert wird.....

[ ] [ ] [ ] [ ] [ ]
[ ] [ ] [#] [ ] [ ] ---> Sichtbarer bereich ( 5x3 )
[ ] [#] [ ] [#] [ ]

[ ] [ ] [#] [ ] [ ] ---------------------------
[ ] [ ] [ ] [ ] [ ] ---> Nicht Sichtbar


Wie könnte man das ganze umsetzen??
Das Programm ist in 4 Units aufgeteilt.
Eine für die Typen, eine für die Spielfeldvarianten,die HauptUnit mit dem Formular und dem StringGrid und eine Unit die die Spiellogik enthält( also das Array(boolean) ist dort deklariert)!
Wie könnte man das ganze Programmieren sodass, wenn in der Spiellogik Unit ein Feld belegt ist aber ausserhalb des Sichtbaren Bereiches des StringGrids liegt(HauptUnit) das Feld im Stringgrid nicht besetzt wird???
Hauptunit uses Spiellogik.
Spiellogik hat keinen Zugriff auf Hauptunit

Versteht ihr mein Problem??

*THX*

Stillmatic 9. Mai 2007 19:51

Re: Spiel des Lebens
 
Problem hat sich gelöst!!!!

So nun zur Berechnung der Nächsten Generation!
Wenn mann die ganze Rechnung mit den (x+1,x-1,y+1,y-1) aufbauen würde so hätten wir aber das Problem mit einem Feld das am Rand liegt bei dem es dann kein x+1 oder y+1 analog x-1 oder y-1 gibt, würde man ja ein Range Check Error bekommen da man Operationen ausserhalb des Arrays durchführen möchte!

Hätte einer von euch eine Lösung für diese Problem???

*THX*

shmia 10. Mai 2007 09:10

Re: Spiel des Lebens
 
Zitat:

Zitat von Stillmatic
... so hätten wir aber das Problem mit einem Feld das am Rand liegt

Sag mal, hast du eigentlich gelesen (und verstanden), was ich oben geschrieben habe?? :twisted:
Thread-Beitrag #9 !

Stillmatic 10. Mai 2007 11:26

Re: Spiel des Lebens
 
Ja den hab ich gelesen!
Sry hab vergessen zu erwähnen das wir ein springen eines Steines nicht Programmieren müssen!
Also die Steinchen springennicht vom Ende zum Anfang!

shmia 10. Mai 2007 13:21

Re: Spiel des Lebens
 
Zitat:

Zitat von Stillmatic
Sry hab vergessen zu erwähnen das wir ein springen eines Steines nicht Programmieren müssen!
Also die Steinchen springennicht vom Ende zum Anfang!

Wikipedia ( http://de.wikipedia.org/wiki/Game_of_life#Das_Spielfeld ) sagt:
Zitat:

Zitat von Wikipedia
Da ein reales Spielfeld immer einen Rand hat, muss das Verhalten dort festgelegt werden. Man kann sich den Rand z. B. durch tote Zellen belegt denken, so dass manche Gleiter ihre Bewegungsrichtung dort ändern. Eine andere Möglichkeit ist ein Torus-förmiges Spielfeld, bei dem alles, was das Spielfeld nach unten verlässt, oben wieder herauskommt und umgekehrt, und alles, was das Spielfeld nach links verlässt, rechts wieder herauskommt und umgekehrt.

Ich habe oben gezeigt, wie man ein Torus-förimiges Spielfeld baut.
Möchte man dies nicht, dann muss man doch nur in der Function FnkNachbarn prüfen, ob X und Y noch auf dem Spielfeld sind:
Delphi-Quellcode:
Function FnkNachbarn(i,j:integer):integer;
   function IstBelegt(x,y:integer):boolean;
   begin
      result := (x>=MIN_X) and (x<=MAX_X) and (y>=MIN_Y) and (y<=MAX_Y) and curGen[x,y];
   end;
var
   Nachbarn :integer;
Begin
Nachbarn:= 0;
  if IstBelegt(i,j+1) then  //unten
     Nachbarn:= Nachbarn + 1;
  ...

Stillmatic 10. Mai 2007 20:39

Re: Spiel des Lebens
 
Hi!!

Ich hab noch eine Frage zur genauen Berechnung der Nächsten Generation!
Wann passiert bei wievielen Nachbarn was??

Wir haben eine kleine case Anweisung geschrieben die aber irgendwie Fehlerhaft sein muss, kann da mal jemand rüber schauen??

Code:
for i := (low(UTypes.cMaxWidth)+1) to UTypes.cMaxWidth do
 Begin
  for j := (low(UTypes.cMaxHeight)+1) to UTypes.cMaxHeight do
   Begin
    FeldNachbarn := Nachbarn(i,j);
    case FeldNachbarn of
    0..1: curGen[i,j] := false;     //weniger als Zwei Nachbarn
       3: curGen[i,j] := true;      //Zelle mit drei Nachbarn --> NeuGeboren
       2: curGen[i,j] := curgen[i,j];// Nix tun
    4..8: curGen[i,j] := false;

    end;
   end;
 end;
*THX*

shmia 11. Mai 2007 09:36

Re: Spiel des Lebens
 
Deine Schleifenanfangswerte sind sehr suspekt: (low(UTypes.cMaxWidth)+1) sieht für mich falsch aus.
Du brauchst doch ZWEI Arrays: curGen[] und newGen[]. Ich sehr hier nur curGen[]. Das ist auf jeden Fall der Hauptfehler.

TeronG 11. Mai 2007 09:41

Re: Spiel des Lebens
 
Zitat:

Zitat von shmia
Du brauchst doch ZWEI Arrays: curGen[] und newGen[]. Ich sehr hier nur curGen[]. Das ist auf jeden Fall der Hauptfehler.

Naja das 2te Array könnte sich ja hinterm 'Nachbarn(i,j)' verstecken.

shmia 11. Mai 2007 10:01

Re: Spiel des Lebens
 
Zitat:

Zitat von TeronG
Zitat:

Zitat von shmia
Du brauchst doch ZWEI Arrays: curGen[] und newGen[]. Ich sehr hier nur curGen[]. Das ist auf jeden Fall der Hauptfehler.

Naja das 2te Array könnte sich ja hinterm 'Nachbarn(i,j)' verstecken.

Schon möglich, dann wär's trotzdem aber noch falsch
Delphi-Quellcode:
       2: curGen[i,j] := curgen[i,j];// Nix tun
       // dann müsste es aber so sein
       2: curGen[i,j] := OldGen[i,j];// Lebewesen kopieren

loetmann 11. Mai 2007 12:39

Re: Spiel des Lebens
 
Hallo,

meinst Du so was: http://www.a-d-k.de/game/games02/leben/leben.html
bei http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens ist das auch nochmal erklärt.

Ein Gruß


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

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz