VC 20 + 3 KByte
Spiele

LIFE – Das Spiel des Lebens

Mit diesem Spiel erforschen Sie das Leben. Organismen werden geboren, überleben oder sterben im Evolutionsprozeß. Wie sich die Organismen entwickeln, liegt an Ihnen.

Das Spiel »LIFE« besteht aus zwei Programmteilen, einem Maschinenspracheteil »Life mc loader« (Listing 1) und dem Hauptprogramm »Life basic program« (Listing 2). Für das Spiel wird eine 3 KByte Erweiterung benötigt. Haben Sie beide Programmteile abgetippt und gespeichert, ist zunächst » life mc loader« zu laden und mit RUN zu starten. Geben Sie nun NEW ein und laden das Hauptprogramm, das sich ebenfalls mit RUN starten läßt.

Zum Programm:

»LIFE« könnte man als mathematisches »Spiel« bezeichnen. Es ist geradezu prädestiniert für die Implementierung auf Computern. Entwickelt wurde es vom britischen Mathematiker Arthur Conway. Mit »LIFE« werden in einer Matrix geometrische Figuren entwickelt, die, und das ist die Besonderheit, in ihrer Entwicklung lebenden primitiven Organismen ähneln. Als Ausgangsfigur legt man in einer Matrix mit Reihen und Spalten ein beliebiges Muster fest. Dieses wird nach den folgenden Regeln fortentwickelt:

Ein Feld in der Matrix hat genau acht Nachbarfelder. Befindet sich in dem Feld nun eine »Zelle«, so wird darüber entschieden, ob diese Zelle »überlebt« oder »stirbt«. Existieren auf den Nachbarfeldern dieser Zelle zwei oder drei weitere Zellen, so »überlebt« die Zelle. Befinden sich dort weniger als zwei oder mehr als drei, so »stirbt« sie. Auf einem freien Feld, das genau drei Nachbarfelder mit Zellen hat, wird eine neue Zelle »geboren«. Diese Regeln werden alle simultan angewandt, das heißt unabhängig davon, ob eine Zelle »stirbt«, »überlebt« oder »geboren« wird, wird für die übrigen Zellen das noch bestehende Muster für die Anwendung der Regeln herangezogen. Ein in oben genannter Weise neu entstandener »Organismus« ist ein solcher der »zweiten Generation«. Diesen kann man nun genauso wie den ersten fortentwickeln.

Dieses ist schon vom Optischen her sehr reizvoll. Es können zum Beispiel aus unscheinbaren Ausgangsmustern aufgeblähte Konfigurationen entstehen, die aber ebenso plötzlich in sich zusammenfallen können. Es existieren pulsierende Muster, die sich nach einer gewissen Zeitspanne wiederholen.

Um ein wenig »Evolution« in diese Regeln zu bringen, ermöglicht das Programm auch, zufällig eine bestimmte Anzahl von Zellen zu »zerstören«.

Bedienung des Programms:

Das Programm ist menügesteuert. Am Anfang läßt sich ein Grundmuster eingeben. Dazu wählt man »Option 1« (Entering of Coordinates). Falls man schon vorher ein Muster eingegeben hat, kann man wählen, ob dieses vor Neueingabe gelöscht werden soll oder nicht. Danach erscheint auf dem Bildschirm eine Matrix aus 32 Zeilen und 26 Spalten mit einem roten Cursor in der Mitte. Diesen kann man wie den »normalen« Cursor mit den Steuertasten bewegen. Will man an einer Stelle eine »Zelle« setzen, so drückt man die Taste »*«, will man eine vorhandene Zelle löschen, so drückt man die Taste SPACE. Mit der Taste »R« kommt man ins Menü zurück.

Nun läßt sich die Figur fortentwickeln.

Dazu gibt es zwei Optionen. Die »Automatic«-Option entwickelt sich von selbst. Ist ein »Organismus« aufgebaut, so wird gleich darauf der der nächsten Generation erstellt. Im »Single Step Mode« wartet das Programm jeweils, bis die SPACE-Taste gedrückt wird. Erst dann wird der nachfolgende Organismus dargestellt. In beiden Modi kann man mit der Taste »F3« die Hintergrundfarbe und mit »F5« die Zeichenfarbe beliebig ändern. Mit »F7« kommt man ins Menü zurück. Die Tasten müssen einige Sekunden gedrückt werden. Grafisch ist das besonders reizvoll. Zusätzlich läßt sich auf einem Drucker eine Hardcopy erzeugen, wenn man auf die Frage mit Y (Yes) antwortet. Diese wird so erstellt, daß überflüssige Zeilen, die kein Muster enthalten, nicht gedruckt werden.

