![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ---------------------------------------------------------------------------- ' 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 |