CONWAYS GAME OF LIFE
- ahenry3068
- Posts: 1194
- Joined: Tue Apr 04, 2023 9:57 pm
Re: CONWAYS GAME OF LIFE
This evening I've tweaked the user interface a little and gotten about a 8 to 10% speed increase on
the cell update function (eliminated some redundant checking on cell conditions...)
i.e. If a cell has 3 neighbors then it's alive even if its dead or alive to start. No need to check previous status
If a cell has >= 4 neighbors its dead. No matter its previous status.
Once a cell is set I just skipped the next evaluations. Not really noticeable
But running the new code against the old code in 2 instances of the emulator
The new code laps the old code about every 15 minutes so I did get some speed increase.
the cell update function (eliminated some redundant checking on cell conditions...)
i.e. If a cell has 3 neighbors then it's alive even if its dead or alive to start. No need to check previous status
If a cell has >= 4 neighbors its dead. No matter its previous status.
Once a cell is set I just skipped the next evaluations. Not really noticeable
But running the new code against the old code in 2 instances of the emulator
The new code laps the old code about every 15 minutes so I did get some speed increase.
- ahenry3068
- Posts: 1194
- Joined: Tue Apr 04, 2023 9:57 pm
CONWAYS GAME OF LIFE. On its Way
Haven't implemented Kelli's request yet.
Smoothed up and Clarified User interface.
Made some optimizations on the core evaluation code. Approximately 10%
Speed increase even if hard to notice originally (New code laps
old code about every 15 mins if run in 2 instances of the emulator
on Linux).
Smoothed up and Clarified User interface.
Made some optimizations on the core evaluation code. Approximately 10%
Speed increase even if hard to notice originally (New code laps
old code about every 15 mins if run in 2 instances of the emulator
on Linux).
Code: Select all
REM If a cell is ON and has fewer than two neighbors that are ON, it turns OFF
REM If a cell is ON and has either two or three neighbors that are ON, it remains ON.
REM If a cell is ON and has more than three neighbors that are ON, it turns OFF.
REM If a cell is OFF and has exactly three neighbors that are ON, it turns ON.
10 SCREEN $80
80 GOSUB 1000
90 P1=1:P2=2
100 C1=$05:C2 = $10
110 X = RND(-TI)
130 DIM GC%(2,GX,GY)
140 GOSUB 200 : REM INITGRID
150 GOSUB 300
155 GOSUB 400
160 GOSUB 300
165 IF LL = O THEN PRINT "NO LIVING CELLS !!! ":END
170 GOTO 155
199 GOTO 8000
REM INITGRID
200 COLOR 1,0:CLS:COLOR 1,11:LOCATE 2,2:PRINT " INITIALIZING "
202 LOCATE 3,2:PRINT " "
205 FOR X = 1 TO GX
210 FOR Y = 1 TO GY
211 IF Y=1 THEN LOCATE 4,2:PRINT " "
215 LOCATE 4,2:PRINT " X: ";
216 COLOR 7:PRINT X;" ";:COLOR 1:PRINT "Y: ";
218 COLOR 7:PRINT Y;:COLOR 1
220 GC%(P1,X,Y)= 0
230 J = INT(RND(1)*10)
240 IF J < 2 THEN GC%(P1,X,Y)= 1
250 NEXT Y
260 NEXT X
270 COLOR 1,0:CLS:RETURN
299 REM DRAWGRID
300 LOCATE 2,2:PRINT "DRAWING THE GRID "
305 FOR Y = 1 TO GY
310 FOR X = 1 TO GX
320 IF GC%(P1,X,Y) = 1 THEN CC = C1
330 IF GC%(P1,X,Y) = 0 THEN CC = C2
340 X1 = (X*XS)-XS:Y1=(Y*YS)-XS
350 RECT X1,Y1,X1+XS-1,Y1+YS-1,CC
355 IF GX<=64 THEN FRAME X1,Y1,X1+XS-1,Y1+YS-1,$8A
360 NEXT X
370 NEXT Y
380 RETURN
400 LOCATE 3,2:PRINT "UPDATING CORNER CELLS"
405 LL = 0
410 S = GC%(P1,2,1) + GC%(P1,1,2) + GC%(P1,2,2)
430 IF GC%(P1,1,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,1)=1:LL=LL+1
440 IF GC%(P1,1,1) = 1 AND S<2 THEN GC%(P2,1,1)=0
450 IF GC%(P1,1,1) = 0 AND S=3 THEN GC%(P2,1,1)=1:LL=LL+1
460 IF GC%(P1,1,1) = 0 AND S< 3 THEN GC%(P2,1,1)=0
470 S = GC%(P1,GX-1,1) + GC%(P1,GX-1,2) + GC%(P1,GX,2)
480 IF GC%(P1,GX,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,1)=1:LL=LL+1
490 IF GC%(P1,GX,1) = 1 AND S<2 THEN GC%(P2,GX,1)=0
500 IF GC%(P1,GX,1) = 0 AND S=3 THEN GC%(P2,GX,1)=1:LL=LL+1
505 IF GC%(P1,GX,1) = 0 AND S< 3 THEN GC%(P2,GX,1)=0
510 S = GC%(P1,2,GY) + GC%(P1,1,GY-1) + GC%(P1,2,GY-1)
515 IF GC%(P1,1,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,GY)=1:LL=LL+1
520 IF GC%(P1,1,GY) = 1 AND S<2 THEN GC%(P2,1,GY)=0
525 IF GC%(P1,1,GY) = 0 AND S=3 THEN GC%(P2,1,GY)=1:LL=LL+1
530 IF GC%(P1,1,GY) = 0 AND S< 3 THEN GC%(P2,1,GY)=0
535 S = GC%(P1,GX-1,GY) + GC%(P1,GX-1,GY-1) + GC%(P1,GX,GY-1)
540 IF GC%(P1,GX,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,GY)=1:LL=LL+1
550 IF GC%(P1,GX,GY) = 1 AND S<2 THEN GC%(P2,GX,GY)=0
555 IF GC%(P1,GX,GY) = 0 AND S=3 THEN GC%(P2,GX,GY)=1:LL=LL+1
560 IF GC%(P1,GX,GY) = 0 AND S<3 THEN GC%(P2,GX,GY)=0
565 LOCATE 3,2:PRINT "UPDATING OUTSIDE COLUMNS."
566 COLOR 7
568 LOCATE 4,2:PRINT "#LIVING CELLS:";
569 COLOR 7:PRINT LL:COLOR 1
570 X = 1
575 FOR Y = 2 TO GY - 1
580 S = GC%(P1,X,Y-1) + GC%(P1,X-1,Y-1)+GC%(P1,X+1,Y)
585 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
590 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
595 IF S<2 THEN GC%(P2,X,Y)=0
600 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
610 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
615 IF S>3 THEN GC%(P2,X,Y)=0
620 NEXT Y
625 X = GX
630 FOR Y = 2 TO GY - 1
635 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X-1,Y)
640 S = S + GC%(P1,X-1,Y+1) + GC%(P1,X,Y+1)
645 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
650 IF S<2 THEN GC%(P2,X,Y)=0
655 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
660 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
665 IF S>3 THEN GC%(P2,X,Y)=0
670 NEXT Y
685 LOCATE 3,2:PRINT "UPDATING TOP AND BOTTOM ROW."
690 LOCATE 4,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
695 Y = 1
700 FOR X = 2 TO GX - 1
705 S = GC%(P1,X-1,Y) + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)
710 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
715 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
720 IF S<2 THEN GC%(P2,X,Y)=0
725 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
730 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
735 IF S>3 THEN GC%(P2,X,Y)=0
740 NEXT X
742 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
745 Y = GY
750 FOR X = 2 TO GX - 1
755 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
760 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
765 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
770 IF S<2 THEN GC%(P2,X,Y)=0
775 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
780 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
785 IF S>3 THEN GC%(P2,X,Y)=0
790 NEXT X
795 LOCATE 3,2:PRINT "BORDER IS DONE "
796 LOCATE 4,2 :PRINT "UPDATING CORE GRID"
800 LOCATE 6,2:PRINT "#LIVING CELLS:";CHR$($9D);LL;CHR$($05)
810 FOR Y = 2 TO GY-1
815 FOR X = 2 TO GX - 1
820 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
825 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
830 S = S + GC%(P1,X-1,Y+1)+GC%(P1,X,Y+1)+GC%(P1,X+1,Y+1)
835 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
840 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 860
845 IF S>3 THEN GC%(P2,X,Y)=0:GOTO 860
850 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
855 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
860 NEXT X
865 LOCATE 5,2:PRINT " UPDATED ROW:";:COLOR 7:PRINT Y:COLOR 1
866 LOCATE 6,2::PRINT " LIVING CELLS:";:COLOR 7:PRINT LL:COLOR 1
870 NEXT Y
875 P3 = P1
880 P1 = P2
885 P2 = P3
890 CLS:RETURN
1000 IX = 5:COLOR 1,0:CLS
1020 IF IX > 5 THEN IX = 1
1025 IF IX < 1 THEN IX = 5
1030 IF IX = 5 THEN GX = 80:GY=60
1035 IF IX = 4 THEN GX = 64:GY=48
1040 IF IX = 3 THEN GX = 32:GY=24
1045 IF IX = 2 THEN GX = 16:GY=12
1050 IF IX = 1 THEN GX = 8:GY = 6
1055 XS = 320/GX:YS=240/GY
1060 RECT 0,0,319,239,$10
1065 FRAME 0,0,319,239, $01
1070 FOR X = XS TO 320-XS STEP XS
1075 LINE X,0,X,239,$01
1080 NEXT X
1085 FOR Y = YS TO 240-YS STEP YS
1090 LINE 0,Y,319,Y,$01
1095 NEXT Y
1100 COLOR 1,11
1102 LOCATE 2,2:PRINT " ";
1105 LOCATE 3,2:PRINT " ";
1110 LOCATE 4,2:PRINT " ";
1115 LOCATE 5,2:PRINT " ";
1120 LOCATE 6,2:PRINT " ";
1135 LOCATE 3,3:PRINT "CHANGE GRID DENSITY";:COLOR 7:PRINT " <ARROW KEYS>"
1140 COLOR 1:LOCATE 4,3:PRINT "CURRENT: ";
1142 COLOR 7:PRINT GX;:COLOR 1:PRINT " X ";:COLOR 7:PRINT GY;
1145 COLOR 7:LOCATE 6,3:PRINT "<";:COLOR 5:PRINT "ENTER TO CHOOSE";:COLOR 7
1146 PRINT ">";
1150 GET K$
1155 K = ASC(K$)
1160 IF K=157 OR K=17 THEN IX = IX + 1:GOTO 1020
1165 IF K=145 OR K=29 THEN IX = IX - 1:GOTO 1020
1170 IF K=13 THEN COLOR 1,0:CLS:RETURN
1175 IF K=27 THEN END
1180 GOTO 1150
8000 GET X$:IF X$<>"" THEN GOTO 8000 : REM FLUSH KEYBOARD BUFFER
8010 GET X$:IF X$="" THEN GOTO 8010 : REM WAIT FOR KEY
8020 SCREEN 0:END
- ahenry3068
- Posts: 1194
- Joined: Tue Apr 04, 2023 9:57 pm
Re: CONWAYS GAME OF LIFE
Ok...
Function the same as before. Changed the default grid density to 32 x 24
You may still choose the higher grid densities.
Choose 32 x 24 as a compromise, decently fast grid update vs grid complexity.
To just get to it. Press Enter, Enter after starting.
I've got the preliminary UI code for user choice of living cells but not the actual
selection code. See what's its going to look like but if you go that
route currently the program just ENDS
Function the same as before. Changed the default grid density to 32 x 24
You may still choose the higher grid densities.
Choose 32 x 24 as a compromise, decently fast grid update vs grid complexity.
To just get to it. Press Enter, Enter after starting.
I've got the preliminary UI code for user choice of living cells but not the actual
selection code. See what's its going to look like but if you go that
route currently the program just ENDS
Code: Select all
REM If a cell is ON and has fewer than two neighbors that are ON, it turns OFF
REM If a cell is ON and has either two or three neighbors that are ON, it remains ON.
REM If a cell is ON and has more than three neighbors that are ON, it turns OFF.
REM If a cell is OFF and has exactly three neighbors that are ON, it turns ON.
10 SCREEN $80
80 GOSUB 2000
90 P1=1:P2=2
100 C1=$05:C2 = $10
110 X = RND(-TI)
130 DIM GC%(2,GX,GY)
140 GOSUB 900 : REM INITGRID
150 GOSUB 300
155 GOSUB 400
160 GOSUB 300
165 IF LL = O THEN PRINT "NO LIVING CELLS !!! ":END
170 GOTO 155
199 GOTO 8000
REM INITGRID
200 COLOR 1,0:CLS:COLOR 1,11:LOCATE 2,2:PRINT " INITIALIZING "
202 LOCATE 3,2:PRINT " "
205 FOR X = 1 TO GX
210 FOR Y = 1 TO GY
211 IF Y=1 THEN LOCATE 4,2:PRINT " "
215 LOCATE 4,2:PRINT " X: ";
216 COLOR 7:PRINT X;" ";:COLOR 1:PRINT "Y: ";
218 COLOR 7:PRINT Y;:COLOR 1
220 GC%(P1,X,Y)= 0
230 J = INT(RND(1)*10)
240 IF J < 2 THEN GC%(P1,X,Y)= 1
250 NEXT Y
260 NEXT X
270 COLOR 1,0:CLS:RETURN
299 REM DRAWGRID
300 LOCATE 2,2:PRINT "DRAWING THE GRID "
305 FOR Y = 1 TO GY
310 FOR X = 1 TO GX
320 IF GC%(P1,X,Y) = 1 THEN CC = C1
330 IF GC%(P1,X,Y) = 0 THEN CC = C2
340 X1 = (X*XS)-XS:Y1=(Y*YS)-XS
350 RECT X1,Y1,X1+XS-1,Y1+YS-1,CC
355 IF GX<=64 THEN FRAME X1,Y1,X1+XS-1,Y1+YS-1,$8A
360 NEXT X
370 NEXT Y
380 RETURN
400 LOCATE 3,2:PRINT "UPDATING CORNER CELLS"
405 LL = 0
410 S = GC%(P1,2,1) + GC%(P1,1,2) + GC%(P1,2,2)
430 IF GC%(P1,1,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,1)=1:LL=LL+1
440 IF GC%(P1,1,1) = 1 AND S<2 THEN GC%(P2,1,1)=0
450 IF GC%(P1,1,1) = 0 AND S=3 THEN GC%(P2,1,1)=1:LL=LL+1
460 IF GC%(P1,1,1) = 0 AND S< 3 THEN GC%(P2,1,1)=0
470 S = GC%(P1,GX-1,1) + GC%(P1,GX-1,2) + GC%(P1,GX,2)
480 IF GC%(P1,GX,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,1)=1:LL=LL+1
490 IF GC%(P1,GX,1) = 1 AND S<2 THEN GC%(P2,GX,1)=0
500 IF GC%(P1,GX,1) = 0 AND S=3 THEN GC%(P2,GX,1)=1:LL=LL+1
505 IF GC%(P1,GX,1) = 0 AND S< 3 THEN GC%(P2,GX,1)=0
510 S = GC%(P1,2,GY) + GC%(P1,1,GY-1) + GC%(P1,2,GY-1)
515 IF GC%(P1,1,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,GY)=1:LL=LL+1
520 IF GC%(P1,1,GY) = 1 AND S<2 THEN GC%(P2,1,GY)=0
525 IF GC%(P1,1,GY) = 0 AND S=3 THEN GC%(P2,1,GY)=1:LL=LL+1
530 IF GC%(P1,1,GY) = 0 AND S< 3 THEN GC%(P2,1,GY)=0
535 S = GC%(P1,GX-1,GY) + GC%(P1,GX-1,GY-1) + GC%(P1,GX,GY-1)
540 IF GC%(P1,GX,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,GY)=1:LL=LL+1
550 IF GC%(P1,GX,GY) = 1 AND S<2 THEN GC%(P2,GX,GY)=0
555 IF GC%(P1,GX,GY) = 0 AND S=3 THEN GC%(P2,GX,GY)=1:LL=LL+1
560 IF GC%(P1,GX,GY) = 0 AND S<3 THEN GC%(P2,GX,GY)=0
565 LOCATE 3,2:PRINT "UPDATING OUTSIDE COLUMNS."
566 COLOR 1
568 LOCATE 6,2:PRINT "#LIVING CELLS:";
569 COLOR 7:PRINT LL:COLOR 1
570 X = 1
575 FOR Y = 2 TO GY - 1
580 S = GC%(P1,X,Y-1) + GC%(P1,X-1,Y-1)+GC%(P1,X+1,Y)
585 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
590 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
595 IF S<2 THEN GC%(P2,X,Y)=0
600 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
610 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
615 IF S>3 THEN GC%(P2,X,Y)=0
620 NEXT Y
625 X = GX
630 FOR Y = 2 TO GY - 1
635 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X-1,Y)
640 S = S + GC%(P1,X-1,Y+1) + GC%(P1,X,Y+1)
645 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
650 IF S<2 THEN GC%(P2,X,Y)=0
655 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
660 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
665 IF S>3 THEN GC%(P2,X,Y)=0
670 NEXT Y
685 LOCATE 3,2:PRINT "UPDATING TOP AND BOTTOM ROW.":COLOR 1
690 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
695 Y = 1
700 FOR X = 2 TO GX - 1
705 S = GC%(P1,X-1,Y) + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)
710 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
715 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
720 IF S<2 THEN GC%(P2,X,Y)=0
725 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
730 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
735 IF S>3 THEN GC%(P2,X,Y)=0
740 NEXT X
742 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
745 Y = GY
750 FOR X = 2 TO GX - 1
755 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
760 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
765 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
770 IF S<2 THEN GC%(P2,X,Y)=0
775 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
780 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
785 IF S>3 THEN GC%(P2,X,Y)=0
790 NEXT X
795 LOCATE 3,2:PRINT "BORDER IS DONE "
796 LOCATE 4,2 :PRINT "UPDATING CORE GRID"
800 LOCATE 6,2:PRINT "#LIVING CELLS:";CHR$($9D);LL;CHR$($05)
810 FOR Y = 2 TO GY-1
815 FOR X = 2 TO GX - 1
820 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
825 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
830 S = S + GC%(P1,X-1,Y+1)+GC%(P1,X,Y+1)+GC%(P1,X+1,Y+1)
835 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
840 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 860
845 IF S>3 THEN GC%(P2,X,Y)=0:GOTO 860
850 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
855 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
860 NEXT X
865 LOCATE 5,2:PRINT " UPDATED ROW:";:COLOR 7:PRINT Y:COLOR 1
866 LOCATE 6,2::PRINT " LIVING CELLS:";:COLOR 7:PRINT LL:COLOR 1
870 NEXT Y
875 P3 = P1
880 P1 = P2
885 P2 = P3
890 CLS:RETURN
900 RECT 0,0,319,239,$10
905 COLOR 7,0:CLS:S=1
910 LOCATE 2,2:PRINT "1.";:COLOR 5:PRINT " RANDOM FILL OF CELLS";:COLOR 7
915 LOCATE 4,2:PRINT "2.";:COLOR 5:PRINT " USER SELECTION";:COLOR 7
916 LOCATE 7,2:PRINT "<";:COLOR 5: PRINT "ARROWS TO CHOOSE";:COLOR 7:PRINT ">";
917 LOCATE 9,2:COLOR 7:PRINT "<";:COLOR 5:PRINT "ENTER TO PROCEED";:COLOR 7
918 PRINT ">";
920 X = 4:GOTO 922
921 FRAME X,Y,X+200,Y + 11,$10
922 IF S=3 THEN S=1:IF S=0 THEN S=2
925 IF S = 2 THEN Y = 21
930 IF S = 1 THEN Y = 6
935 FRAME X,Y,X+200,Y + 11,1
940 GET K$:IF K$="" THEN 940
950 K = ASC(K$)
960 IF K=49 THEN S = 1:GOTO 921
970 IF K=50 THEN S = 2:GOTO 921
980 IF K=157 OR K=17 THEN S = S + 1:GOTO 921
990 IF K=145 OR K=29 THEN S = S - 1:GOTO 921
1000 IF K=27 THEN END
1005 IF K=13 THEN GOTO 1020
1010 GOTO 940
1020 FRAME X,Y,X+200,Y + 11,$10
1025 IF S = 1 THEN:GOSUB 200:RETURN
1030 CLS:COLOR 5
1035 LOCATE 2,1:PRINT " THE NEXT SCREEN IS MOSTLY BLANK !";
1040 LOCATE 4,1:PRINT " SELECT YOUR CELL WITH THE";:COLOR 7:PRINT" ARROW KEYS";
1045 COLOR 5:LOCATE 6,1:PRINT " TOGGLE ITS LIFE STATE WITH";:COLOR 7
1050 PRINT " SPACE BAR";:LOCATE 8,1:PRINT " ENTER ";:COLOR 5
1055 PRINT "PROCEEDS WITH THE GRID";:LOCATE 10,1:COLOR 7
1056 PRINT " ESC";:COLOR 5:PRINT" ABORTS PROGRAM";
1060 LOCATE 15,10:COLOR 7:PRINT "<";:COLOR 5:PRINT "ANY KEY TO CONTINUE";
1065 COLOR 7:PRINT ">";
1070 PRINT:PRINT:GOSUB 8000:GOSUB 1800:END
1800 CLS:COLOR 7
1805 LOCATE 1,3:PRINT "MAKING ALL THE CELLS DEAD";
1805 FOR X = 1 TO GX
REM If a cell is ON and has fewer than two neighbors that are ON, it turns OFF
REM If a cell is ON and has either two or three neighbors that are ON, it remains ON.
REM If a cell is ON and has more than three neighbors that are ON, it turns OFF.
REM If a cell is OFF and has exactly three neighbors that are ON, it turns ON.
10 SCREEN $80
80 GOSUB 2000
90 P1=1:P2=2
100 C1=$05:C2 = $10
110 X = RND(-TI)
130 DIM GC%(2,GX,GY)
140 GOSUB 900 : REM INITGRID
150 GOSUB 300
155 GOSUB 400
160 GOSUB 300
165 IF LL = O THEN PRINT "NO LIVING CELLS !!! ":END
170 GOTO 155
199 GOTO 8000
REM INITGRID
200 COLOR 1,0:CLS:COLOR 1,11:LOCATE 2,2:PRINT " INITIALIZING "
202 LOCATE 3,2:PRINT " "
205 FOR X = 1 TO GX
210 FOR Y = 1 TO GY
211 IF Y=1 THEN LOCATE 4,2:PRINT " "
215 LOCATE 4,2:PRINT " X: ";
216 COLOR 7:PRINT X;" ";:COLOR 1:PRINT "Y: ";
218 COLOR 7:PRINT Y;:COLOR 1
220 GC%(P1,X,Y)= 0
230 J = INT(RND(1)*10)
240 IF J < 2 THEN GC%(P1,X,Y)= 1
250 NEXT Y
260 NEXT X
270 COLOR 1,0:CLS:RETURN
299 REM DRAWGRID
300 LOCATE 2,2:PRINT "DRAWING THE GRID "
305 FOR Y = 1 TO GY
310 FOR X = 1 TO GX
320 IF GC%(P1,X,Y) = 1 THEN CC = C1
330 IF GC%(P1,X,Y) = 0 THEN CC = C2
340 X1 = (X*XS)-XS:Y1=(Y*YS)-XS
350 RECT X1,Y1,X1+XS-1,Y1+YS-1,CC
355 IF GX<=64 THEN FRAME X1,Y1,X1+XS-1,Y1+YS-1,$8A
360 NEXT X
370 NEXT Y
380 RETURN
400 LOCATE 3,2:PRINT "UPDATING CORNER CELLS"
405 LL = 0
410 S = GC%(P1,2,1) + GC%(P1,1,2) + GC%(P1,2,2)
430 IF GC%(P1,1,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,1)=1:LL=LL+1
440 IF GC%(P1,1,1) = 1 AND S<2 THEN GC%(P2,1,1)=0
450 IF GC%(P1,1,1) = 0 AND S=3 THEN GC%(P2,1,1)=1:LL=LL+1
460 IF GC%(P1,1,1) = 0 AND S< 3 THEN GC%(P2,1,1)=0
470 S = GC%(P1,GX-1,1) + GC%(P1,GX-1,2) + GC%(P1,GX,2)
480 IF GC%(P1,GX,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,1)=1:LL=LL+1
490 IF GC%(P1,GX,1) = 1 AND S<2 THEN GC%(P2,GX,1)=0
500 IF GC%(P1,GX,1) = 0 AND S=3 THEN GC%(P2,GX,1)=1:LL=LL+1
505 IF GC%(P1,GX,1) = 0 AND S< 3 THEN GC%(P2,GX,1)=0
510 S = GC%(P1,2,GY) + GC%(P1,1,GY-1) + GC%(P1,2,GY-1)
515 IF GC%(P1,1,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,GY)=1:LL=LL+1
520 IF GC%(P1,1,GY) = 1 AND S<2 THEN GC%(P2,1,GY)=0
525 IF GC%(P1,1,GY) = 0 AND S=3 THEN GC%(P2,1,GY)=1:LL=LL+1
530 IF GC%(P1,1,GY) = 0 AND S< 3 THEN GC%(P2,1,GY)=0
535 S = GC%(P1,GX-1,GY) + GC%(P1,GX-1,GY-1) + GC%(P1,GX,GY-1)
540 IF GC%(P1,GX,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,GY)=1:LL=LL+1
550 IF GC%(P1,GX,GY) = 1 AND S<2 THEN GC%(P2,GX,GY)=0
555 IF GC%(P1,GX,GY) = 0 AND S=3 THEN GC%(P2,GX,GY)=1:LL=LL+1
560 IF GC%(P1,GX,GY) = 0 AND S<3 THEN GC%(P2,GX,GY)=0
565 LOCATE 3,2:PRINT "UPDATING OUTSIDE COLUMNS."
566 COLOR 1
568 LOCATE 6,2:PRINT "#LIVING CELLS:";
569 COLOR 7:PRINT LL:COLOR 1
570 X = 1
575 FOR Y = 2 TO GY - 1
580 S = GC%(P1,X,Y-1) + GC%(P1,X-1,Y-1)+GC%(P1,X+1,Y)
585 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
590 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
595 IF S<2 THEN GC%(P2,X,Y)=0
600 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
610 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
615 IF S>3 THEN GC%(P2,X,Y)=0
620 NEXT Y
625 X = GX
630 FOR Y = 2 TO GY - 1
635 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X-1,Y)
640 S = S + GC%(P1,X-1,Y+1) + GC%(P1,X,Y+1)
645 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
650 IF S<2 THEN GC%(P2,X,Y)=0
655 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
660 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
665 IF S>3 THEN GC%(P2,X,Y)=0
670 NEXT Y
685 LOCATE 3,2:PRINT "UPDATING TOP AND BOTTOM ROW.":COLOR 1
690 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
695 Y = 1
700 FOR X = 2 TO GX - 1
705 S = GC%(P1,X-1,Y) + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)
710 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
715 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
720 IF S<2 THEN GC%(P2,X,Y)=0
725 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
730 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
735 IF S>3 THEN GC%(P2,X,Y)=0
740 NEXT X
742 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
745 Y = GY
750 FOR X = 2 TO GX - 1
755 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
760 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
765 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
770 IF S<2 THEN GC%(P2,X,Y)=0
775 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
780 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
785 IF S>3 THEN GC%(P2,X,Y)=0
790 NEXT X
795 LOCATE 3,2:PRINT "BORDER IS DONE "
796 LOCATE 4,2 :PRINT "UPDATING CORE GRID"
800 LOCATE 6,2:PRINT "#LIVING CELLS:";CHR$($9D);LL;CHR$($05)
810 FOR Y = 2 TO GY-1
815 FOR X = 2 TO GX - 1
820 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
825 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
830 S = S + GC%(P1,X-1,Y+1)+GC%(P1,X,Y+1)+GC%(P1,X+1,Y+1)
835 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
840 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 860
845 IF S>3 THEN GC%(P2,X,Y)=0:GOTO 860
850 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
855 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
860 NEXT X
865 LOCATE 5,2:PRINT " UPDATED ROW:";:COLOR 7:PRINT Y:COLOR 1
866 LOCATE 6,2::PRINT " LIVING CELLS:";:COLOR 7:PRINT LL:COLOR 1
870 NEXT Y
875 P3 = P1
880 P1 = P2
885 P2 = P3
890 CLS:RETURN
900 RECT 0,0,319,239,$10
905 COLOR 7,0:CLS:S=1
910 LOCATE 2,2:PRINT "1.";:COLOR 5:PRINT " RANDOM FILL OF CELLS";:COLOR 7
915 LOCATE 4,2:PRINT "2.";:COLOR 5:PRINT " USER SELECTION";:COLOR 7
916 LOCATE 7,2:PRINT "<";:COLOR 5: PRINT "ARROWS TO CHOOSE";:COLOR 7:PRINT ">";
917 LOCATE 9,2:COLOR 7:PRINT "<";:COLOR 5:PRINT "ENTER TO PROCEED";:COLOR 7
918 PRINT ">";
920 X = 4:GOTO 922
921 FRAME X,Y,X+200,Y + 11,$10
922 IF S=3 THEN S=1:IF S=0 THEN S=2
925 IF S = 2 THEN Y = 21
930 IF S = 1 THEN Y = 6
935 FRAME X,Y,X+200,Y + 11,1
940 GET K$:IF K$="" THEN 940
950 K = ASC(K$)
960 IF K=49 THEN S = 1:GOTO 921
970 IF K=50 THEN S = 2:GOTO 921
980 IF K=157 OR K=17 THEN S = S + 1:GOTO 921
990 IF K=145 OR K=29 THEN S = S - 1:GOTO 921
1000 IF K=27 THEN END
1005 IF K=13 THEN GOTO 1020
1010 GOTO 940
1020 FRAME X,Y,X+200,Y + 11,$10
1025 IF S = 1 THEN:GOSUB 200:RETURN
1030 CLS:COLOR 5
1035 LOCATE 2,1:PRINT " THE NEXT SCREEN IS MOSTLY BLANK !";
1040 LOCATE 4,1:PRINT " SELECT YOUR CELL WITH THE";:COLOR 7:PRINT" ARROW KEYS";
1045 COLOR 5:LOCATE 6,1:PRINT " TOGGLE ITS LIFE STATE WITH";:COLOR 7
1050 PRINT " SPACE BAR";:LOCATE 8,1:PRINT " ENTER ";:COLOR 5
1055 PRINT "PROCEEDS WITH THE GRID";:LOCATE 10,1:COLOR 7
1056 PRINT " ESC";:COLOR 5:PRINT" ABORTS PROGRAM";
1060 LOCATE 15,10:COLOR 7:PRINT "<";:COLOR 5:PRINT "ANY KEY TO CONTINUE";
1065 COLOR 7:PRINT ">";
1070 PRINT:PRINT:GOSUB 8000:GOSUB 1800:END
1800 CLS:COLOR 7
1805 LOCATE 9,3:PRINT "MAKING ALL THE CELLS DEAD";
1810 FOR X = 1 TO GX
1815 LOCATE 19,2:PRINT X;
1820 FOR Y = 1 TO GY
1825 GC%(P1,X,Y) = 0
1830 NEXT Y
1840 NEXT X
1850 LOCATE 11,3:PRINT "DONE WITH THE SLAUGHTER":PRINT
1855 INPUT X$
1860 RETURN
2000 IX = 3:COLOR 1,0:CLS
2020 IF IX > 5 THEN IX = 1
2025 IF IX < 1 THEN IX = 5
2030 IF IX = 5 THEN GX = 80:GY=60
2035 IF IX = 4 THEN GX = 64:GY=48
2040 IF IX = 3 THEN GX = 32:GY=24
2045 IF IX = 2 THEN GX = 16:GY=12
2050 IF IX = 1 THEN GX = 8:GY = 6
2055 XS = 320/GX:YS=240/GY
2060 RECT 0,0,319,239,$10
2065 FRAME 0,0,319,239, $01
2070 FOR X = XS TO 320-XS STEP XS
2075 LINE X,0,X,239,$01
2080 NEXT X
2085 FOR Y = YS TO 240-YS STEP YS
2090 LINE 0,Y,319,Y,$01
2095 NEXT Y
2100 COLOR 1,11
2102 LOCATE 2,2:PRINT " ";
2105 LOCATE 3,2:PRINT " ";
2110 LOCATE 4,2:PRINT " ";
2115 LOCATE 5,2:PRINT " ";
2120 LOCATE 6,2:PRINT " ";
2135 LOCATE 3,3:PRINT "CHANGE GRID DENSITY";:COLOR 7:PRINT " <ARROW KEYS>"
2140 COLOR 1:LOCATE 4,3:PRINT "CURRENT: ";
2142 COLOR 7:PRINT GX;:COLOR 1:PRINT " X ";:COLOR 7:PRINT GY;
2145 COLOR 7:LOCATE 6,3:PRINT "<";:COLOR 5:PRINT "ENTER TO CHOOSE";:COLOR 7
2146 PRINT ">";
2150 GET K$
2155 K = ASC(K$)
2160 IF K=157 OR K=17 THEN IX = IX + 1:GOTO 2020
2165 IF K=145 OR K=29 THEN IX = IX - 1:GOTO 2020
2170 IF K=13 THEN COLOR 1,0:CLS:RETURN
2175 IF K=27 THEN END
2180 GOTO 2150
8000 GET X$:IF X$<>"" THEN GOTO 8000 : REM FLUSH KEYBOARD BUFFER
8010 GET X$:IF X$="" THEN GOTO 8010 : REM WAIT FOR KEY
8020 RETURN
-
- Posts: 21
- Joined: Sat Nov 26, 2022 6:24 pm
Re: CONWAYS GAME OF LIFE
I wrote a Prog8 version a while back. Thought it might be of interest. This an appropriate place to post it, or should I start a new thread?
- ahenry3068
- Posts: 1194
- Joined: Tue Apr 04, 2023 9:57 pm
Re: CONWAYS GAME OF LIFE
I'm fine with the post here
- ahenry3068
- Posts: 1194
- Joined: Tue Apr 04, 2023 9:57 pm
UPDATE: CONWAYS GAME OF LIFE
Now allows user selection of Live cells in the Grid. You
can play with the Patterns with your own choice of cells.
Keyboard for Now. Mouse support coming. Possibly
before the end of the day..
HERES THE CODE:
can play with the Patterns with your own choice of cells.
Keyboard for Now. Mouse support coming. Possibly
before the end of the day..
HERES THE CODE:
Code: Select all
REM If a cell is ON and has fewer than two neighbors that are ON, it turns OFF
REM If a cell is ON and has either two or three neighbors that are ON, it remains ON.
REM If a cell is ON and has more than three neighbors that are ON, it turns OFF.
REM If a cell is OFF and has exactly three neighbors that are ON, it turns ON.
10 SCREEN $80
80 GOSUB 2000
90 P1=1:P2=2
100 C1=$05:C2 = $10
110 X = RND(-TI)
130 DIM GC%(2,GX,GY)
140 GOSUB 900 : REM INITGRID
150 GOSUB 300 : REM DRAWGRID
155 GOSUB 400 : REM UPDATE GRID
160 GOSUB 300 : REM DRAWGRID
165 IF LL = O THEN PRINT "NO LIVING CELLS !!! ":END
170 GOTO 155
199 GOTO 8000
REM INITGRID
200 COLOR 1,0:CLS:COLOR 1,11:LOCATE 2,2:PRINT " INITIALIZING "
202 LOCATE 3,2:PRINT " "
205 FOR X = 1 TO GX
210 FOR Y = 1 TO GY
211 IF Y=1 THEN LOCATE 4,2:PRINT " "
215 LOCATE 4,2:PRINT " X: ";
216 COLOR 7:PRINT X;" ";:COLOR 1:PRINT "Y: ";
218 COLOR 7:PRINT Y;:COLOR 1
220 GC%(P1,X,Y)= 0
230 J = INT(RND(1)*10)
240 IF J < 2 THEN GC%(P1,X,Y)= 1
250 NEXT Y
260 NEXT X
270 COLOR 1,0:CLS:RETURN
299 REM DRAWGRID
300 CLS:COLOR 1:LOCATE 2,2:PRINT "DRAWING THE GRID "
305 FOR Y = 1 TO GY
310 FOR X = 1 TO GX
320 IF GC%(P1,X,Y) = 1 THEN CC = C1
330 IF GC%(P1,X,Y) = 0 THEN CC = C2
340 X1 = (X*XS)-XS:Y1=(Y*YS)-XS
350 RECT X1,Y1,X1+XS-1,Y1+YS-1,CC
355 LINE X1,Y1,X1,Y1+YS-1,$8A
356 LINE X1,Y1+YS-1,X1+XS-1,Y1+YS-1,$8A
360 NEXT X
370 NEXT Y
375 CLS
380 RETURN
400 CLS:LOCATE 3,2:PRINT "UPDATING CORNER CELLS"
405 LL = 0
410 S = GC%(P1,2,1) + GC%(P1,1,2) + GC%(P1,2,2)
430 IF GC%(P1,1,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,1)=1:LL=LL+1
440 IF GC%(P1,1,1) = 1 AND S<2 THEN GC%(P2,1,1)=0
450 IF GC%(P1,1,1) = 0 AND S=3 THEN GC%(P2,1,1)=1:LL=LL+1
460 IF GC%(P1,1,1) = 0 AND S< 3 THEN GC%(P2,1,1)=0
470 S = GC%(P1,GX-1,1) + GC%(P1,GX-1,2) + GC%(P1,GX,2)
480 IF GC%(P1,GX,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,1)=1:LL=LL+1
490 IF GC%(P1,GX,1) = 1 AND S<2 THEN GC%(P2,GX,1)=0
500 IF GC%(P1,GX,1) = 0 AND S=3 THEN GC%(P2,GX,1)=1:LL=LL+1
505 IF GC%(P1,GX,1) = 0 AND S< 3 THEN GC%(P2,GX,1)=0
510 S = GC%(P1,2,GY) + GC%(P1,1,GY-1) + GC%(P1,2,GY-1)
515 IF GC%(P1,1,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,GY)=1:LL=LL+1
520 IF GC%(P1,1,GY) = 1 AND S<2 THEN GC%(P2,1,GY)=0
525 IF GC%(P1,1,GY) = 0 AND S=3 THEN GC%(P2,1,GY)=1:LL=LL+1
530 IF GC%(P1,1,GY) = 0 AND S< 3 THEN GC%(P2,1,GY)=0
535 S = GC%(P1,GX-1,GY) + GC%(P1,GX-1,GY-1) + GC%(P1,GX,GY-1)
540 IF GC%(P1,GX,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,GY)=1:LL=LL+1
550 IF GC%(P1,GX,GY) = 1 AND S<2 THEN GC%(P2,GX,GY)=0
555 IF GC%(P1,GX,GY) = 0 AND S=3 THEN GC%(P2,GX,GY)=1:LL=LL+1
560 IF GC%(P1,GX,GY) = 0 AND S<3 THEN GC%(P2,GX,GY)=0
565 CLS:LOCATE 3,2:PRINT "UPDATING OUTSIDE COLUMNS."
566 COLOR 1
568 LOCATE 6,2:PRINT "#LIVING CELLS:";
569 COLOR 7:PRINT LL:COLOR 1
570 X = 1
575 FOR Y = 2 TO GY - 1
580 S = GC%(P1,X,Y-1) + GC%(P1,X-1,Y-1)+GC%(P1,X+1,Y)
585 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
590 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
595 IF S<2 THEN GC%(P2,X,Y)=0
600 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
610 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
615 IF S>3 THEN GC%(P2,X,Y)=0
620 NEXT Y
625 X = GX
630 FOR Y = 2 TO GY - 1
635 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X-1,Y)
640 S = S + GC%(P1,X-1,Y+1) + GC%(P1,X,Y+1)
645 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
650 IF S<2 THEN GC%(P2,X,Y)=0
655 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
660 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
665 IF S>3 THEN GC%(P2,X,Y)=0
670 NEXT Y
685 CLS:LOCATE 3,2:PRINT "UPDATING TOP AND BOTTOM ROW.":COLOR 1
690 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
695 Y = 1
700 FOR X = 2 TO GX - 1
705 S = GC%(P1,X-1,Y) + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)
710 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
715 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
720 IF S<2 THEN GC%(P2,X,Y)=0
725 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
730 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
735 IF S>3 THEN GC%(P2,X,Y)=0
740 NEXT X
742 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
745 Y = GY
750 FOR X = 2 TO GX - 1
755 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
760 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
765 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
770 IF S<2 THEN GC%(P2,X,Y)=0
775 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
780 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
785 IF S>3 THEN GC%(P2,X,Y)=0
790 NEXT X
795 CLS:LOCATE 3,2:PRINT "BORDER IS DONE "
796 LOCATE 4,2 :PRINT "UPDATING CORE GRID"
800 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
810 FOR Y = 2 TO GY-1
811 LOCATE 5,2:PRINT " UPDATING ROW:";:COLOR 7:PRINT Y:COLOR 1
815 FOR X = 2 TO GX - 1
820 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)+GC%(P1,X-1,Y)
830 S = S + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)+GC%(P1,X,Y+1)+GC%(P1,X+1,Y+1)
835 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 860
840 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
845 IF S>3 THEN GC%(P2,X,Y)=0:GOTO 860
850 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
855 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
860 NEXT X
865
866 LOCATE 6,2::PRINT " LIVING CELLS:";:COLOR 7:PRINT LL:COLOR 1
870 NEXT Y
875 P3 = P1
880 P1 = P2
885 P2 = P3
890 CLS:RETURN
900 RECT 0,0,319,239,$10
905 COLOR 7,0:CLS:S=1
910 LOCATE 2,2:PRINT "1.";:COLOR 5:PRINT " RANDOM FILL OF CELLS";:COLOR 7
915 LOCATE 4,2:PRINT "2.";:COLOR 5:PRINT " USER SELECTION";:COLOR 7
916 LOCATE 7,2:PRINT "<";:COLOR 5: PRINT "ARROWS TO CHOOSE";:COLOR 7:PRINT ">";
917 LOCATE 9,2:COLOR 7:PRINT "<";:COLOR 5:PRINT "ENTER TO PROCEED";:COLOR 7
918 PRINT ">";
920 X = 4:GOTO 922
921 FRAME X,Y,X+200,Y + 11,$10
922 IF S=3 THEN S=1:IF S=0 THEN S=2
925 IF S = 2 THEN Y = 21
930 IF S = 1 THEN Y = 6
935 FRAME X,Y,X+200,Y + 11,1
940 GET K$:IF K$="" THEN 940
950 K = ASC(K$)
960 IF K=49 THEN S = 1:GOTO 921
970 IF K=50 THEN S = 2:GOTO 921
980 IF K=157 OR K=17 THEN S = S + 1:GOTO 921
990 IF K=145 OR K=29 THEN S = S - 1:GOTO 921
1000 IF K=27 THEN END
1005 IF K=13 THEN GOTO 1020
1010 GOTO 940
1020 FRAME X,Y,X+200,Y + 11,$10
1025 IF S = 1 THEN:GOSUB 200:RETURN
1030 GOSUB 4000
1040 GOSUB 1800:RETURN
1800 CLS:COLOR 7
1805 LOCATE 9,3:PRINT "MAKING ALL THE CELLS DEAD";
1810 FOR X = 1 TO GX
1815 LOCATE 19,2:PRINT X;
1820 FOR Y = 1 TO GY
1825 GC%(P1,X,Y) = 0
1830 NEXT Y
1840 NEXT X
1850 LOCATE 11,3:PRINT "DONE WITH THE SLAUGHTER"
1860 CLS:RECT 0,0,XLIMIT,YLIMIT,$10:MOUSE 1
1865 X=1:Y=1
1866 GOSUB 1985
1870 FRAME X1,Y1,X1+XS-1,Y1+YS-1,7
1875 GET I$
1880 IF I$<> "" THEN I = ASC(I$):GOTO 1900
1885 I=0
1900 IF I=0 THEN 1875
1901 IF I<>32 THEN 1915
1905 IF GC%(1,X,Y)=0 THEN GC%(1,X,Y)=1:GOTO 1866
1910 GC%(1,X,Y)=0:GOTO 1866
1915 IF I=145 THEN GOSUB 1985:Y=Y-1:IF Y<1 THEN Y=GY
1916 IF I=145 THEN 1866
1920 IF I=157 THEN GOSUB 1985:X=X-1:IF X<1 THEN X=GX
1921 IF I=157 THEN 1866
1925 IF I=29 THEN GOSUB 1985:X=X+1:IF X>GX THEN X=1
1926 IF I=29 THEN 1866
1930 IF I=17 THEN GOSUB 1985:Y=Y+1:IF Y>GY THEN Y=1
1931 IF I=17 THEN 1866
1935 IF I=13 THEN :MOUSE 0:RETURN
1940 GOTO 1875
1985 X1 = (X*XS)-XS:Y1=(Y*YS)-XS
1986 IF GC%(1,X,Y)=1 THEN RECT X1,Y1,X1+XS-1,Y1+YS-1,$05:GOTO 1988
1987 RECT X1,Y1,X1+XS-1,Y1+YS-1,$10
1988 REM IF GX<=64 THEN FRAME X1,Y1,X1+XS-1,Y1+YS-1,$8A
1989 FRAME X1,Y1,X1+XS-1,Y1+YS-1,$8A
1990 RETURN
2000 IX = 3:COLOR 1,0:CLS
2020 IF IX > 5 THEN IX = 1
2025 IF IX < 1 THEN IX = 5
2030 IF IX = 5 THEN GX = 80:GY=60
2035 IF IX = 4 THEN GX = 64:GY=48
2040 IF IX = 3 THEN GX = 32:GY=24
2045 IF IX = 2 THEN GX = 16:GY=12
2050 IF IX = 1 THEN GX = 8:GY = 6
2055 XS = 320/GX:YS=240/GY
2060 RECT 0,0,319,239,$10
2065 FRAME 0,0,319,239, $01
2070 FOR X = XS TO 320-XS STEP XS
2075 LINE X,0,X,239,$01
2080 NEXT X
2085 FOR Y = YS TO 240-YS STEP YS
2090 LINE 0,Y,319,Y,$01
2095 NEXT Y
2100 COLOR 1,11
2102 LOCATE 2,2:PRINT " ";
2105 LOCATE 3,2:PRINT " ";
2110 LOCATE 4,2:PRINT " ";
2115 LOCATE 5,2:PRINT " ";
2120 LOCATE 6,2:PRINT " ";
2135 LOCATE 3,3:PRINT "CHANGE GRID DENSITY";:COLOR 7:PRINT " <ARROW KEYS>"
2140 COLOR 1:LOCATE 4,3:PRINT "CURRENT: ";
2142 COLOR 7:PRINT GX;:COLOR 1:PRINT " X ";:COLOR 7:PRINT GY;
2145 COLOR 7:LOCATE 6,3:PRINT "<";:COLOR 5:PRINT "ENTER TO CHOOSE";:COLOR 7
2146 PRINT ">";
2150 GET K$
2155 K = ASC(K$)
2160 IF K=157 OR K=17 THEN IX = IX + 1:GOTO 2020
2165 IF K=145 OR K=29 THEN IX = IX - 1:GOTO 2020
2170 IF K=13 THEN COLOR 1,0:CLS:RETURN
2175 IF K=27 THEN END
2180 GOTO 2150
4000 COLOR 0,15
4001 RECT 0,0,XLIMIT,YLIMIT,$10
4010 FOR J = 2 TO 17
4015 LOCATE J,1
4016 PRINT " ";
4020 NEXT J
4035 LOCATE 3,1:PRINT " CELL SELECTION SCREEN IS MOSTLY BLANK !";
4040 LOCATE 5,1:PRINT " SELECT YOUR CELL WITH THE";:COLOR 7:PRINT" ARROW KEYS";
4045 COLOR 0:LOCATE 7,1:PRINT " TOGGLE ITS LIFE STATE WITH";:COLOR 7
4050 PRINT " SPACE BAR";:LOCATE 9,1:PRINT " ENTER ";:COLOR 0
4055 PRINT "PROCEEDS WITH THE GRID";:LOCATE 10,1:COLOR 7
4056 PRINT " ESC";:COLOR 0:PRINT" ABORTS PROGRAM";
4060 LOCATE 16,10:COLOR 0:PRINT "<";:COLOR 5:PRINT "ANY KEY TO CONTINUE";
4065 COLOR 0:PRINT ">";
4070 GOSUB 8000:COLOR 1,0:CLS:RETURN
8000 GET X$:IF X$<>"" THEN GOTO 8000 : REM FLUSH KEYBOARD BUFFER
8010 GET X$:IF X$="" THEN GOTO 8010 : REM WAIT FOR KEY
8015 IF ASC(X$)=27 THEN SCREEN 0:END
8020 RETURN
- ahenry3068
- Posts: 1194
- Joined: Tue Apr 04, 2023 9:57 pm
Re: CONWAYS GAME OF LIFE
Ok, didn't finish the Mouse support.
I have a really good idea how it's going to work though.
I had a minor bug this whole time.
LIFE rules work best with an infinite grid... But thats not really possible in the real world.
I cut things off at the edge of the Screen. Corner blocks never have > 3 neighbors.
Upper,Lower and Side Rows never have more than 5 neighbors. My Left Hand column
was not updating correctly even with those constraints. It was probably more of a typo
than a logic error, I had the other 3 sides correct.
Anyway it is fixed and works correctly now.
I did a lot of playing with look and feel. User selection of cells works correctly.
But it's still a little off in my book.
Anyway.... It's bedtime so here is the current CODE
I have a really good idea how it's going to work though.
I had a minor bug this whole time.
LIFE rules work best with an infinite grid... But thats not really possible in the real world.
I cut things off at the edge of the Screen. Corner blocks never have > 3 neighbors.
Upper,Lower and Side Rows never have more than 5 neighbors. My Left Hand column
was not updating correctly even with those constraints. It was probably more of a typo
than a logic error, I had the other 3 sides correct.
Anyway it is fixed and works correctly now.
I did a lot of playing with look and feel. User selection of cells works correctly.
But it's still a little off in my book.
Anyway.... It's bedtime so here is the current CODE
Code: Select all
REM If a cell is ON and has fewer than two neighbors that are ON, it turns OFF
REM If a cell is ON and has either two or three neighbors that are ON, it remains ON.
REM If a cell is ON and has more than three neighbors that are ON, it turns OFF.
REM If a cell is OFF and has exactly three neighbors that are ON, it turns ON.
10 GOSUB 6000 : REM INIT ALL VARS
80 GOSUB 2000
130 DIM GC%(2,GX,GY)
140 GOSUB 900 : REM INITGRID
150 GOSUB 300 : REM DRAWGRID
155 GOSUB 400 : REM UPDATE GRID
160 GOSUB 300 : REM DRAWGRID
165 IF LL = O THEN PRINT:PRINT "NO LIVING CELLS !!! ":PRINT:PRINT:END
170 GOTO 155
199 GOTO 8000
REM INITGRID
200 COLOR 1,0:CLS:COLOR 1,15
202 FOR I=2 TO 6:LOCATE I,2:PRINT " ":NEXT I
204 COLOR 6,15:LOCATE 3,2:PRINT " INITIALIZING";
205 FOR Y = 1 TO GY
208 COLOR 6,15:LOCATE 5,2:PRINT " ROW:";:COLOR 7:PRINT Y;
210 FOR X = 1 TO GX
211 COLOR 6,15
215 LOCATE 5,11:PRINT "COL:";
218 COLOR 7:PRINT X;:COLOR 1
220 GC%(P1,X,Y)= 0
230 J = INT(RND(1)*10)
240 IF J < 2 THEN GC%(P1,X,Y)= 1
250 NEXT X
260 NEXT Y
270 COLOR 1,0:CLS:RETURN
299 REM DRAWGRID
300 CLS:COLOR 1:LOCATE 2,2:PRINT "DRAWING THE GRID ";
301 CG=$F2
305 FOR Y = 1 TO GY
310 FOR X = 1 TO GX
320 IF GC%(P1,X,Y) = 1 THEN CC = C1
330 IF GC%(P1,X,Y) = 0 THEN CC = C2
340 X1 = (X*XS)-XS:Y1=(Y*YS)-XS
345 PSET X1,Y1,7
350 RECT X1,Y1,X1+XS-1,Y1+YS-1,CC
355 IF X>1 THEN LINE X1,Y1,X1,Y1+YS-1, CG
356 IF Y < GY THEN LINE X1,Y1+YS-1,X1+XS-1,Y1+YS-1,CG
360 NEXT X
370 NEXT Y
375 CLS
380 RETURN
400 CLS:LOCATE 3,2:PRINT "UPDATING CORNER CELLS"
405 LL = 0
410 S = GC%(P1,2,1) + GC%(P1,1,2) + GC%(P1,2,2)
430 IF GC%(P1,1,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,1)=1:LL=LL+1
440 IF GC%(P1,1,1) = 1 AND S<2 THEN GC%(P2,1,1)=0
450 IF GC%(P1,1,1) = 0 AND S=3 THEN GC%(P2,1,1)=1:LL=LL+1
460 IF GC%(P1,1,1) = 0 AND S< 3 THEN GC%(P2,1,1)=0
470 S = GC%(P1,GX-1,1) + GC%(P1,GX-1,2) + GC%(P1,GX,2)
480 IF GC%(P1,GX,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,1)=1:LL=LL+1
490 IF GC%(P1,GX,1) = 1 AND S<2 THEN GC%(P2,GX,1)=0
500 IF GC%(P1,GX,1) = 0 AND S=3 THEN GC%(P2,GX,1)=1:LL=LL+1
505 IF GC%(P1,GX,1) = 0 AND S< 3 THEN GC%(P2,GX,1)=0
510 S = GC%(P1,2,GY) + GC%(P1,1,GY-1) + GC%(P1,2,GY-1)
515 IF GC%(P1,1,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,GY)=1:LL=LL+1
520 IF GC%(P1,1,GY) = 1 AND S<2 THEN GC%(P2,1,GY)=0
525 IF GC%(P1,1,GY) = 0 AND S=3 THEN GC%(P2,1,GY)=1:LL=LL+1
530 IF GC%(P1,1,GY) = 0 AND S< 3 THEN GC%(P2,1,GY)=0
535 S = GC%(P1,GX-1,GY) + GC%(P1,GX-1,GY-1) + GC%(P1,GX,GY-1)
540 IF GC%(P1,GX,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,GY)=1:LL=LL+1
550 IF GC%(P1,GX,GY) = 1 AND S<2 THEN GC%(P2,GX,GY)=0
555 IF GC%(P1,GX,GY) = 0 AND S=3 THEN GC%(P2,GX,GY)=1:LL=LL+1
560 IF GC%(P1,GX,GY) = 0 AND S<3 THEN GC%(P2,GX,GY)=0
565 CLS:LOCATE 3,2:PRINT "UPDATING OUTSIDE COLUMNS."
566 COLOR 1
568 LOCATE 6,2:PRINT "#LIVING CELLS:";
569 COLOR 7:PRINT LL:COLOR 1
570 X = 1
575 FOR Y = 2 TO GY - 1
580 S = GC%(P1,X,Y-1) + GC%(P1,X+1,Y-1)+GC%(P1,X+1,Y)
585 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
590 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 620
595 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 620
600 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 620
610 IF GC%(P1,X,Y) = 0 AND S=2 THEN GC%(P2,X,Y)=0
615 IF S>3 THEN GC%(P2,X,Y)=0
620 NEXT Y
625 X = GX
630 FOR Y = 2 TO GY - 1
635 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X-1,Y)
640 S = S + GC%(P1,X-1,Y+1) + GC%(P1,X,Y+1)
645 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 670
650 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 670
655 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 670
660 IF GC%(P1,X,Y) = 0 AND S=2 THEN GC%(P2,X,Y)=0
665 IF S>3 THEN GC%(P2,X,Y)=0
670 NEXT Y
685 CLS:LOCATE 3,2:PRINT "UPDATING TOP AND BOTTOM ROW.":COLOR 1
690 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
695 Y = 1
700 FOR X = 2 TO GX - 1
705 S = GC%(P1,X-1,Y) + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)
710 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
715 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
720 IF S<2 THEN GC%(P2,X,Y)=0
725 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
730 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
735 IF S>3 THEN GC%(P2,X,Y)=0
740 NEXT X
742 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
745 Y = GY
750 FOR X = 2 TO GX - 1
755 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
760 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
765 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
770 IF S<2 THEN GC%(P2,X,Y)=0
775 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
780 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
785 IF S>3 THEN GC%(P2,X,Y)=0
790 NEXT X
795 CLS:LOCATE 3,2:PRINT " BORDER IS DONE "
796 LOCATE 4,2 :PRINT "UPDATING CORE GRID"
800 LOCATE 6,2:PRINT "#LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
810 FOR Y = 2 TO GY-1
811 LOCATE 5,2:PRINT " UPDATING ROW:";:COLOR 7:PRINT Y:COLOR 1
815 FOR X = 2 TO GX - 1
820 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)+GC%(P1,X-1,Y)
830 S = S + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)+GC%(P1,X,Y+1)+GC%(P1,X+1,Y+1)
835 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 860
840 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
845 IF S>3 THEN GC%(P2,X,Y)=0:GOTO 860
850 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
855 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
860 NEXT X
865
866 LOCATE 6,2::PRINT " LIVING CELLS:";:COLOR 7:PRINT LL:COLOR 1
870 NEXT Y
875 P3 = P1
880 P1 = P2
885 P2 = P3
890 CLS:RETURN
900 RECT 0,0,319,239,$10
905 COLOR 7,0:CLS:S=1
910 LOCATE 2,2:PRINT "1.";:COLOR 5:PRINT " RANDOM FILL OF CELLS";:COLOR 7
915 LOCATE 4,2:PRINT "2.";:COLOR 5:PRINT " USER SELECTION";:COLOR 7
916 LOCATE 7,2:PRINT "<";:COLOR 5: PRINT "ARROWS TO CHOOSE";:COLOR 7:PRINT ">";
917 LOCATE 9,2:COLOR 7:PRINT "<";:COLOR 5:PRINT "ENTER TO PROCEED";:COLOR 7
918 PRINT ">";
920 X = 4:GOTO 922
921 FRAME X,Y,X+200,Y + 11,$10
922 IF S=3 THEN S=1:IF S=0 THEN S=2
925 IF S = 2 THEN Y = 21
930 IF S = 1 THEN Y = 6
935 FRAME X,Y,X+200,Y + 11,1
940 GET K$:IF K$="" THEN 940
950 K = ASC(K$)
960 IF K=49 THEN S = 1:GOTO 921
970 IF K=50 THEN S = 2:GOTO 921
980 IF K=157 OR K=17 THEN S = S + 1:GOTO 921
990 IF K=145 OR K=29 THEN S = S - 1:GOTO 921
1000 IF K=27 THEN END
1005 IF K=13 THEN GOTO 1020
1010 GOTO 940
1020 FRAME X,Y,X+200,Y + 11,$10
1025 IF S = 1 THEN:GOSUB 200:RETURN
1030 GOSUB 4000
1040 GOSUB 1800:RETURN
1800 CLS:COLOR 7
1805 LOCATE 9,3:PRINT "MAKING ALL THE CELLS DEAD";
1810 FOR X = 1 TO GX
1815 LOCATE 19,2:PRINT X;
1820 FOR Y = 1 TO GY
1825 GC%(P1,X,Y) = 0
1830 NEXT Y
1840 NEXT X
1850 LOCATE 11,3:PRINT "DONE WITH KILLING"
1851 GET X$:IF X$<>"" THEN 1851 : REM FLUSH ALL KEYBOARD INPUT
1855 SLEEP 30:CLS
1860 GOSUB 2200:REM CLS:RECT 0,0,XLIMIT,YLIMIT,$10:MOUSE 1
1865 X=1:Y=1
1866 GOSUB 1985
1870 FRAME X1,Y1,X1+XS-1,Y1+YS-1,7
1875 GET I$
1880 IF I$<> "" THEN I = ASC(I$):GOTO 1900
1885 I=0
1900 IF I=0 THEN 1875
1901 IF I<>32 THEN 1915
1905 IF GC%(1,X,Y)=0 THEN GC%(1,X,Y)=1:GOTO 1866
1910 GC%(1,X,Y)=0:GOTO 1866
1915 IF I=145 THEN GOSUB 1985:Y=Y-1:IF Y<1 THEN Y=GY
1916 IF I=145 THEN 1866
1920 IF I=157 THEN GOSUB 1985:X=X-1:IF X<1 THEN X=GX
1921 IF I=157 THEN 1866
1925 IF I=29 THEN GOSUB 1985:X=X+1:IF X>GX THEN X=1
1926 IF I=29 THEN 1866
1930 IF I=17 THEN GOSUB 1985:Y=Y+1:IF Y>GY THEN Y=1
1931 IF I=17 THEN 1866
1935 IF I=13 THEN :MOUSE 0:RETURN
1940 GOTO 1875
1985 X1 = (X*XS)-XS:Y1=(Y*YS)-XS
1986 IF GC%(1,X,Y)=1 THEN RECT X1,Y1,X1+XS-1,Y1+YS-1,C1:GOTO 1988
1987 RECT X1,Y1,X1+XS-1,Y1+YS-1,C2
1988 IF X>1 THEN LINE X1,Y1,X1,Y1+YS-1, CG
1989 IF Y < GY THEN LINE X1,Y1+YS-1,X1+XS-1,Y1+YS-1,CG
1990 RETURN
2000 IX = 3:COLOR 1,0:CLS
2020 IF IX > 5 THEN IX = 1
2025 IF IX < 1 THEN IX = 5
2030 IF IX = 5 THEN GX = 80:GY=60
2035 IF IX = 4 THEN GX = 64:GY=48
2040 IF IX = 3 THEN GX = 32:GY=24
2045 IF IX = 2 THEN GX = 16:GY=12
2050 IF IX = 1 THEN GX = 8:GY = 6
2055 XS = 320/GX:YS=240/GY
2060 RECT 0,0,319,239,$10
2065 GOSUB 2200
2100 COLOR 1,11
2102 LOCATE 2,2:PRINT " ";
2105 LOCATE 3,2:PRINT " ";
2110 LOCATE 4,2:PRINT " ";
2115 LOCATE 5,2:PRINT " ";
2120 LOCATE 6,2:PRINT " ";
2135 LOCATE 3,3:PRINT "CHANGE GRID DENSITY";:COLOR 7:PRINT " <ARROW KEYS>"
2140 COLOR 1:LOCATE 4,3:PRINT "CURRENT: ";
2142 COLOR 7:PRINT GX;:COLOR 1:PRINT " X ";:COLOR 7:PRINT GY;
2145 COLOR 7:LOCATE 6,3:PRINT "<";:COLOR 1:PRINT "ENTER TO CHOOSE";:COLOR 7
2146 PRINT ">";
2150 GET K$
2155 K = ASC(K$)
2160 IF K=157 OR K=17 THEN IX = IX + 1:GOTO 2020
2165 IF K=145 OR K=29 THEN IX = IX - 1:GOTO 2020
2170 IF K=13 THEN COLOR 1,0:CLS:RETURN
2175 IF K=27 THEN END
2180 GOTO 2150
2200 RECT 0,0,XLIMIT,YLIMIT,$10
2210 FOR X = XS TO 320-XS STEP XS
2220 LINE X,0,X,239,CG
2230 NEXT X
2240 FOR Y = YS TO 240-YS STEP YS
2250 LINE 0,Y,319,Y,CG
2260 NEXT Y
2270 RETURN
4000 COLOR 6,15
4010 FOR J = 2 TO 17
4015 LOCATE J,1
4016 PRINT " ";
4020 NEXT J
4035 LOCATE 3,1:PRINT " CELL SELECTION SCREEN IS MOSTLY BLANK !";
4040 LOCATE 5,1:PRINT " SELECT YOUR CELL WITH THE";:COLOR 7:PRINT" ARROW KEYS";
4045 COLOR 6:LOCATE 7,1:PRINT " TOGGLE ITS LIFE STATE WITH";:COLOR 7
4050 PRINT " SPACE BAR";:LOCATE 9,1:PRINT " ENTER ";:COLOR 0
4055 PRINT "PROCEEDS WITH THE GRID";:LOCATE 10,1:COLOR 7
4056 PRINT " ESC";:COLOR 6:PRINT" ABORTS PROGRAM";
4060 LOCATE 16,10:COLOR 6:PRINT "<";:COLOR 5:PRINT "ANY KEY TO CONTINUE";
4065 COLOR 6:PRINT ">";
4070 GOSUB 8000:COLOR 1,0:CLS:RETURN
6000 REM INIT ALL STATIC VARS
6010 XLIMIT=319:YLIMIT=239
6020 P1=1:P2=2
6030 C1=$05:C2=$10:CG=15
6040 X=RND(-TI)
6050 SCREEN $80
6060 VPOKE 1,$FA0C,0 : REM CHANGE COLOR 6 TO BLACK
6070 VPOKE 1,$FA0D,0 : REM SO I CAN HAVE NON-TRANSPARENT BLACK TEXT
6100 RETURN
8000 GET X$:IF X$<>"" THEN GOTO 8000 : REM FLUSH KEYBOARD BUFFER
8010 GET X$:IF X$="" THEN GOTO 8010 : REM WAIT FOR KEY
8015 IF ASC(X$)=27 THEN SCREEN 0:END
8020 RETURN
Last edited by ahenry3068 on Tue Jul 11, 2023 12:36 am, edited 1 time in total.
Re: CONWAYS GAME OF LIFE
Some versions just 'wrap' the screen area so that the grid is finite but unbounded. So the neighbors for the top row are the bottom row, the neighbors for the left column are the right column. Might complicate your logic a bit...
- ahenry3068
- Posts: 1194
- Joined: Tue Apr 04, 2023 9:57 pm
Re: CONWAYS GAME OF LIFE
I thought about the unbounded state a minute. It is one solution.
After I got thinking about it, a few things came to mind.
1. This is "sort of" a simple "LIFE" simulation.
2. "Ant Colonys", "Bee Hives", "Flower Gardens" all have real borders.
3. The Bounded State is in one sense more realistic.
4. The code in BASIC runs slowly enough as it is... "Lol" without adding more evaluation code.
Thus I'm taking it under advisement if I write a LIFE implementation again in a Faster language or
on a Faster Platform. I'm going to stay with the Bounded State for this program.
Thank you for the tip, I really didn't think of wrapping the screen, though its something I do often when
using Arrow Keys for Input, As a matter of Fact I do that in 2 spots when choosing Grid Density
and when doing cell selection in the Input routines in this program.
After I got thinking about it, a few things came to mind.
1. This is "sort of" a simple "LIFE" simulation.
2. "Ant Colonys", "Bee Hives", "Flower Gardens" all have real borders.
3. The Bounded State is in one sense more realistic.
4. The code in BASIC runs slowly enough as it is... "Lol" without adding more evaluation code.
Thus I'm taking it under advisement if I write a LIFE implementation again in a Faster language or
on a Faster Platform. I'm going to stay with the Bounded State for this program.
Thank you for the tip, I really didn't think of wrapping the screen, though its something I do often when
using Arrow Keys for Input, As a matter of Fact I do that in 2 spots when choosing Grid Density
and when doing cell selection in the Input routines in this program.
- ahenry3068
- Posts: 1194
- Joined: Tue Apr 04, 2023 9:57 pm
GAME OF LIFE: MOUSE SUPPORT...! Yah.
Calling this code Ver 1.0. RC1 .
Cleaned up some of the Status updates.
Cleaned up Grid Drawing
Eliminated unnecessary Grid Drawing.
Implemented a Help Screen for the Cell Selection Screen
AND..... Drum Roll......
Mouse support working well for picking Living and Dead cells in the initial Screen
I'm not quite sure where to post the final program in Downloads.
Its Called "CONWAY'S GAME OF LIFE" but it's not really a game.
I'm inclined towards DEMOSCENE. I welcome other opinions ?
UPDATE: TESTED ON HARDWARE...
MOUSE SUPPORT ACTUALLY WORKS SMOOTHER ON THE REAL BOARD.
WHEN IN THE EMULATOR THE HOST SYSTEM SOMETIMES GRABS IT BACK
BEFORE I GET TO THE EDGE OF THE SCREEN.
THE TEXT FILE SOURCE : TOKENIZED BASIC FILE:
CUT AND PASTE CODE
Cleaned up some of the Status updates.
Cleaned up Grid Drawing
Eliminated unnecessary Grid Drawing.
Implemented a Help Screen for the Cell Selection Screen
AND..... Drum Roll......
Mouse support working well for picking Living and Dead cells in the initial Screen
I'm not quite sure where to post the final program in Downloads.
Its Called "CONWAY'S GAME OF LIFE" but it's not really a game.
I'm inclined towards DEMOSCENE. I welcome other opinions ?
UPDATE: TESTED ON HARDWARE...
MOUSE SUPPORT ACTUALLY WORKS SMOOTHER ON THE REAL BOARD.
WHEN IN THE EMULATOR THE HOST SYSTEM SOMETIMES GRABS IT BACK
BEFORE I GET TO THE EDGE OF THE SCREEN.
THE TEXT FILE SOURCE : TOKENIZED BASIC FILE:
CUT AND PASTE CODE
Code: Select all
1 REM IF A CELL IS ON AND HAS FEWER THAN 2 NEIGHBORS THAT ARE ON, IT TURNS OFF
2 REM (DIES OF LONLYNESS)
3 REM IF A CELL IS ON AND HAS EITHER 2 OR 3 NEIGHBORS THAT ARE ON IT
4 REM REMAINS ON. (STASIS)
5 REM IF A CELL IS ON AND HAS MORE THAN 3 NEIGHBORS THAT ARE ON IT TURNS OFF.
6 REM (OVERCROWDING)
7 REM IF A CELL IS OFF AND HAS EXACTLY THREE NEIGHBORS THAT ARE ON, IT
8 REM TURNS ON. (BREEDING)
10 GOSUB 6000 : REM INIT ALL VARS
80 GOSUB 2000
130 DIM GC%(2,GX,GY)
140 GOSUB 900 : REM INITGRID
145 CG=$F2:GOSUB 2210
150 GOSUB 300 : REM DRAWGRID
155 GOSUB 400 : REM UPDATE GRID
160 GOSUB 300 : REM DRAWGRID
165 IF LL = O THEN PRINT:PRINT "NO LIVING CELLS !!! ":PRINT:PRINT:END
170 GOTO 155
199 GOTO 8000
REM INITGRID
200 COLOR 1,0:CLS:COLOR 1,15
202 FOR I=2 TO 6:LOCATE I,2:PRINT " ":NEXT I
204 COLOR 6,15:LOCATE 3,2:PRINT " INITIALIZING";
205 FOR Y = 1 TO GY
208 COLOR 6,15:LOCATE 5,2:PRINT " ROW:";:COLOR 7:PRINT Y;
210 FOR X = 1 TO GX
211 COLOR 6,15
215 LOCATE 5,11:PRINT "COL:";
218 COLOR 7:PRINT X;:COLOR 1
220 GC%(P1,X,Y)= 0
230 J = INT(RND(1)*10)
240 IF J < 2 THEN GC%(P1,X,Y)= 1
250 NEXT X
260 NEXT Y
270 COLOR 1,0:CLS:RETURN
299 REM DRAWGRID
300 IF SK=1 THEN SK=0:RETURN
302 CLS:COLOR 1:LOCATE 29,3:PRINT "DRAWING THE GRID";
305 FOR Y = 1 TO GY
310 FOR X = 1 TO GX
320 IF GC%(P1,X,Y) = 1 THEN CC = C1
330 IF GC%(P1,X,Y) = 0 THEN CC = C2
340 X1 = (X*XS)-XS:Y1=(Y*YS)-YS
345 PSET X1+2,Y1+2,7
350 RECT X1+1,Y1+1,X1+XS-1,Y1+YS-1,CC
360 NEXT X
370 NEXT Y
375 CLS
380 RETURN
400 CLS:LOCATE 3,2:PRINT "UPDATING CORNER CELLS"
405 LL = 0
410 S = GC%(P1,2,1) + GC%(P1,1,2) + GC%(P1,2,2)
430 IF GC%(P1,1,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,1)=1:LL=LL+1
440 IF GC%(P1,1,1) = 1 AND S<2 THEN GC%(P2,1,1)=0
450 IF GC%(P1,1,1) = 0 AND S=3 THEN GC%(P2,1,1)=1:LL=LL+1
460 IF GC%(P1,1,1) = 0 AND S< 3 THEN GC%(P2,1,1)=0
470 S = GC%(P1,GX-1,1) + GC%(P1,GX-1,2) + GC%(P1,GX,2)
480 IF GC%(P1,GX,1) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,1)=1:LL=LL+1
490 IF GC%(P1,GX,1) = 1 AND S<2 THEN GC%(P2,GX,1)=0
500 IF GC%(P1,GX,1) = 0 AND S=3 THEN GC%(P2,GX,1)=1:LL=LL+1
505 IF GC%(P1,GX,1) = 0 AND S< 3 THEN GC%(P2,GX,1)=0
510 S = GC%(P1,2,GY) + GC%(P1,1,GY-1) + GC%(P1,2,GY-1)
515 IF GC%(P1,1,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,1,GY)=1:LL=LL+1
520 IF GC%(P1,1,GY) = 1 AND S<2 THEN GC%(P2,1,GY)=0
525 IF GC%(P1,1,GY) = 0 AND S=3 THEN GC%(P2,1,GY)=1:LL=LL+1
530 IF GC%(P1,1,GY) = 0 AND S< 3 THEN GC%(P2,1,GY)=0
535 S = GC%(P1,GX-1,GY) + GC%(P1,GX-1,GY-1) + GC%(P1,GX,GY-1)
540 IF GC%(P1,GX,GY) = 1 AND S=2 OR S= 3 THEN GC%(P2,GX,GY)=1:LL=LL+1
550 IF GC%(P1,GX,GY) = 1 AND S<2 THEN GC%(P2,GX,GY)=0
555 IF GC%(P1,GX,GY) = 0 AND S=3 THEN GC%(P2,GX,GY)=1:LL=LL+1
560 IF GC%(P1,GX,GY) = 0 AND S<3 THEN GC%(P2,GX,GY)=0
565 CLS:LOCATE 3,2:PRINT "UPDATING OUTSIDE COLUMNS."
566 COLOR 1
568 LOCATE 9,4:PRINT "# LIVING CELLS:";
569 COLOR 7:PRINT LL:COLOR 1
570 X = 1
575 FOR Y = 2 TO GY - 1
580 S = GC%(P1,X,Y-1) + GC%(P1,X+1,Y-1)+GC%(P1,X+1,Y)
585 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
590 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 620
595 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 620
600 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 620
610 IF GC%(P1,X,Y) = 0 AND S=2 THEN GC%(P2,X,Y)=0
615 IF S>3 THEN GC%(P2,X,Y)=0
620 NEXT Y
625 X = GX
630 FOR Y = 2 TO GY - 1
635 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X-1,Y)
640 S = S + GC%(P1,X-1,Y+1) + GC%(P1,X,Y+1)
645 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 670
650 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 670
655 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 670
660 IF GC%(P1,X,Y) = 0 AND S=2 THEN GC%(P2,X,Y)=0
665 IF S>3 THEN GC%(P2,X,Y)=0
670 NEXT Y
685 CLS:LOCATE 3,2:PRINT "UPDATING TOP AND BOTTOM ROW.":COLOR 1
690 LOCATE 9,4:PRINT "# LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
695 Y = 1
700 FOR X = 2 TO GX - 1
705 S = GC%(P1,X-1,Y) + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)
710 S = S + GC%(P1,X,Y+1) + GC%(P1,X+1,Y+1)
715 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
720 IF S<2 THEN GC%(P2,X,Y)=0
725 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
730 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
735 IF S>3 THEN GC%(P2,X,Y)=0
740 NEXT X
742 LOCATE 9,4:PRINT "# LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
745 Y = GY
750 FOR X = 2 TO GX - 1
755 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)
760 S = S + GC%(P1,X-1,Y) + GC%(P1,X+1,Y)
765 IF GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
770 IF S<2 THEN GC%(P2,X,Y)=0
775 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
780 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
785 IF S>3 THEN GC%(P2,X,Y)=0
790 NEXT X
795 CLS:LOCATE 3,2:PRINT "BORDER IS DONE"
796 LOCATE 4,2 :PRINT "UPDATING CORE GRID"
800 LOCATE 9,4:PRINT "# LIVING CELLS:";:COLOR 7:PRINT LL;:COLOR 1
810 FOR Y = 2 TO GY-1
811 LOCATE 8,6:PRINT "UPDATING ROW:";:COLOR 7:PRINT Y:COLOR 1
815 FOR X = 2 TO GX - 1
820 S = GC%(P1,X-1,Y-1) + GC%(P1,X,Y-1)+GC%(P1,X+1,Y-1)+GC%(P1,X-1,Y)
830 S = S + GC%(P1,X+1,Y)+GC%(P1,X-1,Y+1)+GC%(P1,X,Y+1)+GC%(P1,X+1,Y+1)
835 IF S<2 THEN GC%(P2,X,Y)=0:GOTO 860
840 IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
845 IF S>3 THEN GC%(P2,X,Y)=0:GOTO 860
850 IF GC%(P1,X,Y) = 1 AND S=2 THEN GC%(P2,X,Y)=1:LL=LL+1:GOTO 860
855 IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
860 NEXT X
865
866 LOCATE 9,4:PRINT "# LIVING CELLS:";:COLOR 7:PRINT LL:COLOR 1
870 NEXT Y
875 P3 = P1
880 P1 = P2
885 P2 = P3
890 CLS:RETURN
900 GOSUB 2500:REM GRAPHICS CLS
905 COLOR 7,0:CLS:S=1
910 LOCATE 2,2:PRINT "1.";:COLOR 5:PRINT " RANDOM FILL OF CELLS";:COLOR 7
915 LOCATE 4,2:PRINT "2.";:COLOR 5:PRINT " USER SELECTION";:COLOR 7
916 LOCATE 7,2:PRINT "<";:COLOR 5: PRINT "ARROWS TO CHOOSE";:COLOR 7:PRINT ">";
917 LOCATE 9,2:COLOR 7:PRINT "<";:COLOR 5:PRINT "ENTER TO PROCEED";:COLOR 7
918 PRINT ">";
920 X = 4:GOTO 922
921 FRAME X,Y,X+200,Y + 11,$10
922 IF S=3 THEN S=1:IF S=0 THEN S=2
925 IF S = 2 THEN Y = 21
930 IF S = 1 THEN Y = 6
935 FRAME X,Y,X+200,Y + 11,1
940 GET K$:IF K$="" THEN 940
950 K = ASC(K$)
960 IF K=49 THEN S = 1:GOTO 921
970 IF K=50 THEN S = 2:GOTO 921
980 IF K=157 OR K=17 THEN S = S + 1:GOTO 921
990 IF K=145 OR K=29 THEN S = S - 1:GOTO 921
1000 IF K=27 THEN END
1005 IF K=13 THEN GOTO 1020
1010 GOTO 940
1020 FRAME X,Y,X+200,Y + 11,$10
1025 IF S = 1 THEN:GOSUB 200:RETURN
1030 GOSUB 4000
1040 GOSUB 1800:RETURN
1800 CLS:COLOR 7
1805 LOCATE 9,4:PRINT "MAKING ALL THE CELLS DEAD";
1810 FOR Y = 1 TO GY
1820 FOR X = 1 TO GX
1821 LOCATE 12,4:PRINT "KILLING : ";
1822 COLOR 5:LOCATE 12,15:PRINT "Y:";Y;" X:";X;:COLOR 7
1825 GC%(P1,X,Y) = 0
1830 NEXT X
1840 NEXT Y
1850 LOCATE 14,4:PRINT "DONE WITH KILLING"
1851 GET X$:IF X$<>"" THEN 1851 : REM FLUSH ALL KEYBOARD INPUT
1855 SLEEP 30:CLS
1860 GOSUB 2200:MOUSE 1
1865 X=1:Y=1
1866 GOSUB 1985
1870 FRAME X1+1,Y1+1,X1+XS-1,Y1+YS-1,7
1875 GET I$
1880 IF I$<> "" THEN I = ASC(I$):GOTO 1900
1885 I=0
1886 REM CHECK FOR LEFT MOUSE BUTTON
1887 IF MB=1 THEN GOSUB 1985:XI=MX:YI=MY:GOTO 1945
1900 IF I=8 OR I=63 THEN GOSUB 4000
1901 IF I=0 THEN 1875
1903 IF I<>32 THEN 1915
1905 IF GC%(1,X,Y)=0 THEN GC%(1,X,Y)=1:GOTO 1866
1910 GC%(1,X,Y)=0:GOTO 1866
1915 IF I=145 THEN GOSUB 1985:Y=Y-1:IF Y<1 THEN Y=GY
1916 IF I=145 THEN 1866
1920 IF I=157 THEN GOSUB 1985:X=X-1:IF X<1 THEN X=GX
1921 IF I=157 THEN 1866
1925 IF I=29 THEN GOSUB 1985:X=X+1:IF X>GX THEN X=1
1926 IF I=29 THEN 1866
1930 IF I=17 THEN GOSUB 1985:Y=Y+1:IF Y>GY THEN Y=1
1931 IF I=17 THEN 1866
1935 IF I=13 THEN :GOSUB 1985:SK=1:MOUSE 0:RETURN
1936 REM CHECK FOR LEFT MOUSE BUTTON AGAIN
1937 IF MB=1 THEN GOSUB 1985:XI=MX:YI=MY:GOTO 1945
1940 GOTO 1875
1944 REM MOUSE UPDATING ROUTINE HERE
1945 X = INT(XI/XS)+1 : Y = INT(YI/YS) + 1
1950 IF GC%(1,X,Y) = 0 THEN GC%(1,X,Y) = 1:GOTO 1960
1955 GC%(1,X,Y) = 0
1960 GOSUB 1985: FRAME X1+1,Y1+1,X1+XS-1,Y1+YS-1, 7
1965 IF MB <> 0 THEN 1965 : REM WAIT FOR MOUSE RELEASE
1970 GOTO 1940
1985 X1 = (X*XS)-XS:Y1=(Y*YS)-XS
1986 IF GC%(1,X,Y)=1 THEN RECT X1+1,Y1+1,X1+XS-1,Y1+YS-1,C1:RETURN
1987 RECT X1+1,Y1+1,X1+XS-1,Y1+YS-1,C2
1990 RETURN
2000 IX = 3:COLOR 1,0:CLS
2020 IF IX > 5 THEN IX = 1
2025 IF IX < 1 THEN IX = 5
2030 IF IX = 5 THEN GX = 80:GY=60
2035 IF IX = 4 THEN GX = 64:GY=48
2040 IF IX = 3 THEN GX = 32:GY=24
2045 IF IX = 2 THEN GX = 16:GY=12
2050 IF IX = 1 THEN GX = 8:GY = 6
2055 XS = 320/GX:YS=240/GY
2060 GOSUB 2200
2100 COLOR 1,11
2102 LOCATE 2,2:PRINT " ";
2105 LOCATE 3,2:PRINT " ";
2110 LOCATE 4,2:PRINT " ";
2115 LOCATE 5,2:PRINT " ";
2120 LOCATE 6,2:PRINT " ";
2135 LOCATE 3,3:PRINT "CHANGE GRID DENSITY";:COLOR 7:PRINT " <ARROW KEYS>"
2140 COLOR 1:LOCATE 4,3:PRINT "CURRENT: ";
2142 COLOR 7:PRINT GX;:COLOR 1:PRINT " X ";:COLOR 7:PRINT GY;
2145 COLOR 7:LOCATE 6,3:PRINT "<";:COLOR 1:PRINT "ENTER TO CHOOSE";:COLOR 7
2146 PRINT ">";
2150 GET K$
2155 K = ASC(K$)
2160 IF K=157 OR K=17 THEN IX = IX + 1:GOTO 2020
2165 IF K=145 OR K=29 THEN IX = IX - 1:GOTO 2020
2170 IF K=13 THEN COLOR 1,0:CLS:RETURN
2175 IF K=27 THEN SCREEN 0:PRINT:END
2180 GOTO 2150
2200 GOSUB 2500
2210 FOR X = XS TO 320-XS STEP XS
2220 LINE X,0,X,239,CG
2230 NEXT X
2240 FOR Y = YS TO 240-YS STEP YS
2250 LINE 0,Y,319,Y,CG
2260 NEXT Y
2270 RETURN
2499 REM GRAPHICS CLEAR SCREEN
2500 RECT 0,0,XLIMIT,YLIMIT,$10
2510 RETURN
4000 COLOR 6,15
4010 FOR J = 2 TO 18
4015 LOCATE J,1
4016 PRINT " ";
4020 NEXT J
4035 LOCATE 3,1:PRINT " CELL SELECTION SCREEN IS MOSTLY BLANK !";
4040 LOCATE 5,1:PRINT " SELECT YOUR CELL WITH THE";:COLOR 7:PRINT" ARROW KEYS";
4045 COLOR 6:LOCATE 7,1:PRINT " TOGGLE ITS LIFE STATE WITH";:COLOR 7
4050 PRINT " SPACE BAR";
4055 COLOR 6:LOCATE 8,1 :PRINT " OR CLICK USING ";:COLOR 7:PRINT "THE MOUSE ";
4056 COLOR 6:PRINT "ON EACH CELL";
4057 COLOR 7:LOCATE 10,1:PRINT " CTRL/H";:COLOR 6:PRINT " OR ";:COLOR 7
4058 PRINT "?";:COLOR 6:PRINT " SHOWS THIS SCREEN";
4060 COLOR 7:LOCATE 14,1:PRINT " ENTER ";:COLOR 6
4065 PRINT "PROCEEDS WITH '";:COLOR 2:PRINT "THE GAME OF LIFE";:COLOR 6
4066 PRINT "'";:LOCATE 12,1:COLOR 7
4070 PRINT " ESC";:COLOR 6:PRINT" ABORTS PROGRAM";
4075 LOCATE 17,10:COLOR 6:PRINT "<";:COLOR 7:PRINT "ANY KEY TO CONTINUE";
4080 COLOR 6:PRINT ">";
4085 GOSUB 8000:COLOR 1,0:CLS:RETURN
6000 REM INIT ALL STATIC VARS
6010 XLIMIT=319:YLIMIT=239
6020 P1=1:P2=2:SK=0
6030 C1=$05:C2=$10:CG=15
6040 X=RND(-TI)
6050 SCREEN $80
6060 VPOKE 1,$FA0C,0 : REM CHANGE COLOR 6 TO BLACK
6070 VPOKE 1,$FA0D,0 : REM SO I CAN HAVE NON-TRANSPARENT BLACK TEXT
6100 RETURN
8000 GET X$:IF X$<>"" THEN GOTO 8000 : REM FLUSH KEYBOARD BUFFER
8010 GET X$:IF X$="" THEN GOTO 8010 : REM WAIT FOR KEY
8015 IF ASC(X$)=27 THEN SCREEN 0:END
8020 RETURN