Spiel des Lebens

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Smily

Betreff: Spiel des Lebens

BeitragFr, Dez 01, 2006 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich habe mal aus langer weile versucht, das Konzept vom "Spiel des Lebens" von Conway in Blitzbasic umzusetzen, und dabei ist das Rausgekommen ^^

Für die, die es noch nicht kennen hier eine kleine Übersicht wie es funktioniert:
Man hat eine 2-Dimensionale Matrix, In der jedes Feld eine Zelle Symbolisiert, welche entweder tod oder lebendig sein kann.
Anfangs werden erstmal willkürlich ein paar Lebende Zellen festgelegt, der Rest ist tod.
Damit hätten wir erstmal die Erste Genaration.
Jede Zelle hat 8 Nachbar-zellen.
Wenn eine Tode Zelle genau 3 Lebende Nachbarzellen hat, wird sie neugeboren, also ihr zustand wird auf lebend gesetzt.
Wenn eine Lebende Zelle weniger als Lebende Nachbarzellen hat, stirbt sie aus Einsamkeit.
Wenn eine Lebende Zelle mehr als 3 Nachbarn hat stirbt sie auch aufgrund der Überbevölkerung.
Wenn Sämtliche Zellen auf diese Weise überprüft wurden hat man nun die 2. Generation. Beim Nächsten Durchlauf ist es die Dritte usw.

Soweit zur Theorie.

Und hier ist der Code
Code: [AUSKLAPPEN]
SX = 100
SY = 100
FeldS = 10
AppTitle "Spiel des Lebens"
Dim World(SX,SY)
Dim Oldworld(SX,SY)

Local born[9]
Local keepallive[9]

keepallive[2]=1
keepallive[3]=1
born[3]=1

Graphics (SX+1)*FeldS,(SY+1)*FeldS,16,2
ClsColor 255,255,255
Color 0,0,0
Repeat
 Cls
  For X = 0 To SY
   Line X*FeldS,0,X*FeldS,(SY+1)*FeldS
  Next
  For Y = 0 To SY
   Line 0,Y*FeldS,(SX+1)*FeldS,Y*FeldS
  Next

 For X = 0 To Sx
  For Y = 0 To SY
   If RectsOverlap(X*FeldS,Y*FeldS,FeldS,feldS,MouseX(),MouseY(),1,1)
    Color 255,0,0
    Rect X*FeldS,Y*FeldS,FeldS+1,FeldS+1,0
    Color 0,0,0
    If MouseHit(1) Then world(X,Y) = World(X,Y) Xor 1
   End If
   If World(X,Y) = 1 Then Oval X*FeldS+2,Y*FeldS+2,feldS-4,FeldS-4
   OldWorld(X,Y) = World(X,Y)
  Next
 Next

 If KeyHit(57) Or KeyDown(28)
 allive = 0
 For X = 0 To SX
  For Y = 0 To SY
   Count = 0

   For DX = -1 To 1
    For DY = -1 To 1
     If DX Or DY <> 0
      NewX = X+DX
      NewY = Y+DY
      If NewX < 0 Then newX = SX
      If NewX > SX Then NewX = 0
      If NewY < 0 Then newY = SY
      If NewY > SY Then NewY = 0
      If oldworld(NewX,NewY) = 1 Then Count = Count + 1
     End If
    Next
   Next
   world(x,y) = 0

   If oldworld(x,y) = 1 Then
    If keepallive[count] Then world(x,y) = 1:allive = allive + 1
   Else
    If born[count] Then world(X,Y) = 1: allive = allive + 1
   EndIf
  Next
 Next
; Print allive
 End If

 If KeyHit(46)
  For X = 0 To SX
   For Y = 0 To SY
    World(X,Y) = 0
   Next
  Next
 End If
 If KeyHit(19)
  For X = 0 To SX
   For Y = 0 To SY
    If Rand(0,1) = 1 Then World(X,Y) = 1
   Next
  Next
 End If

 Flip
 
Until KeyHit(1)

Mit der Leertaste kann man zur nächsten Generation springen.
Mit Enter kann man sich die Entwicklung über einen Längeren Zeitraum ansehen.
Mit R Wird das Feld zufällig mit Punkten gefüllt
Mit C Wird das Feld komplett gefüllt

Es gibt einige formationen, welche sich recht interresant weiterentwickeln.
Ganz ansehlich ist zum Beispiel auch der Glider, dieser bewegt sich auf dem Spiel Feld fort:
[ ] [o] [ ]
[ ] [ ] [o]
[o] [o] [o]

Das Spielfeld in meinem Beispielcode ist ein Torus-förmiges und es wird nach dem in den oben beschriebenen 23/3 Regelwerk gespielt.
Allerdings ist der Code so ausgelegt, dass es kein Problem sein dürfte dies zu ändern, falls sich jemand weiter damit beschäftigen will.

Der Code war übrigens mein erster Ansatz, es ist also noch nicht Perfekt ^^

Gruß, Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Spikespine

BeitragFr, Dez 01, 2006 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,
nächstesmal bitte ql:Setbuffer ql:BackBuffer () einbauen, vermeidet Augenkrebs Smile

übrigens gab es das schonmal: https://www.blitzforum.de/foru...light=life
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Smily

BeitragSa, Dez 02, 2006 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
An den Backbuffer hatte ich nicht gedacht, da ich mit b+ arbeite und das dort eigentlich entfällt ^^

Und wenn ich mir so einen Kommentar mal erlauben darf:
imho ist mein Code etwas besser als der andere.
Mein Programm sieht Grafisch besser aus und ist auch etwas Flexibler.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group