Schließlich kann man mit Option 4 »Mutationen« erzeugen. Dazu wird nach der relativen Häufigkeit gefragt. »1« ist die geringste Häufigkeit, nach oben ist keine Grenze gesetzt. Mit Option 5 läßt sich die Mutation wieder »ausschalten«. – Interessant sind zum Beispiel Studien, ob Mutationen der »Entwicklung« förderlich oder für sie eher schädlich sind, oder über die Tatsache, daß der Trend der »Entwicklung« meist vom großen zu mehreren kleinen Organismen geht, in die sich der Große aufspaltet.

(Claus Neupert/ah)
1 rem
2 rem * life mc loader *
3 rem * vc 20 + 3 k *
4 rem
5 poke 55,95:poke 56,23:clr
10 dim h(75):for i=0 to 9
20 h(48+i)=i:h(65+i)=i+10:next
30 for i=6000 to 7139:read a$
40 h=asc(left$(a$,1)):l=asc(right$(a$,1))
50 d=h(h)*16+h(l):s=s+d:poke i,d
60 a=a+1:if a<20 then next:a=-1
65 print"zeile";1000+z;
70 read v:z=z+1:if v=s then 85
80 print"fehler ";999+z:stop
85 if a<0 then end
90 s=0:a=0:print:next:end
1000 data 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0
1001 data a9,00,8d,db,1b,8d,dc,1b,a9,08,8d,d8,1b,4e,d9,1b,90,12,18,ad, 2186
1002 data da,1b,6d,db,1b,8d,db,1b,a9,00,6d,dc,1b,8d,dc,1b,4e,db,1b,6e, 2334
1003 data dc,1b,ce,d8,1b,d0,de,60,ea,ea,ad,ce,1b,18,6d,d0,1b,8d,d2,1b, 2842
1004 data ad,cd,1b,18,6d,cf,1b,90,03,ee,d2,1b,8d,d1,1b,60,ea,ea,ea,ea, 2803
1005 data ad,d7,1b,8d,d9,1b,a9,1b,8d,da,1b,20,84,17,ad,dc,1b,8d,cd,1b, 2362
1006 data ad,db,1b,8d,ce,1b,ad,d6,1b,8d,cf,1b,a9,00,8d,d0,1b,20,b6,17, 2364
1007 data ad,d2,1b,18,6d,cc,1b,8d,d2,1b,60,a9,00,8d,f8,1b,8d,f9,1b,ea, 2484
1008 data a9,14,8d,cc,1b,a2,00,a0,00,a9,08,8d,d3,1b,a9,00,8d,de,1b,8a, 2136
1009 data 18,69,01,8d,d6,1b,98,18,69,01,8d,d7,1b,20,d4,17,ad,d1,1b,8d, 1994
1010 data 41,18,ad,d2,1b,8d,42,18,ad,5e,17,c9,00,d0,05,a9,01,8d,de,1b, 1994
1011 data a9,00,8d,d4,1b,ce,d3,1b,8e,d5,1b,ae,d3,1b,bd,bc,1b,18,6d,d5, 2537
1012 data 1b,8d,d6,1b,ae,d5,1b,8c,d5,1b,ac,d3,1b,b9,c4,1b,18,6d,d5,1b, 2394
1013 data 8d,d7,1b,ac,d5,1b,20,d4,17,ad,d1,1b,8d,8a,18,ad,d2,1b,8d,8b, 2464
1014 data 18,ad,42,17,c9,00,f0,07,c9,ff,f0,03,ee,d4,1b,ad,d3,1b,c9,00, 2522
1015 data d0,b3,ad,de,1b,c9,00,d0,22,a9,02,cd,d4,1b,f0,18,a9,03,cd,d4, 2720
1016 data 1b,f0,11,ad,41,18,8d,c2,18,ad,42,18,8d,c3,18,a9,02,8d,42,16, 1928
1017 data 4c,df,18,a9,03,cd,d4,1b,d0,11,ad,41,18,8d,dd,18,ad,42,18,8d, 2216
1018 data de,18,a9,ff,8d,5c,16,c8,c0,1f,d0,03,4c,ea,18,4c,19,18,a0,00, 2178
1019 data e8,e0,19,d0,03,4c,f7,18,4c,19,18,4c,00,19,13,37,23,96,63,1a, 1649
1020 data a2,01,a0,01,a9,14,8d,cc,1b,8e,d6,1b,8c,d7,1b,20,d4,17,ad,d1, 2299
1021 data 1b,8d,1f,19,ad,d2,1b,8d,20,19,ad,7a,17,18,c9,00,f0,15,c9,02, 1839
1022 data d0,08,a9,00,20,50,19,4c,3b,19,c9,ff,ea,ea,a9,01,20,26,1b,c8, 2073
1023 data c0,21,d0,c4,a0,01,e8,e0,1b,d0,bd,60,ea,ea,ea,ea,ea,ea,ea,ea, 3638
1024 data 8d,dd,1b,8e,d6,1b,8c,d7,1b,20,d4,17,ad,d1,1b,8d,6c,19,ad,d2, 2487
1025 data 1b,8d,6d,19,ad,dd,1b,8d,42,16,c9,01,d0,05,a9,2a,4c,c8,19,a9, 2048
1026 data 20,4c,c8,19,00,8d,df,1b,4c,c8,19,c9,ff,f0,eb,c9,02,d0,10,a9, 2552
1027 data 20,8d,df,1b,a9,1c,8d,cc,1b,20,d4,17,4c,c8,19,60,8e,c0,cc,ce, 2400
1028 data cc,cb,cf,56,84,ec,fd,a4,4c,88,cc,e0,ec,a5,59,08,31,b2,33,21, 2934
1029 data 33,13,33,33,31,b0,33,13,33,7b,33,37,b9,1b,33,81,33,70,73,5b, 1508
1030 data 8d,e1,1b,ad,cc,1b,8d,e0,1b,a9,1c,8d,cc,1b,20,d4,17,ad,d1,1b, 2434
1031 data 8d,e9,19,ad,d2,1b,8d,ea,19,ad,e1,1b,8d,42,1e,ad,e0,1b,8d,cc, 2640
1032 data 1b,60,33,03,b3,66,27,31,33,13,b3,f1,93,33,32,65,c3,43,ab,31, 1867
1033 data 2b,19,ab,91,72,60,73,92,32,42,39,ca,cc,c5,8c,cc,6c,cc,ec,8c, 2663
1034 data dc,c8,cc,48,cc,cc,cc,cc,cd,94,46,cf,48,ce,4c,6b,4f,dc,45,9e, 3129
1035 data 0c,c6,ea,cc,33,2b,7b,71,93,63,32,39,2b,13,33,37,33,64,93,30, 1845
1036 data 39,b1,27,9c,53,7c,33,d9,37,00,13,03,3b,1a,3b,00,cc,8c,c8,c9, 1870
1037 data dc,ec,cc,cc,c6,c4,4c,cc,ce,8c,dc,ec,cc,2c,4e,43,91,90,4e,8e, 3242
1038 data cc,48,75,ac,a8,35,4c,9c,33,b3,33,1f,37,23,13,12,33,33,33,31, 1659
1039 data 33,1a,39,f1,81,0b,67,33,33,96,67,2a,b8,13,33,f4,39,b0,36,96, 1950
1040 data c8,ec,cc,cc,cc,cc,dc,c2,8c,c4,ee,c0,4f,cc,cc,cc,4c,e4,ed,ec, 3900
1041 data de,ed,e8,93,ec,28,4e,7d,ec,8e,04,e8,3b,33,71,53,33,d3,23,11, 2551
1042 data 33,23,33,f4,33,33,2b,b3,e9,e5,33,70,52,fc,b3,bc,78,79,02,b2, 2452
1043 data 13,8f,96,8f,cc,ce,cc,e7,c4,dc,cc,cc,cc,cc,4c,c4,c0,c4,cc,cd, 3601
1044 data cc,ff,cd,a4,8c,8f,66,cb,c7,ed,c9,6d,ec,99,14,cd,11,23,73,31, 2992
1045 data 33,3a,a1,33,13,31,33,37,71,7b,b1,3a,13,b7,33,02,2c,c2,13,29, 1519
1046 data 3b,70,27,6d,02,ff,bb,68,cc,84,cc,dc,d8,dd,8c,4c,cc,dc,cc,cc, 3112
1047 data dc,dc,cc,cc,8c,d6,cc,dc,4e,e7,18,a9,01,6d,f8,1b,90,03,ee,f9, 3147
1048 data 1b,8d,f8,1b,a9,01,4c,50,19,63,93,b1,b3,77,33,33,66,66,b7,c7, 2203
1049 data 33,59,ab,2b,13,1c,33,13,73,a3,3b,84,8c,54,c8,c4,cf,5c,ec,cc, 2299
1050 data 4c,cc,cc,c8,c5,ec,ce,cc,8c,d4,e6,28,8c,dc,4c,84,5d,9d,ec,e8, 3435
1051 data ca,5a,6e,ee,30,1b,3b,37,31,27,b3,f3,b3,7e,33,77,33,77,37,a9, 2208
1052 data e4,a6,13,89,22,bc,31,01,3b,13,38,1b,1b,a3,b7,e7,8c,6d,d4,cd, 2253
1053 data cc,c5,cc,ed,dc,cc,ce,ee,c4,cc,4c,c8,8d,ec,d7,c9,c4,4e,cc,de, 3879
1054 data cb,cd,ce,a7,85,96,c0,80,37,77,13,2b,17,b5,b3,33,32,97,33,15, 2327
1055 data 00,01,02,00,02,00,01,02,00,00,00,01,01,02,02,02,14,60,03,1a, 161
1056 data 00,7a,17,00,00,1e,1a,20,00,00,1b,03,60,00,01,ec,14,20,c9,1c, 877
Listing 1. Maschinenprogrammteil zu »LIFE«
10 rem
11 rem >> life <<
12 rem
13 rem vic 20 + 3 k
14 rem
15 rem first run 'machine code loader'
16 rem
20 poke55,240:poke56,19:clr
22 print"{clr}":poke36879,75:poke36878,15:t1=234:t2=230:t3=223
26 fori=1to10:gosub31:forj=1to75:next:poke36878,0
27 print"{clr}":forj=1to71:next:poke36878,15:next:poke36874,0:poke36875,0:poke36876,0
28 gosub31:poke36874,0:poke36875,0:poke36876,0:gosub4000:goto40
31 print"{wht}{home}{down}{down}{down}{rght}{rght}{rght}{rght}{rvon} {down}{left} {down}{left} {down}{left} {down}{left}   "
32 print"{home}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rvon} {down}{left} {down}{left} {down}{left} {down}{left} "
33 print"{home}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rvon}   {down}{left}{left}{left} {down}{left}  {down}{left}{left} {down}{left} "
34 print"{home}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rvon}   {down}{left}{left}{left} {down}{left}   {down}{left}{left}{left} {down}{left}   "
35 print"{home}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{yel}(c) 1983 by c. neupert{wht}"
36 poke36874,t1:poke36875,t2:poke36876,t3:return
40 print"{home}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{wht}{rght}{rght}{rght}{rght}{rght}{rght}hit any key"
41 geta$:ifa$=""then41
50 poke36878,15:print"{clr}{down}{down}{down}{wht}":ge=0:pp=0
51 print"{rght}{rvon}1{rvof} entering of":print"{rght}{rght}{rght}coordinates"
52 print:print"{rght}{rvon}2{rvof} single step"
53 print:print"{rght}{rvon}3{rvof} automatic mode"
54 print"{down}{rght}{rvon}4{rvof} mutations"
55 print"{down}{rght}{rvon}5{rvof} mutations off"
57 geta$:ifa$=""then57
58 onval(a$)goto500,600,700,800,860
59 goto57
99 stop
500 poke36878,15:print"{clr}{wht}{down}":pp=0:rd=0
517 print"{down}{down}enter now {rvon}s{rvof} for ":print"{down}setting dots, or"
519 print"{down}{rght}{rvon}a{rvof} for deleting all."
520 rem
522 geta$:ifa$=""then522
524 ifa$="s"thengosub7000:goto530
525 ifa$="a"thenprint"{clr}{down}{down}{wht} deleting...":gosub4000:goto50
526 goto522
530 print"{clr}{down}":gosub9000:gosub3000:fory=1to32:forx=1to26:poke7168+x+27*y,76
531 ifpeek(5120+x+27*y)=1thenpoke7168+x+27*y,42:poke7168+x+27*y+30720,3:pp=pp+1
532 next:next:x=13:y=16:ad=7613:pokead,160:pokead+30720,2:poke36878,15
540 geta$:ifa$=""then540
542 ifa$<>""thenq=asc(a$)
544 ifq=17theny=y+1:goto580
545 ifq=29thenx=x+1:goto580
546 ifq=145theny=y-1:goto580
547 ifq=157thenx=x-1:goto580
548 ifq=32then590
549 ifq=42then595
550 ifq=82thenprint"{clr}":poke36879,75:goto5015
552 goto540
580 ify>32theny=32
581 ify<1theny=1
582 ifx>26thenx=26
583 ifx<1thenx=1
584 poke 36876,210:::::::::::::::::::poke36876,0:ifpeek(ad)=42then587
585 ifpeek(ad)=170thenpokead,42:pokead+30720,3:goto587
586 pokead,76:pokead+30720,1
587 ad=7168+x+27*y:ifpeek(ad)=42thenpokead,170:pokead+30720,2:goto589
588 pokead,160:pokead+30720,2
589 goto540
590 poke36876,235:pokead,160:pokead+30720,2
592 poke5120+x+27*y,0:poke36876,0:goto540
595 poke36876,240:pokead,170:pokead+30720,3
597 poke5120+x+27*y,1:poke36876,0:pp=pp+1:goto540
599 return
600 gosub2000
610 print"{clr}{down}{down}{down}{wht}press {rvon}space{rvof} for each"
615 print:print"single step"
625 print"{down}{down}{down}{yel}   hit any key{wht}"
630 geta$:ifa$=""then630
635 print"{clr}":gosub3000:gosub9000
636 sys 6400:gosub11100:goto641
640 sys 6151:gosub11000
641 geta$:ifa$=""thengosub5000:goto641
642 ifasc(a$)=136then5015
643 ifa$<>" "then641
650 goto640
700 gosub2000
702 print"{clr}{down}do you want a hardcopy":print"{down} [y/n] ?"
703 geta$:ifa$=""then703
704 ifa$="n"then707
705 ifa$<>"y"then703
706 pf=1:open1,4:cmd1:print#1
707 print"{clr}":gosub3000:gosub9000
710 sys 6400:gosub11100:forj=1to900:next:if pf then c$="":zx=0:zy=0:gosub17000
720 sys 6151:gosub11000:gosub5000
721 c$="":zx=0:zy=0:if pf=1 then gosub 17000
730 geta$:ifa$=""then720
740 ifasc(a$)<>136then720
750 ifpf=1thenprint#1:close1:pf=0
752 goto5015
800 print"{clr}{down}{down}{down}relative frequency":print"{down}{down}for mutations?"
820 print:print:print:input fq:iffq<0orfq<>int(fq)then820
850 mf=1:goto50
860 print"{clr}":mf=0:fq=0:forj=1to500:next:goto50
2000 print"{clr}{wht}{down}{down}":rd=0
2002 print"{down}{rvon}f3{rvof} screen color":print"{down}{rvon}f5{rvof} character color"
2003 print"{down}{rvon}f7{rvof} goto menue"
2005 print"{down}{down}{down}{wht}want random colors ?"
2010 geta$:ifa$=""then2010
2020 ifa$="y"thenrd=1
2021 return
3000 poke648,28:sys 58648
3005 poke36864,8:poke36865,20:poke36866,27:poke36867,194
3010 poke36879,8:return
4000 fori=5120to6018:pokei,0:next:return
5000 geta$:ifa$=""thenreturn
5005 w=asc(a$):ifw=134thensc=sc+1+15*(sc=15):goto5100
5010 ifw=135then5020
5012 ifw<>136thena$="":return
5015 poke36864,12:poke36865,38:poke36866,150:poke36867,151:sys58648:poke36879,75:goto50
5020 cc=cc+1+8*(cc=7)
5025 fori=37888to38900:pokei,cc:next:a$="":return
5100 poke36879,16*sc+8:a$="":return
7000 print"{clr}{down}do you want to delete":print"{down}the old matrix [y/n] ?"
7010 geta$:ifa$="y"thenprint"{clr}":gosub4000:return
7020 ifa$="n"thenreturn
7030 goto7010
9000 fori=7660to8185:pokei,32:next:fori=37888to38800:pokei,1+int(rnd(1)*8)*rd:next:return
11000 ifmf=0then11100
11010 fori=0tofq:xm=int(rnd(1)*26)+1:ym=int(rnd(1)*32)+1
11020 am=5120+xm+27*ym:pokeam,0
11030 next
11100 ge=ge+1:pp=peek(7160)+256*peek(7161):print"{home}{wht}{rght}gen.:";ge;
11105 print"{home}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{red}population{grn}";pp;"{left}  {home}";
11110 if pf then print#1,"    generation: ";ge;"     population: ";pp:print#1
11150 poke36878,15:poke36874,234:poke36875,223:poke36876,204:forj=1to200:next
11200 poke36874,0:poke36875,0:poke36876,0:return
15000 fori=0to8:readd:poke6151+i,d:next
16000 data 169,0,141,248,27,141,249,27,234
17000 fory=1to32:forx=1to26:ifpeek(5120+x+27*y)=1thenc$=c$+"*":zx=1:goto17010
17005 c$=c$+" "
17010 next:if zx then print#1,"";tab(25);c$:zy=0:goto 17030
17020 if zx=0 then zy=zy+1:ifzy<4then print#1
17030 c$="":zx=0:next y:print#1:print#1:return
Listing 2. Hauptprogramm zu »LIFE«. Bitte beachten Sie die Eingabehinweise.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →