AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spiel des Lebens; mal wieder

Offene Frage von "Tiar"
Ein Thema von Tiar · begonnen am 28. Feb 2006 · letzter Beitrag vom 3. Mär 2006
Antwort Antwort
Tiar

Registriert seit: 28. Feb 2006
7 Beiträge
 
Delphi 7 Enterprise
 
#1

Spiel des Lebens; mal wieder

  Alt 28. Feb 2006, 17:35
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

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: http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Spiel des Lebens; mal wieder

  Alt 28. Feb 2006, 17:38
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
monta

Registriert seit: 18. Okt 2004
Ort: Dresden
141 Beiträge
 
#3

Re: Spiel des Lebens; mal wieder

  Alt 28. Feb 2006, 17:42
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:
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;
Ist nur ein grobes Beispiel zur Umsetzungsweise
Johannes M.
  Mit Zitat antworten Zitat
Tiar

Registriert seit: 28. Feb 2006
7 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Spiel des Lebens; mal wieder

  Alt 28. Feb 2006, 17:56
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...
  Mit Zitat antworten Zitat
Tiar

Registriert seit: 28. Feb 2006
7 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Spiel des Lebens; mal wieder

  Alt 2. Mär 2006, 11:46
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:
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]='tThen 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;
Schon mal im Vorraus THX
  Mit Zitat antworten Zitat
monta

Registriert seit: 18. Okt 2004
Ort: Dresden
141 Beiträge
 
#6

Re: Spiel des Lebens; mal wieder

  Alt 2. Mär 2006, 17:19
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???
Johannes M.
  Mit Zitat antworten Zitat
Tiar

Registriert seit: 28. Feb 2006
7 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Spiel des Lebens; mal wieder

  Alt 2. Mär 2006, 17:34
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!
  Mit Zitat antworten Zitat
monta

Registriert seit: 18. Okt 2004
Ort: Dresden
141 Beiträge
 
#8

Re: Spiel des Lebens; mal wieder

  Alt 2. Mär 2006, 20:24
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.
Johannes M.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

Re: Spiel des Lebens; mal wieder

  Alt 3. Mär 2006, 06:51
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]
Angehängte Dateien
Dateityp: zip life_124.zip (168,8 KB, 32x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Spiel des Lebens; mal wieder

  Alt 3. Mär 2006, 10:03
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.
Angehängte Dateien
Dateityp: exe project2_172.exe (494,5 KB, 21x aufgerufen)
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:50 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