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 W<Z THEN 620
600 IF W>Z 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