Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Game Of Life (Spiel des Lebens) Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 16.05.2018 2:59)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ----------------------------------------------------------------------------
' DEMO für schnelles Bit-Feld: Game Of Life (Spiel des Lebens)
' In OCBASIC 1.11a für Open-Maxi von Dietmar Harlos am 13. Mai 2018
' ----------------------------------------------------------------------------

' Das Game Of Life (Spiel des Lebens) ist eine Computersimulation. Lebewesen
' verteilen sich auf einem karierten Feld. Je nach Nachbarschaft bleiben sie
' am Leben, sterben oder bringen neues Leben hervor.

' Beschreibung im Internet:

' http://www.mathematische-basteleien.de/gameoflife.htm
' https://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens

' Dieses Programm muß mit dem Terminalprogramm TERMINAL32.EXE mit einer
' Fenstergröße von 80 mal 50 Zeichen angeschaut werden.

' Ende durch Drücken der Eingabetaste (auch Return oder Enter genannt).

' Leider wird dieses Programm sehr stark durch die langsame Serielle
' Schnittstelle ausgebremst.

' Es wird mit zwei Buffern gearbeitet.

' ----------------------------------------------------------------------------

INCLUDE "omax.def"         'Definitionen für die Open-Maxi

' ----------------------------------------------------------------------------

DEFINE bitarrayaddr &h02aa 'Startadresse des Bit-Feldes (über 10000 Elemente)

DEFINE maxx 79             'Bildschirmgröße
DEFINE maxy 48             '(2 Buffer mit je (maxx+1)*(maxy+1) Elementen)

DIM sx,sy,x,y,n,t BYTE     'einige Variablen
DIM w WORD

' ----------------------------------------------------------------------------

RANDOMIZE 0                'Zufallszahlengenerator initialisieren

FOR w=1 TO 400             'einige Lebewesen setzen
  pset (((RAND SHR 1) AND &h7fff)/(32767/maxx),((RAND SHR 1) AND &h7fff)/(32767/maxy))
NEXT w

REPEAT
  PUT 11                   'HOME

  FOR w=0 TO ((maxx+1)*(maxy+1))/8-1   'Buffer 2 nach Buffer 1 kopieren
    POKE bitarrayaddr+w,PEEK((maxx+1)*(maxy+1)/8+bitarrayaddr+w)
  NEXT w

  FOR sy=0 TO maxy
    FOR sx=0 TO maxx

      n=0                  'Nachbarlebewesen zählen
      IF point(sx-1,sy-1) THEN ADD n,1
      IF point(sx  ,sy-1) THEN ADD n,1
      IF point(sx+1,sy-1) THEN ADD n,1
      IF point(sx-1,sy  ) THEN ADD n,1
      IF point(sx+1,sy  ) THEN ADD n,1
      IF point(sx-1,sy+1) THEN ADD n,1
      IF point(sx  ,sy+1) THEN ADD n,1
      IF point(sx+1,sy+1) THEN ADD n,1
  '    PRINT n;

      IF point(sx,sy) THEN     '1. Fall: Die Zelle a ist besetzt.
        PUT ASC("*")
        IF n<>2 AND n<>3 THEN  'Das Lebewesen in dieser Zelle überlebt, wenn es 2 oder 3 Nachbarn hat.
          pclear(sx,sy)
        ELSE
          pset(sx,sy)
        END IF
      ELSE                     '2.Fall: Die Zelle a ist nicht besetzt.
        PUT ASC(" ")
        IF n=3 THEN            'Gibt es zu dieser Zelle genau 3 Lebewesen in den Nachbarzellen, so entsteht hier ein neues Lebewesen.
          pset(sx,sy)
        ELSE
          pclear(sx,sy)
        END IF
      END IF

    NEXT sx
  NEXT sy

  IF RXD THEN t=GET
UNTIL t=13                 'Ende mit Enter-Taste

End2Host=ON                'Nach Programmende in den Host-Modus
END                        'Programmende, Neustart mit der Enter-Taste

' ----------------------------------------------------------------------------

' Punkt im Buffer 1 abfragen

FUNCTION point(x,y)
  IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN OFF
  RETURN bitarray_get(y*(maxx+1)+x)
END FUNCTION

' Punkt im Buffer 2 setzen

PROCEDURE pset(x,y)
  IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN
  bitarray_set((maxx+1)*(maxy+1)+y*(maxx+1)+x)
  RETURN
END PROCEDURE

' Punkt im Buffer 2 löschen

PROCEDURE pclear(x,y)
  IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN
  bitarray_clear((maxx+1)*(maxy+1)+y*(maxx+1)+x)
  RETURN
END PROCEDURE

' ----------------------------------------------------------------------------

INCLUDE "bitarray.pro"     'INCLUDE-Datei für Bit-Feld-Routinen

' ----------------------------------------------------------------------------

INCLUDE "om_fw.pro"        'INCLUDE-Datei für Firmwareroutinen

' --------------------------------------------------------------------------


Passender Link: Game Of Life (Spiel des Lebens) als ZIP-Archiv

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten: