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