10 CLEAR 100:VA=PEEK(&105)+256*PEEK(&106):POKE VA+&7FF,12 20 DIM B(90),Z(90),X(7),W(80,1),S(2),G(2) 30 DIM N$(2) 40 N$(1)="COMPUTER":N$(2)="HAWKEYE":G=0 50 FILL 32 60 VPRINT 2*80+15,"VOTHELLO FROM HAWKEYE GRAFIX" 70 VPRINT 4*80+20,"COPYRIGHT (C) 1981" 80 VINPUT 10*80+15,"NUMBER OF PLAYERS (0-2) : ";,N:N=INT(N) 90 IF N<0 OR N>2 THEN 80 100 IF N=0 THEN FILL 32:GOTO 150 110 VINPUT 10*80+15,"PLAYER 1, WHAT IS YOUR NAME : ";,N$(1) 120 IF N=1 THEN 140 130 VINPUT 11*80+15,"PLAYER 2, WHAT IS YOUR NAME : ";,N$(2) 140 GOSUB 1440:GOSUB 1420 150 GOSUB 1130 160 FOR P=1 TO 2:VPRINT (4*P+2)*80,MID$(N$(P),1,10):NEXT 170 GOTO 220 180 REM :IF N=0 THEN 225 190 J=17:GOSUB 1030:VINPUT 0,"ANOTHER GAME (Y/N) : ";,A$ 200 IF MID$(A$,1,1)="N" THEN END 210 FILL 32:FOR P=1 TO 2:VPRINT (4*P+2)*80,MID$(N$(P),1,10):NEXT 220 GOSUB 1200:IF N=0 THEN P=G-INT(G/2)*2+1:GOTO 260 230 VPRINT 0,N$(1):VPRINT 80,"MOVES":VINPUT 160,"FIRST (Y/N) ";,A$ 240 J=0:GOSUB 1030 250 P=1:IF MID$(A$,1,1)="N" THEN P=2 260 IF S(P)=0 THEN 480 270 J=4*P+3:FF=J:GOSUB 1030:IF P>N THEN 390 280 VINPUT J*80,"YOUR MOVE : ";,A$ 290 VPRINT J*80+12,A$:FF=J 300 IF MID$(A$,1,1)="Q" THEN 480 310 IF VAL(A$)<>0 THEN 360 320 GOSUB 560:IF Z<>-100 THEN 350 330 P=3-P:GOSUB 560:IF Z>-100 THEN 260 340 J=17:GOSUB 1030:VPRINT 17*80,"NO MOVES":VPRINT 18*80," POSSIBLE":GOTO 490 350 VPRINT 17*80,"BAD MOVE":FOR I=1 TO 400:NEXT :GOTO 270 360 I=INT(VAL(A$)):IF I<1 OR I>64 THEN 350 370 I=I+INT((I-1)/8)+9:IF B(I) THEN 350 380 GOTO 420 390 GOSUB 560:IF Z>-100 THEN VPRINT FF*80,"MY MOVE IS";I-8-INT(I/9):GOTO 420 400 VPRINT FF*80,"I CAN'T MOVE":P=3-P:GOSUB 560:IF Z=-100 THEN 340 410 GOTO 260 420 J=I:GOSUB 800:F=0:GOSUB 650:J=I:IF W THEN 440 430 GOSUB 930:GOTO 350 440 VPRINT 17*80,SPC(9):VPRINT (FF+1)*80,"FLIPS:"W:GOSUB 730 450 S(P)=S(P)+W+1:S(3-P)=S(3-P)-W:GOSUB 1080 460 REM :IF N THEN FOR I=1 TO 200:NEXT 470 IF S(1)+S(2)<64 THEN P=3-P:GOTO 260 480 J=17:GOSUB 1030 490 J=15:GOSUB 1030 500 J=0:GOSUB 1030 510 FOR P=1 TO 2:IF S(P)>S(3-P) THEN VPRINT 0,MID$(N$(P),1,10)" WINS":G(P)=G(P)+1 520 NEXT 530 IF S(1)=S(2) THEN VPRINT 0,"DRAW GAME":G(0)=G(0)+1 540 G=G+1:GOSUB 1100:GOTO 180 550 REM SCAN MOVE 560 Q=P-1:Z=-100:IF S(P)=0 THEN RETURN 570 I=8:FOR A=1 TO 8:I=I+1:FOR B=1 TO 8:I=I+1:IF Z(I) THEN 620 580 F=1:GOSUB 650:IF W=0 THEN 620 590 W=W+W(I,Q):IF WZ THEN Z=W:Y=I:X=1:GOTO 620 610 X=X+1:IF X*RND(1)<1 THEN Y=I 620 NEXT B:NEXT A 630 I=Y:RETURN 640 REM TEST MOVE 650 W=0:FOR K=0 TO 7:J=I:M=X(K):L=0 660 J=J+M:IF B(J)=0 THEN 710 670 IF B(J)<>P THEN L=L+1:GOTO 660 680 IF L=0 THEN 710 690 W=W+L:IF F THEN 710 700 J=I:FOR O=1 TO L:J=J+M:GOSUB 750:NEXT 710 NEXT :RETURN 720 REM MOVE PIECE 730 Z(J)=1:FOR K=0 TO 7:L=J+X(K):Z(L)=B(L):NEXT 740 REM FLIP PIECE 750 B(J)=P 760 REM DISPLAY PIECE 770 GOTO 800 780 REM DISPLAY TMP PIECE 790 VPRINT 15*80," " 800 GOSUB 1000 810 P1=P-1 820 FOR L1=0 TO 7 830 DRAW VX,VY-L1,VX+12,VY-L1,P1 840 NEXT 850 P1=P1*(-1)+1 860 DRAW VX+4,VY-1,VX+7,VY-1,P1 870 DRAW VX+2,VY-2,VX+9,VY-2,P1 880 DRAW VX+1,VY-3,VX+10,VY-3,P1 890 DRAW VX+2,VY-4,VX+9,VY-4,P1 900 DRAW VX+4,VY-5,VX+7,VY-5,P1 910 RETURN 920 REM CLEAR PIECE 930 GOSUB 1000 940 FOR L1=0 TO 7 950 DRAW VX,VY-L1,VX+12,VY-L1,0 960 NEXT 970 VPRINT VV,8*U+V-8 980 RETURN 990 REM POSITION PIECE 1000 U=INT(J/9):V=J-9*U:VX=48+(V-1)*14:VY=(9-U)*9-1 1010 VV=(U*3-2)*80+18+(7*V):RETURN 1020 REM CLEAR 2 LINES 1030 FOR A=0 TO 2 1040 VPRINT (A+J)*80,SPC(16) 1050 NEXT 1060 RETURN 1070 REM UPDATE SCORE 1080 FOR I=1 TO 2:VV=10+(4*I+2)*80:VPRINT VV,S(I)" ":NEXT :RETURN 1090 REM UPDATE GAMES 1100 FOR I=1 TO 2:VPRINT (I*4+4)*80,"GAMES:";G(I):NEXT 1110 RETURN 1120 REM INITIALIZE 1130 FILL 32 1140 RESTORE 1140 1150 DATA 1,-8,-9,-10,-1,8,9,10 1160 FOR I=0 TO 7:READ X(I):NEXT 1170 RETURN 1180 REM INITIALIZE GAMES 1190 DATA 6,-2,3,2,-2,-3,-1,-1,3,-1,1,0,2,-1,0,0 1200 RESTORE 1180 1210 FOR I=1 TO 4:FOR J=1 TO 4:K=9*I+J:READ W(K,0):L=K+9-2*J:W(L,0)=W(K,0):NEXT J,I 1220 FOR I=10 TO 44:W(90-I,0)=W(I,0):NEXT 1230 FOR I=10 TO 80:W(I,1)=W(I,0):NEXT 1240 GOSUB 1280 1250 FOR I=0 TO 90:B(I)=0:Z(I)=1:NEXT 1260 FOR P=1 TO 2:J=39+P:GOSUB 730:J=51-P:GOSUB 730:S(P)=2:NEXT :GOSUB 1080 1270 RETURN 1280 REM DRAW BLANK BOARD 1290 FOR I=0 TO 8 1300 DRAW 47+I*14,0,47+I*14,71,1 1310 NEXT 1320 FOR I=0 TO 7 1330 DRAW 47,9*I,159,9*I,1 1340 NEXT 1350 DRAW 47,71,159,71,1 1360 FOR U=1 TO 8 1370 FOR V=1 TO 8 1380 GOSUB 1010 1390 VPRINT VV,8*U+V-8 1400 NEXT V,U 1410 RETURN 1420 FILL 32 1430 FILL 32:RETURN 1440 VINPUT 13*80+15,"DO YOU NEED INSTRUCTIONS (Y/N) : ";,A$ 1450 IF MID$(A$,1,1)="N" THEN RETURN 1460 FILL 32 1470 VPRINT 0," THE OBJECT OF OTHELLO IS TO OCCUPY THE MOST SQUARES AT THE END" 1480 VPRINT 80,"OF THE GAME." 1490 VPRINT 3*80,"THE PLAY PROCEEDS BY OCCUPYING SQUARES IN TURN WHICH CAUSE THE" 1500 VPRINT 4*80,"OPPONENT'S SQUARES TO BE FLIPPED. OPPONENT'S SQUARES ARE" 1510 VPRINT 5*80,"FLIPPED IF THEY ARE IN A DIRECT LINE (VERTICAL, HORIZONTAL OR" 1520 VPRINT 6*80,"DIAGONAL) BETWEEN A SQUARE OF YOUR COLOR AND THE SQUARE YOU" 1530 VPRINT 7*80,"JUST PLACED." 1540 VPRINT 9*80,"EITHER 0,1, OR 2 PLAYERS CAN PLAY OTHELLO. WITH 0 PLAYERS THE" 1550 VPRINT 10*80,"COMPUTER PLAYS ITSELF. WITH 1 PLAYER THE COMPUTER PLAYS" 1560 VPRINT 11*80,"AGAINST YOU. WITH 2 PLAYERS TWO PEOPLE CAN PLAY EACH OTHER." 1570 VPRINT 13*80,"MOVES ARE ENTERED IN RESPONSE TO YOUR MOVE PROMPT. YOUR" 1580 VPRINT 14*80,"MOVE MUST CAUSE AT LEAST 1 OF YOUR OPPONENT'S SQUARES TO BE" 1590 VPRINT 15*80,"FLIPPED. IF YOU CANNOT MOVE, ENTER 0 INSTEAD OF THE NUMBER OF" 1600 VPRINT 16*80,"A SQUARE BETWEEN 1 AND 64. TO END THE CURRENT GAME, ENTER Q." 1610 VPRINT 17*80,"IF YOUR MOVE IS INVALID, THE COMPUTER WILL RESPOND 'BAD MOVE'" 1620 VPRINT 18*80,"AND WILL ASK YOU FOR YOUR MOVE AGAIN. IF YOU HAVE A MOVE THAT" 1630 VPRINT 19*80,"WILL CAUSE AN OPPONENT'S SQUARE TO BE FLIPPED, YOU MUST MOVE" 1640 VPRINT 20*80,"AND NOT PASS." 1650 VINPUT 22*80,"PRESS RETURN TO BEGIN ";,A$ 1660 RETURN