home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug005.ark / OTHELLO.BAS < prev    next >
Encoding:
BASIC Source File  |  1984-04-29  |  16.0 KB  |  593 lines

  1.         REM THIS PROGRAM WAS WRITTEN BY MITCH J. BOGDANOWICZ  8/19/77
  2.         REM COPYRIGHT 1977 MITCHELL J. BOGDANOWICZ JR.
  3.         REM THE MEMORY MERCHANTS INC.
  4.         REM   1350 BUFFALO ROAD
  5.         REM   SUITE 11
  6.         REM   ROCHESTER, NEW YORK    14624
  7.         REM      716-328-5585
  8.     DIM BOARD(12,12),LENGTH(64),MY(64),MX(64),SY(64),SX(64),RI(64),SI(64)
  9.     DIM LN(64),MOVE(64),SAFE.MOVE(64),DANGER.MOVE(64),NO.DANGER(64)
  10. 1002    INPUT "IS THIS A NEW GAME OR OLD "; NEW.OR.OLD$
  11.     PRINT
  12.     RANDOMIZE
  13.     INPUT "ENTER A FILE NAME FOR THIS GAME "; NAME$
  14.     FILE.NAME$=LEFT$(NAME$,8)
  15.     PRINT
  16.     IF NEW.OR.OLD$="OLD" THEN GOTO 1345
  17.     PRINT "THIS IS THE GAME OF OTHELLO":COUNTER=4 :EG=0 :EH=0
  18.     PRINT : PRINT
  19. 1011    INPUT "DO YOU WANT THE RULES? (Y OR N) "; A$
  20.     IF LEFT$(A$,1)="Y" THEN GOSUB 1240:GOTO 1016
  21.     IF LEFT$(A$,1)<>"N" THEN GOTO 1011
  22.  
  23.  
  24. 1013    PRINT "THESE ARE YOUR CONTROL OPTIONS :" : GOSUB 1450
  25.  
  26.  
  27.         REM SET UP BOARD
  28.  
  29. 1016    FOR X=1 TO 8
  30.     FOR Y=1 TO 8
  31.     BOARD(Y,X)=0
  32.     NEXT Y: NEXT X
  33.     BOARD(4,4)=1:BOARD(5,5)=1:BOARD(4,5)=-1:BOARD(5,4)=-1
  34.  
  35.  
  36.         REM SET DIFFICULTY
  37.  
  38. 1022    PRINT "ENTER YOUR RANK (1 TO 9) - 9 IS MOST DIFFICULT.";:INPUT PLAYERS.RANK
  39.     PRINT
  40.     IF PLAYERS.RANK<1 OR PLAYERS.RANK>9 THEN GOTO 1022
  41.     COUNTER=COUNTER+ABS(PLAYERS.RANK-5)
  42.     IF PLAYERS.RANK=5 THEN GOTO 1043
  43.     IF PLAYERS.RANK>5 THEN CH=RND ELSE GOTO 1028
  44.     IF CH<=.750 THEN BOARD(1,8)=-1 ELSE GOSUB 1316
  45. 1028    IF PLAYERS.RANK>6 THEN CH=RND ELSE GOTO 1030
  46.     IF CH<=.750 THEN BOARD(8,1)=-1 ELSE GOSUB 1316
  47. 1030    IF PLAYERS.RANK>7 THEN CH=RND ELSE GOTO 1032
  48.     IF CH<=.750 THEN BOARD(8,8)=-1 ELSE GOSUB 1316
  49. 1032    IF PLAYERS.RANK>8 THEN CH=RND ELSE GOTO 1034
  50.     IF CH<=.750 THEN BOARD(1,1)=-1 ELSE GOSUB 1316
  51. 1034    IF PLAYERS.RANK<5 THEN CH=RND ELSE GOTO 1036
  52.     IF CH<=.750 THEN BOARD(1,1)=1 ELSE GOSUB 1321
  53. 1036    IF PLAYERS.RANK<4 THEN CH=RND ELSE GOTO 1038
  54.     IF CH<=.750 THEN BOARD(8,8)=1 ELSE GOSUB 1321
  55. 1038    IF PLAYERS.RANK<3 THEN CH=RND ELSE GOTO 1040
  56.     IF CH<=.750 THEN BOARD(1,8)=1 ELSE GOSUB 1321
  57. 1040    IF PLAYERS.RANK<2 THEN CH=RND ELSE GOTO 1042
  58.     IF CH<=.750 THEN BOARD(8,1)=1 ELSE GOSUB 1321
  59.  
  60.  
  61. 1042        REM PRINT STARTING BOARD AND START GAME
  62.  
  63. 1043    GOSUB 1046
  64.     GOTO 1055
  65.  
  66.  
  67.         REM DISPLAY BOARD
  68.  
  69. 1046    FOR Y=1 TO 8
  70.     FOR X=1 TO 8
  71.     IF BOARD(Y,X)=1 THEN PRINT "X  ";
  72.     IF BOARD(Y,X)=-1 THEN PRINT "O  ";
  73.     IF BOARD(Y,X)=0 THEN PRINT "+  ";
  74.     IF X=8 THEN PRINT
  75.     NEXT X:NEXT Y: PRINT 
  76.     RETURN
  77.  
  78.  
  79. 1055    PRINT
  80.     INPUT "YOU ARE 'X', DO YOU WANT TO GO FIRST"; A$
  81.     PRINT
  82.     IF LEFT$(A$,1)="N" THEN 1069
  83.  
  84.  
  85.         REM INPUT MOVE
  86.  
  87. 1059    PRINT "YOUR MOVE";
  88.     INPUT Y,X
  89.     IF (Y=0) AND (X=0) THEN GOTO 1232     REM SAVE DATA
  90.     IF (Y=0) AND (X=1) THEN GOTO 1270     REM FORFEIT MOVE
  91.     IF (Y=0) AND (X=2) THEN GOTO 1117     REM EXCHANGE BOARD W/CONT.
  92.     IF (Y=0) AND (X=3) THEN GOTO 1118     REM EXCHANGE BOARD
  93.     IF (Y=0) AND (X=4) THEN EH=1 : GOTO 1217
  94.     IF (Y=0) AND (X=5) THEN GOSUB 1325
  95.     IF (Y=0) AND (X=6) THEN GOTO 1065     REM AUTO MODE
  96.     IF (Y=0) AND (X=7) THEN GOSUB 1100     REM SET UP BOARD YOURSELF
  97.     IF (Y=0) AND (X=8) THEN GOSUB 1110     REM MOVE A PIECE
  98.     IF (Y=0) AND (X=9) THEN GOSUB 1112     REM DELETE A PIECE
  99.     IF (Y=0) AND (X=10) THEN GOSUB 1450     REM PRINT OPTIONS
  100.     IF (Y=0) AND (X>10) THEN GOSUB 1450 : GOTO 1059
  101.     IF (Y<0) OR (X<0) OR (Y>10) OR (X>10) THEN GOTO 1059
  102.     IF Y=0 THEN GOSUB 1046 : GOTO 1059
  103.     PRINT : COUNTER=COUNTER+1: GOSUB 1199
  104.     IF BOARD(Y,X)<>0 THEN PRINT "INVALID MOVE, TRY AGAIN!":COUNTER=COUNTER-1: GOTO 1059
  105.     BOARD(Y,X)=1 : GOSUB 1186 : GOSUB 1046
  106.     IF COUNTER>=64 THEN GOTO 1217
  107.     GOTO 1069
  108.  
  109.  
  110. 1065    REM AUTO
  111.  
  112.     AUTO$="AUTO"
  113.     FIRST.TIME=0
  114.     GOTO 1069
  115.  
  116.  
  117. 1069        REM FIND ALL POSSIBLE MOVES FOR BLACK
  118.  
  119.     IF INP(1) = 27 THEN AUTO$="MANUAL" : GOTO 1059     REM AN ESCAPE STOPS AUTO
  120. 1070    Q=0
  121.     FOR Y=1 TO 8
  122.     FOR X=1 TO 8
  123.     IF BOARD(Y,X)=-1 THEN GOSUB 1087
  124.     NEXT X :NEXT Y
  125.     IF Q=0 THEN 1217
  126.     Q2=0
  127.     FOR Q1=1 TO Q
  128.     Q3=LENGTH(Q1)
  129.     IF Q3>Q2 THEN Q2=Q3
  130.     NEXT Q1: Q0=Q2:SD=0
  131. 1081    K=0: MM=0: NN=0:N1=0
  132.     FOR Q1=1 TO Q
  133.     IF Q2=LENGTH(Q1) THEN K=K+1
  134.  
  135.  
  136.         REM TAKE A CORNER IF POSSIBLE
  137.  
  138.     IF ((MY(Q1)=1) OR (MY(Q1)=8))AND((MX(Q1)=1)OR(MX(Q1)=8))THEN Q2=LENGTH(Q1): GOTO 1172
  139.     NEXT Q1:GOTO 1119
  140.  
  141.  
  142. 1087        REM CHECK IN ALL DIRECTIONS FOR A WHITE STRING TO FLIP
  143.  
  144.     FOR R=Y-1 TO Y+1
  145.     FOR S=X-1 TO X+1
  146.     IF (R=0) OR (S=0) THEN 1092
  147.     IF BOARD(R,S)=1 THEN GOSUB 1095
  148. 1092    NEXT S: NEXT R
  149.     RETURN
  150.  
  151.  
  152.  
  153.  
  154.         REM FIND DIRECTION AND LENGTH OF WHITE STRING
  155.  
  156. 1095    R1=R-Y : S1=S-X
  157.     C=1
  158.     R2=R+R1 :S2=S+S1
  159. 1098    IF (R2=0) OR (S2=0) THEN RETURN
  160.     IF BOARD(R2,S2)=1 THEN C=C+1 :R2=R2+R1 :S2=S2+S1 :GOTO 1098
  161.     IF BOARD(R2,S2)=-1 THEN RETURN
  162.     IF (R2>8) OR (R2<1) OR (S2>8) OR (S2<1) THEN RETURN
  163.     C=C+1
  164.     Q=Q+1:SAFE.MOVE(Q)=0 :DANGER.MOVE(Q)=0
  165.     MY(Q)=C*R1+Y : LENGTH(Q)=C-1 : SY(Q)=Y : SX(Q)=X
  166.     MX(Q)=C*S1+X
  167.  
  168.  
  169.         REM RECOGNIZE DANGER ZONES
  170.  
  171.     IF (MX(Q)=1)OR(MX(Q)=8)OR(MY(Q)=1)OR(MY(Q)=8) THEN GOSUB 1306
  172.     IF (MX(Q)=2) AND (MY(Q)>=2) AND (MY(Q)<=7) THEN DANGER.MOVE(Q)=1
  173.     IF (MX(Q)=7) AND (MY(Q)>=2) AND (MY(Q)<=7) THEN DANGER.MOVE(Q)=1
  174.     IF (MY(Q)=2) AND (MX(Q)>=2) AND (MX(Q)<=7) THEN DANGER.MOVE(Q)=1
  175.     IF (MY(Q)=7) AND (MX(Q)>=2) AND (MX(Q)<=7) THEN DANGER.MOVE(Q)=1
  176.     IF BOARD(1,1)=-1 AND MX(Q)=2 AND MY(Q)=2 THEN DANGER.MOVE(Q)=0
  177.     IF BOARD(1,8)=-1 AND MX(Q)=7 AND MY(Q)=2 THEN DANGER.MOVE(Q)=0
  178.     IF BOARD(8,1)=-1 AND MX(Q)=2 AND MY(Q)=7 THEN DANGER.MOVE(Q)=0
  179.     IF BOARD(8,8)=-1 AND MX(Q)=7 AND MY(Q)=7 THEN DANGER.MOVE(Q)=0
  180.     RI(Q)=R1 : SI(Q)=S1
  181.     RETURN
  182.  
  183.  
  184. 1100    PRINT "ENTER THE PIECE (X,O OR +)"
  185.     PRINT "ENTER R TO RETURN"; : INPUT P$
  186.     IF P$="R" THEN Y=0 : RETURN
  187.     INPUT "COORDINATES(Y,X): ";Y,X
  188.     IF P$="X" THEN BOARD(Y,X)=-1
  189.     IF P$="O" THEN BOARD(Y,X)= 1
  190.     IF P$="+" THEN BOARD(Y,X)= 0
  191.     GOTO 1100
  192.  
  193.  
  194. 1110    PRINT "MOVE A PIECE(X OR O)"
  195.     INPUT "FROM ";Y,X
  196.     IF Y=0 THEN RETURN
  197.     INPUT " TO ";Y1,X1
  198.     TEMP.=BOARD(Y,X)
  199.     BOARD(Y,X)=0
  200.     BOARD(Y1,X1)=TEMP.
  201.     GOTO 1110
  202.  
  203. 1112    INPUT "DELETE THE PIECE (Y,X): ";Y,X
  204.     IF Y=0 THEN RETURN
  205.     BOARD (Y,X)=0
  206.     GOTO 1112
  207.  
  208.  
  209. 1117    REM EXCHANGE BOARD RETAINING CONTINUITY
  210.     
  211.     GOSUB    1400        REM EXCHANGE PIECES
  212.     PRINT
  213.     GOSUB     1046        REM PRINT BOARD
  214.     PRINT
  215.     GOTO    1069        REM BLACK MOVES WHAT WOULD HAVE BEEN WHITE
  216.  
  217.  
  218. 1118    REM EXCHANGE BOARD
  219.  
  220.     GOSUB 1400
  221.     PRINT
  222.     GOSUB 1046
  223.     PRINT
  224.     GOTO 1059
  225.  
  226.  
  227.         REM LOOK FOR A MULTIPLE STRING MOVE
  228.  
  229. 1119    F=0
  230.     FOR Q8=1 TO Q
  231.     FOR Q9=1 TO Q
  232.     IF (MY(Q8)=MY(Q9)) AND (Q8<>Q9) AND (MX(Q8)=MX(Q9)) THEN GOSUB 1144
  233.     NEXT Q9: NEXT Q8 :H=0
  234.  
  235.  
  236.         REM IF NO MULTIPLE MOVES, GO SELECT A STRAIGHT MOVE
  237.  
  238.     IF F=0 THEN 1149
  239.  
  240.  
  241.         REM EVALUATE MULTIPLE MOVES
  242.  
  243.     FOR G=1 TO F
  244.     IF LN(G)>H THEN J=G :H=LN(G)
  245.     NEXT G
  246.     IF LN(J)<=Q2 THEN 1149
  247.     P=0 : FOR G=1 TO F
  248.     IF LN(G)=LN(J) THEN P=P+1
  249.     NEXT G
  250.     P8=P : FOR PP=1 TO 3
  251.     P1=INT(RND *P8)+1 :P=0
  252.     FOR G=1 TO F
  253.     IF LN(J)=LN(G) THEN GOSUB 1302
  254.     IF P=P1 AND LN(J)=LN(G)   THEN Q2=LENGTH(MOVE(G)) :Q1=MOVE(G) :GOTO 1172
  255.     IF DANGER.MOVE(MOVE(G))=0 THEN LET NN=1
  256.     NEXT G
  257.     IF NN<>1 THEN GOTO 1149
  258.     NEXT PP : GOTO 1149
  259.  
  260.  
  261.         REM GET LENGTH ETC. OF MULTIPLE STRING MOVE
  262.  
  263. 1144    F=F+1
  264.     LN(F)=LENGTH(Q8)+LENGTH(Q9)-1 : MOVE(F)=Q9
  265.     IF LENGTH(Q8)>LENGTH(Q9) THEN MOVE(F)=Q8
  266.     RETURN
  267.  
  268.  
  269.  
  270.  
  271.         REM SELECT A MOVE
  272.  
  273. 1149    K8=K: FOR QQ=1 TO 5
  274.     K1=INT(RND*K8)+1
  275.     K=0
  276.     FOR Q1=1 TO Q
  277.     IF Q2=LENGTH(Q1) THEN GOSUB 1237
  278.     IF K=K1 AND Q2=LENGTH(Q1) THEN GOTO 1172
  279.     IF DANGER.MOVE(Q1)=0 THEN LET MM=1 : N1=N1+1 : NO.DANGER(N1)=Q1
  280.     NEXT Q1
  281.     IF MM<>1 THEN GOTO 1164
  282.     NEXT QQ
  283.     FOR N2=1 TO N1
  284.     IF Q2=LENGTH(NO.DANGER(N2)) THEN Q1=NO.DANGER(N1): GOTO 1172
  285.     NEXT N2
  286.     Q2=Q2-1
  287.     IF Q2 >0 THEN GOTO 1081
  288. 1164    IF DD=1 THEN GOTO 1184
  289.     Q2=Q0 :FOR Q6=1 TO Q : DANGER.MOVE(Q6)=0 
  290.     IF BOARD(1,1)<>-1 AND MY(Q6)=2 AND MX(Q6)=2 THEN DANGER.MOVE(Q6)=1
  291.     IF BOARD(1,8)<>-1 AND MY(Q6)=2 AND MX(Q6)=7 THEN DANGER.MOVE(Q6)=1
  292.     IF BOARD(8,1)<>-1 AND MY(Q6)=7 AND MX(Q6)=2 THEN DANGER.MOVE(Q6)=1
  293.     IF BOARD(8,8)<>-1 AND MY(Q6)=7 AND MX(Q6)=7 THEN DANGER.MOVE(Q6)=1
  294.     NEXT Q6 : DD=1 : GOTO 1081
  295.  
  296.  
  297.         REM FLIP A STRING
  298.  
  299. 1172    FOR Q4=1 TO Q2+1 : DD=0
  300.     BOARD(SY(Q1)+RI(Q1)*Q4,SX(Q1)+SI(Q1)*Q4)=-1
  301.     NEXT Q4
  302.  
  303.  
  304.         REM LOOK FOR MULTIPLE MOVES
  305.  
  306.     FOR Q6=1 TO Q
  307.     IF (MY(Q1)=MY(Q6)) AND (Q1<>Q6) AND (MX(Q1)=MX(Q6)) THEN GOSUB 1181
  308.     NEXT Q6 :PRINT:PRINT"MY MOVE ";MY(Q1);",";MX(Q1):EG=0:EH=0:COUNTER=COUNTER+1
  309.     PRINT
  310.     IF AUTO$="AUTO" AND FIRST.TIME=1 THEN GOSUB 1400
  311.     GOSUB 1046
  312.     IF AUTO$="AUTO" AND FIRST.TIME=0 THEN GOSUB 1400 :\
  313.         FIRST.TIME=1 : GOTO 1069
  314.     IF AUTO$="AUTO" THEN FIRST.TIME=0 : GOTO 1069
  315.     GOTO 1059
  316.  
  317.  
  318.         REM FLIP     REMAINDER OF MULTIPLE MOVE
  319.  
  320. 1181    FOR Q4=1 TO LENGTH(Q6) +1
  321.     BOARD(SY(Q6)+RI(Q6)*Q4,SX(Q6)+SI(Q6)*Q4)=-1
  322.     NEXT Q4 :RETURN
  323. 1184    Q2=Q0 : FOR Q6=1 TO Q : DANGER.MOVE(Q6)=0 : NEXT Q6 : GOTO 1081
  324.  
  325.  
  326.         REM FLIP ALL DISCS FOR WHITE'S MOVE
  327.  
  328. 1186    FOR Q5=Y-1 TO Y+1
  329.     FOR Q6=X-1 TO X+1
  330.     IF BOARD(Q5,Q6)=-1 THEN GOSUB 1190
  331.     NEXT Q6 :NEXT Q5 : RETURN
  332. 1190    R1=Q5-Y :S1=Q6-X :R2=R1+Q5 :S2=S1+Q6
  333. 1191    IF BOARD(R2,S2)=-1 THEN GOSUB 1198 :GOTO 1191
  334.     IF BOARD(R2,S2)=0 THEN RETURN
  335.     IF (R2>8) OR (R2<1) OR (S2>8) OR (S2<1) THEN RETURN
  336.     R2=R1+Q5 : S2=S1+Q6
  337.     IF BOARD(R2-R1,S2-S1)=-1 THEN BOARD(R2-R1,S2-S1)=1
  338. 1196    IF BOARD(R2,S2)=-1 THEN BOARD(R2,S2)=1 :GOSUB 1198 :GOTO 1196
  339.     RETURN
  340.  
  341.  
  342. 1198    R2=R2+R1 : S2=S2+S1 : RETURN
  343.  
  344.  
  345. 1199        REM CHECK FOR A LEGAL MOVE BY WHITE
  346.  
  347.     IF BOARD(Y,X)<>0 THEN RETURN
  348.     VM=0
  349.     FOR R=Y-1 TO Y+1
  350.     FOR S=X-1 TO X+1
  351.     IF (R=0) OR (S=0) THEN 1206
  352.     IF BOARD(R,S)=-1 THEN GOSUB 1210
  353. 1206    NEXT S :NEXT R
  354.     IF VM>0 THEN RETURN
  355.     PRINT "YOU CAN'T FLIP ANY OF YOUR OPPONENT'S PIECES WITH THAT MOVE"
  356.     Y=11 :X=11 :BOARD(Y,X)=2 : RETURN
  357. 1210    R1=R-Y : S1=S-X : R2=R : S2=S
  358. 1211    IF (R2=0) OR (S2=0) THEN RETURN
  359.     R2=R2+R1 : S2=S2+S1
  360.     IF BOARD(R2,S2)=-1 THEN 1211
  361.     IF BOARD(R2,S2)=0 THEN RETURN
  362.     IF (R2>8) OR (R2<1) OR (S2>8) OR (S2<1) THEN RETURN
  363.     VM=1 : RETURN
  364.  
  365.  
  366. 1217        REM END OF GAME TALLY AND 'NO MOVE' SITUATIONS
  367.  
  368.     W=0 :B=0
  369.     FOR Y=1 TO 8
  370.     FOR X=1 TO 8
  371.     Z=BOARD(Y,X)
  372.     IF Z=0 AND EH=1 THEN GOTO 1224
  373.     IF AUTO$="AUTO" AND Z=0 THEN EG=1 : GOSUB 1400 : GOTO 1069
  374.     IF Z=0 THEN PRINT "I HAVE NO MOVES AVAILABLE, PLEASE GO AGAIN.":PRINT:EG=1:GOTO 1059
  375. 1224    IF Z=1 THEN W=W+1
  376.     IF Z=-1 THEN B=B+1
  377.     NEXT X :NEXT Y
  378.     PRINT
  379.     PRINT "THE GAME IS OVER, I HAVE CAPTURED ";B;"DISCS AND YOU HAVE ";W;"DISCS"
  380.     IF W=B THEN PRINT "TIE GAME------YOU LUCKED OUT":GOTO 1232
  381.     IF W>B THEN PRINT "YOU WIN BY ";W-B;"DISCS":GOTO 1232
  382.     PRINT "I WIN BY ";B-W;"DISCS"
  383. 1232    PRINT "DO YOU WANT TO SAVE THE DATA?(YES OR NO)";: INPUT SAVE$
  384.     IF SAVE$="YES" THEN GOSUB 1322
  385. 1234    PRINT "WOULD YOU LIKE TO PLAY AGAIN? (YES OR NO OR RESUME)"
  386.     INPUT A$
  387.     IF A$="RESUME" THEN GOSUB 1046 : GOTO 1059
  388.     IF A$="YES" THEN GOTO 1002
  389.     IF A$="NO" THEN STOP
  390.     GOTO 1234
  391. 1237    IF DANGER.MOVE(Q1)=0 THEN K=K+1 ELSE RETURN
  392.     IF SAFE.MOVE(Q1)>0 THEN K=K1
  393.     RETURN
  394.  
  395.  
  396. 1240    PRINT "                         RULES                              "
  397.     PRINT : PRINT "YOU HAVE WHITE(X) DISCS AND THE COMPUTER HAS BLACK(O)"
  398.     PRINT "A MOVE CONSISTS OF OUTFLANKING YOUR OPPONENT'S DISC(S), THEN "
  399.     PRINT "FLIPPING THE OUTFLANKED DISC(S) OVER TO YOUR COLOR."
  400.     PRINT "           TO OUTFLANK MEANS TO PLACE A DISC SO THAT YOUR "
  401.     PRINT "OPPONENT'S ROW(OR ROWS) OF DISC(S) IS BORDERED AT EACH END BY A"
  402.     PRINT "DISC OF YOUR COLOR."
  403.     PRINT "IF A PLAYER CANNOT OUTFLANK AND FLIP AT LEAST ONE OPPOSING DISC, THE"
  404.     PRINT "TURN IS FORFEITED AND THE OPPONENT MOVES AGAIN. TO FORFEIT  A TURN,"
  405.     PRINT "ANSWER  -1,-1  TO 'YOUR MOVE?'."
  406.     PRINT "A DISC MAY OUTFLANK ANY NUMBER OF DISCS IN ONE OR MORE ROWS. A ROW"
  407.     PRINT "IS DEFINED AS ONE OR MORE DISCS IN A CONTINUOUS STRAIGHT LINE."
  408.     PRINT "A DISC MAY OUTFLANK IN ANY DIRECTION: HORIZONTALLY, VERTICALLY OR "
  409.     PRINT "DIAGONALLY. A DISC MAY OUTFLANK IN ANY NUMBER OF DIRECTIONS AT THE"
  410.     PRINT "SAME TIME . A DISC MAY ONLY BE OUTFLANKED AS A DIRECT RESULT OF A MOVE"
  411.     PRINT "AND MUST FALL IN THE DIRECT LINE OF THE DISC PLACED."
  412.     PRINT "WHEN IT IS NO LONGER POSSIBLE FOR EITHER PLAYER TO MOVE,"
  413.     PRINT "                THE GAME IS OVER"
  414.     PRINT "DISCS ARE COUNTED AND THE PLAYER WITH THE MOST DISCS IS THE WINNER."
  415.     PRINT "TO ABORT A GAME ANSWER  0,0  TO 'YOUR MOVE?'"
  416.     PRINT "TO TALLY-UP AND QUIT TYPE 99,99 TO 'YOUR MOVE'"
  417.     PRINT:PRINT
  418.     INPUT "DO YOU WANT A SAMPLE BOARD, (Y OR N)"; S$
  419.     IF LEFT$(S$,1)<>"Y" THEN RETURN
  420.     PRINT "THIS IS THE BOARD AND HOW THE SPACES ARE NUMBERED":PRINT:FOR Y=1 TO 8:FOR X=1 TO 8
  421.     PRINT Y;",";X;" ";
  422.     IF X=8 THEN PRINT : PRINT
  423.     NEXT X : NEXT Y : PRINT : RETURN
  424.  
  425.  
  426.         REM CHECK FOR ALL OF WHITE'S POSSIBLE MOVES
  427.  
  428. 1270    Q=0: FOR Y=1 TO 8
  429.     FOR X=1 TO 8
  430.     IF BOARD(Y,X)=1 THEN GOSUB 1286
  431.     NEXT X:NEXT Y
  432.     IF Q=0 AND EG=1 THEN EH=1: GOTO 1217
  433.     IF Q=0 THEN EG=1: GOTO 1070
  434.     PRINT "I'M SORRY, YOU MAY NOT FORFEIT THIS MOVE"
  435.     PRINT "YOU HAVE THESE LEGAL MOVES AVAILABLE:":PRINT
  436.     FOR Q9=1 TO Q
  437.     FOR QI=1 TO Q
  438.     IF MX(Q9)=MX(QI) AND MY(Q9)=MY(QI) AND Q9<>QI THEN MX(QI)=0:MY(QI)=0
  439.     NEXT QI : NEXT Q9
  440.     FOR Q9=1 TO Q
  441.     IF MX(Q9)=0 AND MY(Q9)=0 THEN GOTO 1285
  442.     PRINT MY(Q9);",";MX(Q9),
  443. 1285    NEXT Q9 : PRINT : GOTO 1059
  444. 1286    FOR R=Y-1 TO Y+1
  445.     FOR S=X-1 TO X+1
  446.     IF (R=0) OR (S=0) THEN 1291
  447.     IF (R=9) OR(S=9) THEN 1291
  448.     IF BOARD(R,S)=-1 THEN GOSUB 1292
  449. 1291    NEXT S: NEXT R: RETURN
  450. 1292    R1=R-Y: S1=S-X:C=1
  451.     R2=R+R1 :S2=S+S1
  452. 1294    IF (R2=0) OR (S2=0) THEN RETURN
  453.     IF BOARD(R2,S2)=-1 THEN R2=R2+R1:C=C+1:S2=S2+S1:GOTO 1294
  454.     IF BOARD(R2,S2)=1 THEN RETURN
  455.     IF (R2>8) OR (R2<1) OR (S2>8) OR (S2<1) THEN RETURN
  456.     C=C+1 :Q=Q+1
  457.     MY(Q)=C*R1+Y
  458.     MX(Q)=C*S1+X
  459.     RETURN
  460.  
  461.  
  462. 1302    IF DANGER.MOVE(MOVE(G))=0 THEN P=P+1 ELSE RETURN
  463.     IF SAFE.MOVE(MOVE(G))>0 THEN P=P1
  464.     RETURN
  465.  
  466.  
  467.  
  468.  
  469.         REM AVOID DANGER ZONES
  470.  
  471. 1306    IF (MY(Q)=1) AND (MX(Q)=2) AND (BOARD(1,1)<>-1) THEN DANGER.MOVE(Q)=1 
  472.     IF (MY(Q)=2) AND (MX(Q)=1) AND (BOARD(1,1)<>-1) THEN DANGER.MOVE(Q)=1 
  473.     IF (MY(Q)=1) AND (MX(Q)=7) AND (BOARD(1,8)<>-1) THEN DANGER.MOVE(Q)=1 
  474.     IF (MY(Q)=2) AND (MX(Q)=8) AND (BOARD(1,8)<>-1) THEN DANGER.MOVE(Q)=1 
  475.     IF (MY(Q)=7) AND (MX(Q)=1) AND (BOARD(8,1)<>-1) THEN DANGER.MOVE(Q)=1 
  476.     IF (MY(Q)=8) AND (MX(Q)=2) AND (BOARD(8,1)<>-1) THEN DANGER.MOVE(Q)=1 
  477.     IF (MY(Q)=8) AND (MX(Q)=7) AND (BOARD(8,8)<>-1) THEN DANGER.MOVE(Q)=1 
  478.     IF (MY(Q)=7) AND (MX(Q)=8) AND (BOARD(8,8)<>-1) THEN DANGER.MOVE(Q)=1 
  479.     SAFE.MOVE(Q)=1  : RETURN
  480.  
  481.  
  482.         REM RANDOMLY PLACE A BLACK (" O ") PIECE (HANDICAP)
  483.  
  484. 1316    X=INT(RND*8)+1
  485.     Y=INT(RND*8)+1
  486.     IF BOARD(Y,X)<>0 THEN GOTO 1316
  487.     BOARD(Y,X)=-1 : RETURN
  488.  
  489.  
  490.         REM RANDOMLY PLACE A WHITE (" X ") PIECE (HANDICAP)
  491.  
  492. 1321    X=INT(RND*8)+1
  493.     Y=INT(RND*8)+1
  494.     IF BOARD(Y,X)<>0 THEN GOTO 1321
  495.     BOARD(Y,X)=1 : RETURN
  496.  
  497.  
  498. 1322    PRINT " THE PRESENT FILE IS NAMED ";FILE.NAME$
  499.     PRINT " IF YOU WANT TO CHANGE IT, INPUT A DIFFERENT NAME"
  500.     PRINT "OTHERWISE ENTER A '*' ";
  501.     INPUT NAME$
  502.     IF NAME$="*" THEN GOTO 1325
  503.     FILE.NAME$=LEFT$(NAME$,8)
  504.     GOTO 1325
  505.  
  506.  
  507. 1325        REM SAVE ALL DATA FOR A FUTURE FINISH
  508.  
  509.     FILE FILE.NAME$
  510.     FOR SAVE = 1 TO 64
  511.         PRINT # 1;\
  512.             LENGTH(SAVE),MY(SAVE),MX(SAVE),\
  513.             SY(SAVE),SX(SAVE),RI(SAVE),\
  514.             SI(SAVE),LN(SAVE),MOVE(SAVE),\
  515.             SAFE.MOVE(SAVE),DANGER.MOVE(SAVE),NO.DANGER(SAVE)
  516.     NEXT SAVE
  517.     FOR SAVE.A = 1 TO 12
  518.         FOR SAVE.B = 1 TO 12
  519.         PRINT # 1; BOARD(SAVE.A,SAVE.B)
  520.         NEXT SAVE.B
  521.     NEXT SAVE.A
  522.     PRINT # 1; COUNTER,EG,EH,PLAYERS.RANK,\
  523.                 Q,Q0,Q2,Q3,\
  524.                 K,K1,K8,MM,\
  525.                 NN,N1,R,S,\
  526.                 R1,S1,C,R2,\
  527.                 S2,F,H,P,\
  528.                 P8,DD,VM,NAME$
  529.     CLOSE 1
  530.     RETURN
  531.  
  532.  
  533.  
  534.  
  535. 1345        REM READ IN DATA
  536.  
  537.  
  538.  
  539.     FILE FILE.NAME$
  540.  
  541.     FOR LOAD = 1 TO 64
  542.         READ # 1;\
  543.             LENGTH(LOAD),MY(LOAD),MX(LOAD),\
  544.             SY(LOAD),SX(LOAD),RI(LOAD),\
  545.             SI(LOAD),LN(LOAD),MOVE(LOAD),\
  546.             SAFE.MOVE(LOAD),DANGER.MOVE(LOAD),NO.DANGER(LOAD)
  547.     NEXT LOAD
  548.     FOR LOAD.A = 1 TO 12
  549.         FOR LOAD.B = 1 TO 12
  550.         READ # 1; BOARD(LOAD.A,LOAD.B)
  551.         NEXT LOAD.B
  552.     NEXT LOAD.A
  553.     READ # 1; COUNTER,EG,EH,PLAYERS.RANK,\
  554.                 Q,Q0,Q2,Q3,\
  555.                 K,K1,K8,MM,\
  556.                 NN,N1,R,S,\
  557.                 R1,S1,C,R2,\
  558.                 S2,F,H,P,\
  559.                 P8,DD,VM,NAME$
  560.     CLOSE 1
  561.     GOSUB 1046 : GOTO 1059
  562. 1400    FOR X = 1 TO 8
  563.         FOR Y = 1 TO 8
  564.         BOARD(Y,X)=- BOARD(Y,X)
  565.         NEXT Y
  566.     NEXT X
  567.     RETURN
  568.  
  569.  
  570. 1450    REM OPTIONS ON Y,X RESPONSE OF 0,#
  571.  
  572.     PRINT
  573.     PRINT "COMMAND 0,0 = SAVE DATA"
  574.     PRINT "COMMAND 0,1 = FORFEIT MOVE"
  575.     PRINT "COMMAND 0,2 = EXCHANGE BOARD"
  576.     PRINT "COMMAND 0,3 = EXCHANGE PIECES"
  577.     PRINT "COMMAND 0,4 = END GAME + TALLY"
  578.     PRINT "COMMAND 0,5 = SAVE DATA ON CURRENT FILE"
  579.     PRINT "COMMAND 0,6 = AUTO MODE"
  580.     PRINT "COMMAND 0,7 = SET UP BOARD YOURSELF"
  581.     PRINT "COMMAND 0,8 = MOVE A PIECE"
  582.     PRINT "COMMAND 0,9 = DELETE A PIECE"
  583.     PRINT "COMMAND 0,10 = PRINT OPTIONS"
  584.     PRINT
  585.     PRINT
  586.     RETURN
  587.  
  588.  
  589.     END
  590.  
  591.  
  592.  
  593.