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
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