10 REM THE OLD HIGH SCHOOL BOX GAME
20 REM 
30 REM     COPYRIGHT 1981 BY HAWKEYE GRAFIX
40 REM                       23914 MOBILE
50 REM                       CANOGA PARK, CA. 91307
60 REM 
70 REM ARRAY MX IS THE P0INTERS
80 REM MX(X,0)=VPRINT ADDRESS
90 REM MX(X,1)=X COORDINATE FOR PLOT/DRAW
100 REM MX(X,2)=Y COORDINATE FOR PLOT/DRAW
110 REM ARRAY SD IS SIDES DEFINED, BROKEN INTO TWO FUNCTIONS
120 REM LOWER THREE BITS ARE NUMBER OF SIDES DEFINED
130 REM BIT 3 (8) IS UPPER SIDE
140 REM BIT 4 (16) IS RIGHT SIDE
150 REM BIT 5 (32) IS LOWER SIDE
160 REM BIT 6 (64) IS LEFT SIDE
170 REM ARRAY ST IS A TEMPORARY COPY OF SD FOR EVALUATIONS
180 CLEAR 1500
190 FAST 
200 VA=PEEK(&105)+256*PEEK(&106)
210 POKE VA+&7FF,12
220 LL=PEEK(&107)
230 NL=PEEK(&108)
240 PL=(NL-1)*LL
250 SCROLL 0,NL
260 FILL 32
270 CL=INT((LL-1)/4)-1
280 RW=INT((NL-1)/2)-1
290 SV(0)=8:SV(1)=16:SV(2)=32:SV(3)=64
300 REM OFFER A SMALLER SIZE IF THE PLAYER DESIRES
310 VPRINT 3*LL+6,"FOR THIS VIDEO DISPLAY, THE MAXIMUM NUMBER OF ROWS IS";RW
320 VPRINT 5*LL+6,"AND THE MAXIMUN MUMBER OF COLUMNS IS";CL
330 VPRINT 7*LL+6,"IF YOU WOULD LIKE A SMALLER BOARD, INPUT THE DESIRED SIZE"
340 VINPUT 9*LL+6,"IN ROW, COLUMN FORMAT:";,R2,C2
350 IF R2>1 AND R2<=RW THEN RW=R2-1
360 IF C2>1 AND C2<=CL THEN CL=C2-1
370 FILL 32
380 VINPUT 3*LL+6,"WHAT ARE YOUR INITIALS";PL$
390 PL$=LEFT$(PL$,3)
400 A$="N"
410 IF FI=0 THEN VINPUT 5*LL+6,"WOULD YOU LIKE INSTRUCTIONS (Y/N)"; LINE A$
420 A$=LEFT$(A$,1)
430 IF A$="Y" THEN GOSUB 13000
440 HY=RW*6-1:AY=(NL-1)*3-HY
450 CT=(RW+1)*(CL+1)-1
460 DIM MX(CT,2),SD(CT),ST(CT),US(CT)
470 R=0:C=0
480 FOR I=0 TO CT
490 MX(I,0)=(R*2+1)*LL+C*4+1
500 MX(I,1)=C*8:MX(I,2)=(RW-R)*6+AY
510 SD(I)=0
520 C=C+1
530 IF C>CL THEN R=R+1:C=0
540 NEXT I
550 IF A$="Y" THEN VINPUT -1,"PRESS 'RETURN' TO START THE GAME";, LINE AA$
560 FILL 32
570 FOR I=0 TO CT
580 VPRINT MX(I,0)-1,I
590 PLOT MX(I,1),MX(I,2),1
600 NEXT I
610 FOR I=CL TO CT STEP CL+1
620 PLOT MX(I,1)+8,MX(I,2),1
630 NEXT I
640 FOR I=RW*CL+1 TO CT STEP 1
650 PLOT MX(I,1),MX(I,2)-6,1
660 NEXT I
670 PLOT MX(CT,1)+8,MX(CT,2)-6,1
680 LV=0:BC=0:BP=0
690 VPRINT PL,SPC(LL)
700 VINPUT PL,"WOULD YOU LIKE TO GO FIRST (Y/N)"; LINE A$
710 IF LEFT$(A$,1)="Y" THEN MV=1 ELSE MV=-1
1000 REM MOVE BY MOVE ROUTINE STARTS HERE
1010 MV=MV*-1
1020 U=0:D=0:L=0:R=0
1030 GOSUB 5000
1040 GOSUB 6000
1050 IF D(4)=CT+1 THEN 1170
1060 IF D(3)=0 THEN 1230
1070 Q=SQ
1080 IF (ST(Q) AND 7)=3 THEN 1150
1090 IF Q=0 THEN 1100 ELSE IF (ST(Q-1) AND 7)=3 THEN Q=Q-1:GOTO 1150
1100 IF Q=CT THEN 1110 ELSE IF (ST(Q+1) AND 7)=3 THEN Q=Q+1:GOTO 1150
1110 IF Q<=CL THEN 1120 ELSE IF (ST(Q-CL-1) AND 7)=3 THEN Q=Q-CL-1:GOTO 1150
1120 IF Q>=(CT-CL) THEN 1130 ELSE IF (ST(Q+CL+1) AND 7)=3 THEN Q=Q+CL+1:GOTO 1150
1130 FOR Q=0 TO CT
1140 IF (SD(Q) AND 7)<>3 THEN NEXT Q
1150 GOSUB 7000
1160 GOTO 3250
1170 VPRINT PL,SPC(LL)
1180 VPRINT PL+LL-30,"Box=";BC,PL$;"=";BP
1190 IF BC>BP THEN VPRINT PL,"YOU SEEM TO HAVE LOST THE GAME."
1200 IF BP>BC THEN VPRINT PL,"CONGRATULATIONS, YOU HAVE WON."
1210 IF BC=BP THEN VPRINT PL,"WE HAVE PLAYED TO A DRAW."
1220 END 
1230 IF MV=-1 THEN 2010 ELSE 3010
2000 REM PLAYER MOVE IS ENTERED, VERIFIED, AND MADE HERE
2010 VPRINT PL,SPC(LL)
2020 VPRINT PL+LL-30,"Box=";BC,PL$;"=";BP
2030 VINPUT PL,"WHAT SQUARE AND SIDE";SQ,SD$
2040 IF SQ>CT THEN 2010
2050 IF SD$="U" THEN 2100
2060 IF SD$="D" THEN 2110
2070 IF SD$="L" THEN 2120
2080 IF SD$="R" THEN 2130
2090 GOTO 2010
2100 U=8:X1=1:Y1=0:X2=7:Y2=0:GOTO 2140
2110 D=32:X1=1:Y1=-6:X2=7:Y2=-6:GOTO 2140
2120 L=64:X1=0:Y1=-1:X2=0:Y2=-5:GOTO 2140
2130 R=16:X1=8:Y1=-1:X2=8:Y2=-5
2140 IF PIXEL(MX(SQ,1)+X1,MX(SQ,2)+Y1)=1 THEN 2010
2150 GOTO 4010
3000 REM COMPUTER MOVE IS DETERMINED HERE
3010 VPRINT PL,SPC(LL)
3020 VPRINT PL+LL-30,"Box=";BC,PL$;"=";BP
3030 GOSUB 5000
3040 GOSUB 6000
3050 GOSUB 10000
3060 IF D(3)=0 THEN 3110
3070 FOR Q=0 TO CT
3080 IF (SD(Q) AND 7)<>3 THEN NEXT Q
3090 GOSUB 7000
3100 GOTO 3250
3110 IF D(0)=0 THEN 3260
3120 IF D(0)<CT/10 THEN 3210
3130 ST=INT(RND(1)*CT)
3140 FOR Q=ST TO CT
3150 IF (ST(Q) AND 7)=0 THEN GOSUB 12000:IF OS<>0 THEN 3250
3160 NEXT Q
3170 FOR Q=ST TO 0 STEP -1
3180 IF (ST(Q) AND 7)=0 THEN GOSUB 12000:IF OS<>0 THEN 3250
3190 NEXT Q
3200 GOTO 3260
3210 FOR Q=0 TO CT
3220 IF (ST(Q) AND 7)=0 THEN GOSUB 12000:IF OS<>0 THEN 3250
3230 NEXT Q
3240 GOTO 3260
3250 SQ=Q:ON OS/8 GOTO 2100,2130,2130,2110,2110,2110,2110,2120
3260 IF D(1)=0 THEN 3360
3270 FOR Q=0 TO CT
3280 IF (SD(Q) AND 7)>1 THEN 3350
3290 GOSUB 7000
3300 GOSUB 8000
3310 IF D(3)=0 THEN 3250
3320 GOSUB 5000
3330 GOSUB 11000
3340 IF OS<128 THEN GOSUB 7040:IF OS<128 THEN 3300
3350 NEXT Q
3360 REM NOW WE MUST GIVE UP ONE OR MORE BOXES, SO GIVE AS FEW AS WE CAN
3370 LC=CT+1
3380 FOR I=0 TO CT:US(I)=0:NEXT I
3390 FOR TB=0 TO CT
3400 IF (SD(TB) AND 7)=4 THEN 3580
3410 IF US(TB)=1 THEN 3580
3420 GOSUB 5000
3430 GOSUB 11000
3440 Q=TB:GOSUB 7000:TS=OS
3450 GOSUB 8000
3460 VPRINT PL,"EVALUATING BOX";TB
3470 GOSUB 9000
3480 IF CH<LC THEN LB=TB:LS=TS:LC=CH:IF CH=1 THEN 3590
3490 IF (ST(TB) AND 7)=4 THEN 3550
3500 GOSUB 5000
3510 GOSUB 11000
3520 Q=TB:OS=TS:GOSUB 7040
3530 IF OS>64 THEN 3550
3540 TS=OS:GOTO 3450
3550 FOR I=TB+1 TO CT
3560 IF I>CT THEN 3590
3570 IF (ST(I) AND 7)=4 THEN NEXT I ELSE TB=I:GOTO 3410
3580 NEXT TB
3590 Q=LB:OS=LS:GOTO 3250
4000 REM FINISH MOVE LOGIC
4010 IF MV=1 THEN SLOW 100
4020 FOR I=0 TO 3
4030 DRAW MX(SQ,1)+X1,MX(SQ,2)+Y1,MX(SQ,1)+X2,MX(SQ,2)+Y2,0
4040 DRAW MX(SQ,1)+X1,MX(SQ,2)+Y1,MX(SQ,1)+X2,MX(SQ,2)+Y2,1
4050 NEXT I
4060 SLOW 0
4070 MC=SQ-(INT(SQ/(CL+1))*(CL+1))
4080 MR=INT(SQ/(CL+1))
4090 SO=-1:BX=0
4100 S=U+D+L+R
4110 SD(SQ)=SD(SQ)+S+1
4120 IF U THEN 4240
4130 IF D THEN 4210
4140 IF R THEN 4180
4150 IF MC=0 THEN 4260
4160 SO=SQ-1
4170 GOTO 4260
4180 IF MC=CL THEN 4260
4190 SO=SQ+1
4200 GOTO 4260
4210 IF MR=RW THEN 4260
4220 SO=SQ+CL+1
4230 GOTO 4260
4240 IF MR=0 THEN 4260
4250 SO=SQ-CL-1
4260 IF S>16 THEN S=S/4 ELSE S=S*4
4270 IF (SD(SQ) AND 7)<>4 THEN 4330
4280 IF MV=1 THEN VPRINT MX(SQ,0),"   " ELSE VPRINT MX(SQ,0),PL$
4290 IF MV=1 THEN BC=BC+1 ELSE BP=BP+1
4300 IF MV=1 THEN DRAW MX(SQ,1),MX(SQ,2),MX(SQ,1)+8,MX(SQ,2)-6,1
4310 IF MV=1 THEN DRAW MX(SQ,1),MX(SQ,2)-6,MX(SQ,1)+8,MX(SQ,2),1
4320 BX=1
4330 IF SO=-1 THEN 4410
4340 SD(SO)=SD(SO)+S+1
4350 IF (SD(SO) AND 7)<>4 THEN 4410
4360 IF MV=1 THEN VPRINT MX(SO,0),"   " ELSE VPRINT MX(SO,0),PL$
4370 IF MV=1 THEN BC=BC+1 ELSE BP=BP+1
4380 IF MV=1 THEN DRAW MX(SO,1),MX(SO,2),MX(SO,1)+8,MX(SO,2)-6,1
4390 IF MV=1 THEN DRAW MX(SO,1),MX(SO,2)-6,MX(SO,1)+8,MX(SO,2),1
4400 BX=1
4410 IF BX=1 THEN 1020 ELSE 1010
5000 REM COPY ARRAY SD INTO ARRAY ST VIA A FAST MOVE
5010 AF=VARPTR(SD(0))
5020 AT=VARPTR(ST(0))
5030 MOVE AF,AT,CT*4+4
5040 RETURN 
6000 REM COUNT DISTRIBUTION OF SQUARE SIDES
6010 FOR I=0 TO 4:D(I)=0:NEXT I
6020 FOR I=0 TO CT:D(ST(I) AND 7)=D(ST(I) AND 7)+1:NEXT I
6030 RETURN 
7000 REM FIND OPEN SIDE (OS) ON SQUARE Q
7010 IF (ST(Q) AND 7)=4 THEN OS=0:RETURN 
7020 OS=8
7030 IF ((ST(Q) AND OS)=0) THEN RETURN 
7040 OS=OS*2:GOTO 7030
8000 REM MAKE MOVE OS ON SQUARE Q AND NEIGHBOR; UPDATE DISTRIBUTION ARRAY D
8010 IF (ST(Q) AND 7)=4 THEN RETURN 
8020 T=ST(Q) AND 7
8030 D(T)=D(T)-1
8040 D(T+1)=D(T+1)+1
8050 T=0
8060 MC=Q-INT(Q/(CL+1))*(CL+1)
8070 MR=INT(Q/(CL+1))
8080 ST(Q)=ST(Q)+OS+1
8090 ON OS/8 GOTO 8100,8120,8120,8140,8140,8140,8140,8160
8100 IF MR=0 THEN RETURN 
8110 SO=Q-CL-1:A1=33:GOTO 8180
8120 IF MC=CL THEN RETURN 
8130 SO=Q+1:A1=65:GOTO 8180
8140 IF MR=RW THEN RETURN 
8150 SO=Q+CL+1:A1=9:GOTO 8180
8160 IF MC=0 THEN RETURN 
8170 SO=Q-1:A1=17
8180 T=ST(SO) AND 7
8190 D(T)=D(T)-1
8200 ST(SO)=ST(SO)+A1
8210 D(T+1)=D(T+1)+1
8220 RETURN 
9000 REM COUNT BOXES IN CHAIN
9010 CH=D(4)
9020 IF D(3)=0 THEN CH=D(4)-CH:RETURN 
9030 IF Q=0 THEN 9040 ELSE IF (ST(Q-1) AND 7)=3 THEN Q=Q-1:GOTO 9090
9040 IF Q=CT THEN 9050 ELSE IF (ST(Q+1) AND 7)=3 THEN Q=Q+1:GOTO 9090
9050 IF Q<=CL THEN 9060 ELSE IF (ST(Q-CL-1) AND 7)=3 THEN Q=Q-CL-1:GOTO 9090
9060 IF Q>=(CT-CL) THEN 9070 ELSE IF (ST(Q+CL+1) AND 7)=3 THEN Q=Q+CL+1:GOTO 9090
9070 FOR Q=0 TO CT
9080 IF (ST(Q) AND 7)<>3 THEN NEXT Q
9090 GOSUB 7000
9100 GOSUB 8000
9110 US(Q)=1
9120 IF T=3 THEN US(SO)=1
9130 GOTO 9020
10000 REM SAVE COUNTER D IN D1
10010 FOR I=0 TO 4:D1(I)=D(I):NEXT 
10020 RETURN 
11000 REM RESTORE D FROM D1
11010 FOR I=0 TO 4:D(I)=D1(I):NEXT 
11020 RETURN 
12000 REM TEST SIDES ON OPEN SQUARE Q FOR BAD MOVES
12010 FOR II=0 TO 2
12020 EXCHANGE SV(II),SV(II+1)
12030 NEXT II
12040 FOR II=0 TO 3
12050 OS=SV(II):GOSUB 8000
12060 IF D(3)=0 THEN RETURN 
12070 GOSUB 5000
12080 GOSUB 11000
12090 NEXT II
12100 OS=0
12110 RETURN 
13000 FILL 32
13010 FI=1
13020 VPRINT -1,""
13030 VPRINT -1,"This is the age old game of Box. The idea of the"
13040 VPRINT -1,"game is to be the player to put the fourth side"
13050 VPRINT -1,"on a single cell box. If you are the player to put"
13060 VPRINT -1,"that last side on, you get one point for that box, and"
13070 VPRINT -1,"another turn. If you should make a move that"
13080 VPRINT -1,"completes two boxes, you still only get one more turn."
13090 VPRINT -1,"If that additional turn completes another box, you"
13100 VPRINT -1,"get another turn, and so on, until either there"
13110 VPRINT -1,"are no more boxes or you cannot complete a box."
13120 VPRINT -1,"If there is a way to complete a box, you"
13130 VPRINT -1,"must do it, so it is done automatically."
13140 VPRINT -1,""
13150 VPRINT -1,"Each box has a number inside it. To indicate which"
13160 VPRINT -1,"side you want to draw, key the box number,"
13170 VPRINT -1,"a comma, and the letter U,D,L,or R to indicate"
13180 VPRINT -1,"Up side, Down side, Left side, or Right side."
13190 VPRINT -1,"If your move is not understood, it will be ignored,"
13200 VPRINT -1,"and you can enter it again. The current score is"
13210 VPRINT -1,"always in the lower right corner. When the program"
13220 VPRINT -1,"finds it must give up a box on its turn, it will"
13230 VPRINT -1,"go into a lengthy evaluation. The current box number"
13240 VPRINT -1,"being evaluated is displayed on the lower left."
13250 RETURN 
13260 GOTO 1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,13000