CONWAYS GAME OF LIFE

All aspects of programming on the Commander X16.
User avatar
ahenry3068
Posts: 1194
Joined: Tue Apr 04, 2023 9:57 pm

CONWAYS GAME OF LIFE

Post by ahenry3068 »

I didn't plan on posting this until it was Done.
But I have some really weird bugs.. Sometimes it works
and sometimes it seems to work but the Graphics don't display.

I'm loath to point to a Bug in the Emulator or the Underlying BASIC code.
but it seems to be pointing in that direction..

There is no "Game of Life Code" yet besides setting up the variables. I first ran into this
Bug when I set up the code to choose the Grid Size. It sometimes runs correctly
and other times runs without doing any Graphics Output :( :(...

I made two changes before this behaviour started. First I made the GRID dimensions
an INT GX%, GY%......... This was for memory usage. When they were the
default float I got an out of Memory Error on the more dense grid sizes (Multi dimensional array)

But I also wrote the Grid Selection Code before I ever posted anything into the Emulator.

This is the code..

Code: Select all


 10 SCREEN $80 
 80 GOSUB 700
 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 GOTO 8000
 


REM INITGRID
200 CLS:COLOR 5:LOCATE 2,2:PRINT "INITIALIZING"
205 FOR X = 1 TO  GX
210   FOR Y = 1 TO GY
215       LOCATE 3,3:PRINT "X:";X,"Y:";Y
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
265 LOCATE 3,3:PRINT "                        ";
270 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
360    NEXT X
370 NEXT Y
380 RETURN

400 LOCATE 2,2:PRINT "UPDATING CELLS         "

410 FOR Y = 1 TO GY
420     FOR X = 1 TO GX
430         T = 0: REM CELL SCORE TALLY
440         REM CODE TO TALL CELL SCORE HERE. 
500     NEXT X
510 NEXT Y 
600 RETURN



700 IX = 5
720 IF IX > 5 THEN IX = 1
725 IF IX < 1 THEN IX = 5
740 IF IX = 5 THEN GX = 80:GY=60
750 IF IX = 4 THEN GX = 64:GY=48
755 IF IX = 3 THEN GX = 32:GY=24
760 IF IX = 2 THEN GX = 16:GY=12
765 IF IX = 1 THEN GX = 8:GY = 6 
770 XS = 320/GX:YS=240/GY
780 RECT 0,0,319,239,$10
790 FRAME 0,0,319,239, $01
800 FOR X = XS TO 320-XS STEP XS
810   LINE X,0,X,239,$01
820 NEXT X 
830 FOR Y = YS TO 240-YS STEP YS
840   LINE 0,Y,319,Y,$01
850 NEXT Y
855 COLOR 7,11
860 LOCATE 3,3:PRINT "                                ";
861 LOCATE 4,3:PRINT "                                ";
865 LOCATE 5,3:PRINT "                                ";      
866 LOCATE 6,3:PRINT "                                ";              
870 LOCATE 6,3:PRINT "  SELECT GRID: (ARROW KEYS)";
875 COLOR 5:LOCATE 4,4:PRINT GX;" X ";GY;
876 COLOR 10:PRINT " <ENTER TO CHOOSE>";

900 GET K$
910 K = ASC(K$)
920 IF K=157 OR K=17 THEN IX = IX + 1:GOTO 720
930 IF K=145 OR K=29 THEN IX = IX - 1:GOTO 720
940 IF K=13 THEN CLS:RETURN 
950 IF K=27 THEN END
960 COLOR 7,11:GOTO 870

8000 GET X$:IF X$<>"" THEN GOTO 150 : REM FLUSH KEYBOARD BUFFER
8010 GET X$:IF X$="" THEN GOTO 8010 : REM WAIT FOR KEY 
8020 SCREEN 0:END


Last edited by ahenry3068 on Wed Jun 14, 2023 12:23 am, edited 2 times in total.
User avatar
ahenry3068
Posts: 1194
Joined: Tue Apr 04, 2023 9:57 pm

Re: CONWAYS GAME OF LIFE... Weird BUGS.

Post by ahenry3068 »

I'm freezing this version of the code until I might get a reply. If I play around a little
more it will be on a copy of this code..............
User avatar
ahenry3068
Posts: 1194
Joined: Tue Apr 04, 2023 9:57 pm

Re: CONWAYS GAME OF LIFE... Weird BUGS.

Post by ahenry3068 »

BTW........ I have not abandoned HangMan.......lol

I often get off on a Tangent. and when I saw some other recent postings here
Conway's Game of Life seemed like a cool exercise... Its actually brand new
for me...... I knew of it a long time ago but this is the first time I've made an attempt
at implementing it.
DragWx
Posts: 362
Joined: Tue Mar 07, 2023 9:07 pm

Re: CONWAYS GAME OF LIFE... Weird BUGS.

Post by DragWx »

The display problem is actually really simple but probably a gotcha if you're not expecting it:
CLS fills the text layer with blank characters, but with the current text color setting, including whatever the text background color is, including if that background color isn't the transparent one. :P

When you drop back to BASIC, do "color 1,0" then "cls" and you'll see the graphics were indeed drawn. :D
User avatar
ahenry3068
Posts: 1194
Joined: Tue Apr 04, 2023 9:57 pm

Re: CONWAYS GAME OF LIFE... Weird BUGS.

Post by ahenry3068 »

Thank you. I didn't realize that..

Code such as it is works now.. :)

NOTE: THIS IS NOT COMPLETE BUT IT DOES LET YOU CHOOSE A GRID SIZE
AND DOES THE INITIAL SCREEN. I HAVEN'T WROTE THE "LIFE" CODE YET.

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 700
 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 GOTO 8000
 


REM INITGRID
200 CLS:COLOR 7:LOCATE 2,2:PRINT "INITIALIZING"
205 FOR X = 1 TO  GX
210   FOR Y = 1 TO GY
215       LOCATE 3,3:PRINT "X:";X,"Y:";Y
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
265 LOCATE 3,3:PRINT "                        ";
270 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
360    NEXT X
370 NEXT Y
380 RETURN

400 LOCATE 2,2:PRINT "UPDATING CELLS         "
410 FOR Y = 1 TO GY
420     FOR X = 1 TO GX
430         T = 0: REM CELL SCORE TALLY
440         REM CODE TO TALL CELL SCORE HERE. 
500     NEXT X
510 NEXT Y 
600 RETURN

700 IX = 5
720 IF IX > 5 THEN IX = 1
725 IF IX < 1 THEN IX = 5
740 IF IX = 5 THEN GX = 80:GY=60
750 IF IX = 4 THEN GX = 64:GY=48
755 IF IX = 3 THEN GX = 32:GY=24
760 IF IX = 2 THEN GX = 16:GY=12
765 IF IX = 1 THEN GX = 8:GY = 6 
770 XS = 320/GX:YS=240/GY
780 RECT 0,0,319,239,$10
790 FRAME 0,0,319,239, $01
800 FOR X = XS TO 320-XS STEP XS
810   LINE X,0,X,239,$01
820 NEXT X 
830 FOR Y = YS TO 240-YS STEP YS
840   LINE 0,Y,319,Y,$01
850 NEXT Y
855 COLOR 7,11
860 LOCATE 3,3:PRINT "                                ";
861 LOCATE 4,3:PRINT "                                ";
865 LOCATE 5,3:PRINT "                                ";      
866 LOCATE 6,3:PRINT "                                ";              
870 LOCATE 6,3:PRINT "  SELECT GRID: (ARROW KEYS)";
875 COLOR 5:LOCATE 4,4:PRINT GX;" X ";GY;
876 COLOR 10:PRINT " <ENTER TO CHOOSE>";

900 GET K$
910 K = ASC(K$)
920 IF K=157 OR K=17 THEN IX = IX + 1:GOTO 720
930 IF K=145 OR K=29 THEN IX = IX - 1:GOTO 720
940 IF K=13 THEN COLOR 1,0:CLS:RETURN 
950 IF K=27 THEN END
960 COLOR 7,11:GOTO 870

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
User avatar
ahenry3068
Posts: 1194
Joined: Tue Apr 04, 2023 9:57 pm

Re: CONWAYS GAME OF LIFE... Weird BUGS.

Post by ahenry3068 »

OK......... Working CONWAY'S LIFE.
Running slow on evalution.... (just a 6502,,,, working it's metaphorical ass cheeks off )
The lower Resolution Grids' are more interesting
than I expected.

Give it a TRY


USER chooses the density of the Grid.
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.

Code: Select all

 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 CLS:COLOR 1,11:LOCATE 2,2:PRINT " INITIALIZING             "
205 FOR X = 1 TO  GX
210   FOR Y = 1 TO GY
215       LOCATE 3,3:PRINT "  X: ";
216       COLOR 7:PRINT X;"      ";:COLOR 1:PRINT "Y: ";
218       COLOR 7:PRINT Y;"     "
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 2,2:PRINT "UPDATING CELLS         "
405 LL = 0 
406 LOCATE 3,2:PRINT "CORNERS                "
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:";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:";LL

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 4,2:PRINT "#LIVING CELLS:";LL

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 GC%(P1,X,Y) = 1 AND S=2 OR S= 3 THEN GC%(P2,X,Y)=1:LL=LL+1
840      IF S<2 THEN GC%(P2,X,Y)=0
845      IF S=3 THEN GC%(P2,X,Y)=1:LL=LL+1
850      IF GC%(P1,X,Y) = 0 AND S< 3 THEN GC%(P2,X,Y)=0
855      IF 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
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 7,11
1105 LOCATE 3,2:PRINT "                                  ";
1110 LOCATE 4,2:PRINT "                                  ";
1115 LOCATE 5,2:PRINT "                                  ";      
1120 LOCATE 6,2:PRINT "                                  ";              
1135 LOCATE 4,3:PRINT "SELECT GRID DENSITY";
1140 COLOR 5:LOCATE 5,3:PRINT "CURRENT: ";GX;" X ";GY;
1145 COLOR 10:LOCATE 6,3:PRINT "<ENTER TO CHOOSE>";

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
Last edited by ahenry3068 on Wed Jun 14, 2023 6:04 am, edited 1 time in total.
kelli217
Posts: 541
Joined: Sun Jul 05, 2020 11:27 pm

Re: CONWAYS GAME OF LIFE

Post by kelli217 »

Can we get it to just run unless the user requests the stats?
User avatar
ahenry3068
Posts: 1194
Joined: Tue Apr 04, 2023 9:57 pm

Re: CONWAYS GAME OF LIFE

Post by ahenry3068 »

Take out the GOSUB 1000 and set GX and GY to what you need them to be.
User avatar
ahenry3068
Posts: 1194
Joined: Tue Apr 04, 2023 9:57 pm

Re: CONWAYS GAME OF LIFE

Post by ahenry3068 »

I'll probably put a prompt at the start of the program to just go.... But
it doesn't take to long to select the cell density.
kelli217
Posts: 541
Joined: Sun Jul 05, 2020 11:27 pm

Re: CONWAYS GAME OF LIFE

Post by kelli217 »

Cool, thanks!
Post Reply