![]() |
Spiel des Lebens; mal wieder
Also erstmal Hallo an alle; hab mich grad mal hier angemeldet!
So, wie ich mitbekommen habe, scheint diese Spiel-des-Lebens-Geschichte ja sehr beliebt bei den Info-Lehrern. Jedenfalls hab auch ich jetzt diese Aufgabe, nur leider komm ich mit den bisherigen Vorschlägen oder Lösungen so gar nicht zurecht, da ich auch nicht unbedingt ein Profi bin, was das programmieren angeht. Jedenfalls war ich in meinem Gedankengang bisher so weit, dass ich die Ausgabe über ein schlichtes Stringgrid realisieren möchte. Was mir aber jetzt wirklich noch Sorgen bereitet ist das Verpacken der Informationen in dieses zweidimensionale Char-Feld :?: :gruebel: :wiejetzt: Ließe sich das überhaupt über dieses Stringgrid realisieren? Und wie kann ich als Ausgangssituation dieser Simulation die Felder zufällig (in der Anordnung aber mit vorher festgelegter Anzahl) belegen?? Naja, vielen Dank schon mal für die Mühe und eure Hilfe Edit: für alle die dieses Spiel nicht kennen: ![]() |
Re: Spiel des Lebens; mal wieder
vielleicht könntest du das "Spiel des Lebens" noch genauer erläutern für die jenigen die noch nix davon gehört haben (z.B Ich)
|
Re: Spiel des Lebens; mal wieder
Prinzipiell lässt sich das über einen Stringggrid Regeln. Du benötigst allerding wohl noch ein temporären zweiten Grid (Array) als Zwischenspeicher - so würde ich es zumindest machen.
was die Belegung angeht: ermittle mittel Random() eine x und eine y Koordinate und prüfe ob dieses Feld bereits belegt ist, wenn nicht setzt du dort ein Kästchen und erhöhst eine Variable, welche die gesetzten Kästchen zählt um eins. Ist das Feld dagegen schon belegt, fang einfach wieder an und such neue Koordinaten und Teste wieder auf Belegung usw.
Delphi-Quellcode:
Ist nur ein grobes Beispiel zur Umsetzungsweise
var x, y, Anzahl: integer;
Randomize; //Initialisiert Random repeat x := Random(Grid.RowCount); Y := Random(Grid.ColCount); if Grid.Cells[y, x] = '' then begin Grid.Cells[y, x] := 'B'; //B kennzeichnet dabei besetzte Zellen inc(Anzahl); end; until Anzahl = Eingestellter Anzahl; |
Re: Spiel des Lebens; mal wieder
SEHR GUT Und schon mal ein großes DANKE@monta für die Initialisierung; genau so hab ich mir das vorgestellt!
Was bleibt ist aber die Frage nach dem Speichern bzw dem Einlesen und Abrufen der "Lebensinformationen" in das Char-Array. Kann mir das nicht konkret vorstellen... |
Re: Spiel des Lebens; mal wieder
So, ich bin zwar ein Stück weiter, aber ich komm einfach nicht mit der Konvertierung vom stringgrid in das char-feld klar. mein prog. startet zwar, aber sobald ich die zweite generation generieren lassen möchte, stürzt es ab.
Hat jemand einen hilfreichen Tipp oder konstruktive Kritik bzw ne Idee, wie ich das umsetzen könnte. Wär super, wenn sich jemand mal meinen anscheinend verkorksten Quelltext zu Gemüte ziehen würde:
Delphi-Quellcode:
Schon mal im Vorraus THX
var
Lebensraumsimulator: TLebensraumsimulator; p,s,an,n :integer; //p=eingegebene Anfagszahl Individuen, s=Seitenlänge des Grids, n=Nachbar, an=Anzahl Nachbarn l:ARRAY of ARRAY of char; implementation {$R *.DFM} Function Feldcheck(x,y:integer):integer; VAR x2,y2 :integer; BEGIN an:=0; begin For x2:=x-1 to x+1 do For y2:=y-1 to y+1 do If not (x2=x) and (y2=y) then If (x2>=0) and (x2<s) and (y2>=0) and (y2<s) then If l[x2,y2]='*' Then inc(an); end; result:=an; END; PROCEDURE Evolution; VAR x,y,x3,y3 :integer; BEGIN For x:=0 to s-1 Do For y:=0 to s-1 Do n:=Feldcheck(x,y); If l[x,y]='*' Then Begin If n=2 or 3 Then l[x3,y3]:='*' Else l[x3,y3]:='t'; End; If l[x,y]='t' Then Begin If n=3 Then l[x3,y3]:='*' Else l[x3,y3]:='t'; End; END; PROCEDURE Ausgabe; //Das Array mit x3 und y3 soll die Werte zwischenspeichern, hab ich mir zumindest so gedacht VAR x,y,x3,y3:integer; BEGIN For x:=0 to s-1 do For y:=0 to s-1 do If l[x3,y3]='*' Then Lebensraumsimulator.Stringgrid1.Cells[x,y]:='*' Else Lebensraumsimulator.Stringgrid1.Cells[x,y]:=''; END; procedure TLebensraumsimulator.Button5Click(Sender: TObject); //Klick "Weiter" var x,y:integer; begin Button2.visible:=false; Button3.visible:=false; g:=g+1; Label5.Caption:=IntToStr(g); for x:=0 to s-1 do for y:=0 to s-1 do If Stringgrid1.Cells[x,y]='*' Then l[x,y]:='*' //Bei Einzelablauf erscheint an genau dieser Stelle die Fehlermeldung, Warum? Else l[x,y]:='t'; Evolution; Ausgabe; end; |
Re: Spiel des Lebens; mal wieder
wieso machst du es eigentlich so kompliziert, das char Feld immer noch mit t für tote Zellen zu belegen und ansonsten mit * für lebende.
Es gibt doch nur zwei Zustände, also würde es ja auch langen, die Zellen, welche leben mit * zu belegen und in die toten Zelen einfach := 0 zu schreiben. Damit sparst du dir auch die etlichen Umwandlungen, wie du sie zum Beispiel beim Zeichnen drin hast: If Stringgrid1.Cells[x,y]='*' Then. Da du ja eh dann dein Char-feld in den Grid schreibst und dort nur die lebenden Zellen darstellen willst, würde ich es so machen für lebenden Zellen '+' und für tote einfach '' zuzuweisen. Das ist einfach logischer - finde ich zumindest, da du so die Zellen des Grid direkt an das Array zuweisen kannst. Was erscheint denn für eine Fehlermeldung??? |
Re: Spiel des Lebens; mal wieder
die Fehlermeldung ist, dass er aus ner Speicheradresse etwas nicht lesen kann bzw es dabei nen Fehler gibt.
Wenn ich dem Array '' für tote Zellen zuweise, meckert er rum, dass String und Char nicht kompatibel sind! und :=0 geht auch nicht, is ja ein Integer-Wert. Noch ne andere Frag: muss man überhaupt den Status eines Feldes im Grid in das Array einlesen? Also brauch ich die Stelle "If Stringgrid1.Cells[x,y]='*' Then l[x,y]:='*' " überhaupt? Hab mir ja schon alle möglichen Varianten von diesem Spiel angesehen, aber genau diese Zeile vermiss ich da immer! |
Re: Spiel des Lebens; mal wieder
Alternativ könntest du ein Leerzeichen nehmen, das würde zumindest if sparen, da du es ja als Leerzeichen in den Grid eintrgaen könntest, aber das ist dann wohl nicht so bedeutend.
Was ich gerade nicht ganz verstehe, warum verwendest du zum Beispiel bei Ausgabe als Variablen x3 und y3, mit welchen du auch ein Feld ansprechen willst, allerdings sind die doch überhaupt nicht initalisiert und dürften doch als integer Zufallswerte enthalten? Das sieht irgendwie höchst merkwürdig aus. Seh ich das richtig, das es bei der ersten generieren komplett durchläuft und die Prozedure für Weiter erst beim zweiten Durchlauf einen Fehler produziert? Du kannst mir auch mal den Kompletten Quellcode per pm schicken, wenns noch nicht geht - schau ich mal drüber, vielleicht find ich denn eigentlichen Fehler. |
Re: Spiel des Lebens; mal wieder
Liste der Anhänge anzeigen (Anzahl: 1)
Dein Ansatz ist schlecht. Trenne deine Datenhaltung von der Visualisierung.
Die Wahl des StringGrid ist eine intuitive Wahl die nichts mit praktischen Erwägungen zu tuen hat, sie ist infakt schlecht. Besser: mache dir Gedanken wie die Datenstruktur für das Game of Life am besten aussehen müsste damit du am einfachsten damit rechnen kannst. Dann konstruiere diese Datenstruktur in PASCAL, also programmiere sie einfach. In diesem Falle ein simples zweidimensionales Array[x,y] of Boolean oder so. Danach programmierst du die Anbindung dieser Datenstruktur an das GUI, ergo die sogenante Visualsierung und Editierungen. Dazu köntest du ein TStringGrid nehmen oder es ansprechnder zb. mit einer TBitmap + TPainBox, TBitmap + TImage etc. pp. umsetzen. Die Editierung ist dann ein Kinderspiel, einfach die Mauskoordinaten in die Koordinaten deiner Datenstruktur -> Array[x,y] umrechnen und neue Werte dort eintragen. Anbei mal meine Version des Ganzen als Beispiel. Gruß Hagen [edit] Habe mal auf die Schnelle par Kommentare reingeschrieben. [/edit] |
Re: Spiel des Lebens; mal wieder
Liste der Anhänge anzeigen (Anzahl: 1)
Hihi .. hab mich nun auch mal an so nem ding versucht ...
Naja is bei weitem nicht so schön wie Hagen's version aber ich hab ja auch nur ein paar Minuten (gefühlte) reingesteckt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr. |
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