home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib09.dsk / OTHELLO.bas < prev    next >
BASIC Source File  |  2023-02-26  |  7KB  |  163 lines

  1. 2  REM  ******************************
  2. 3  REM  *      << OTHELLO >>         *
  3. 4  REM  *      BY DOUG HENNIG        *
  4. 5  REM  *    COPYRIGHT (C) 1982      *
  5. 6  REM  *    BY MICRO-SPARC INC      *
  6. 7  REM  *    LINCOLN, MA. 01773      *
  7. 8  REM  *    ALL RIGHTS RESERVED     *
  8. 9  REM  ******************************
  9. 40  TEXT : HOME : INVERSE : FOR I = 1 TO 40: FOR J = 1 TO 5  STEP 4: HTAB I: VTAB J: PRINT " ": NEXT : NEXT : NORMAL : VTAB 3: HTAB 17: PRINT "OTHELLO"
  10. 50  POKE 34,6: HOME : PRINT "WANT INSTRUCTIONS (Y OR N)? ";: GET A$: PRINT A$: IF A$ = "Y"  THEN  GOSUB 62000
  11. 90  REM  VARIABLE INITIALIZATION
  12. 100  DIM BD(9,9):WH = 9:BL = 12:MT = 0
  13. 110  DIM RC(7),CC(7)
  14. 120  FOR I = 0 TO 7: READ RC(I),CC(I): NEXT 
  15. 130  DATA -1,-1,-1,0,-1,1,0,1
  16. 132  DATA 1,1,1,0,1,-1,0,-1
  17. 140  DIM DC(9): FOR I = 1 TO 9: READ DC(I): NEXT 
  18. 150  DATA 6,5,4,7,-1,3,0,1,2
  19. 240 CR$ =  CHR$(13)
  20. 500  DIM VL%(7,7),V(4)
  21. 510 V(1) = 2:V(2) = 3:V(3) = 1:V(4) = 4
  22. 520  FOR I = 0 TO 7:V = V( ABS(3.5 -I) +0.5)/2
  23. 530  FOR J = 0 TO 7:VL%(I,J) = VL%(I,J) +V: NEXT 
  24. 540  FOR J = 0 TO 7:VL%(J,I) = VL%(J,I) +V: NEXT 
  25. 550  NEXT I
  26. 555  REM  SEE WHO WILL PLAY
  27. 560  HOME : POKE 49168,0: PRINT "HOW MANY PEOPLE ARE PLAYING? ";: GET A$: PRINT A$
  28. 580 NP =  VAL(A$) *(A$ = "1"  OR A$ = "2"): IF NP = 0  THEN NP = 1
  29. 600  PRINT : IF NP = 1  THEN 650
  30. 620  FOR I = 1 TO 2: PRINT "NAME OF PLAYER "I" - ";: GOSUB 60000
  31. 630 N$(I) =  LEFT$(A$,10): NEXT 
  32. 640  GOTO 700
  33. 650  PRINT "YOUR NAME - ";: GOSUB 60000:N$(1) =  LEFT$(A$,10)
  34. 660 N$(2) = "APPLE"
  35. 670  REM  SET UP INITIAL BOARD
  36. 700  FOR I = 1 TO 8: FOR J = 1 TO 8:BD(I,J) = 0: NEXT J,I
  37. 710 BD(4,4) = WH:BD(4,5) = BL
  38. 720 BD(5,4) = BL:BD(5,5) = WH
  39. 730  POKE 34,0
  40. 900  GOSUB 50000
  41. 910  FOR I = 4 TO 5: FOR J = 4 TO 5: COLOR= BD(I,J):R = I *4 +1:C = J *4 +1: PLOT C,R
  42. 920  NEXT J,I
  43. 950 LR = 3:HR = 6:LC = 3:HC = 6
  44. 1000 M = 5
  45. 1010 WC = 2:BC = 2
  46. 1020  REM  MAIN GAME ROUTINE
  47. 1040  HOME : VTAB 24: PRINT N$(1) TAB( 11)WC TAB( 20)N$(2) TAB( 31)BC
  48. 2000 CH = 0
  49. 2010 T = (M  AND 1): IF T  THEN 2100
  50. 2020  VTAB 21: HTAB 20: INVERSE : PRINT N$(2)"'S MOVE" CHR$(7): NORMAL 
  51. 2025 PL = BL
  52. 2030  ON NP GOSUB 3500,3000
  53. 2035  IF CH >0  THEN BC = BC +1
  54. 2040  GOTO 2200
  55. 2100  VTAB 21: INVERSE : PRINT N$(1)"'S MOVE" CHR$(7): NORMAL 
  56. 2105 PL = WH
  57. 2110  GOSUB 3000
  58. 2120  IF CH >0  THEN WC = WC +1
  59. 2200  IF (M  AND 1) = 0  THEN CH =  -CH
  60. 2220 WC = WC +CH:BC = BC -CH
  61. 2230  HOME : VTAB 24: PRINT N$(1) TAB( 11)WC TAB( 20)N$(2) TAB( 31)BC
  62. 2240  IF CH = 0  THEN SK = SK +1
  63. 2250  IF CH < >0  THEN SK = 0
  64. 2260 M = 5 -M
  65. 2300  IF WC +BC = 64  THEN 2500
  66. 2310  IF SK = 2  THEN 2500
  67. 2320  IF WC = 0  OR BC = 0  THEN 2500
  68. 2400  IF R1 < = LR  AND LR >1  THEN LR = R1 -1: IF LR <0  THEN LR = 0
  69. 2410  IF R1 > = HR  AND HR <8  THEN HR = R1 +1
  70. 2430  IF C1 < = LC  AND LC >1  THEN LC = C1 -1: IF LC <0  THEN LC = 0
  71. 2440  IF C1 > = HC  AND HC <8  THEN HC = C1 +1
  72. 2450  GOTO 2000
  73. 2490  REM  GAME OVER
  74. 2500  HOME : VTAB 21: PRINT "THE GAME IS OVER. FINAL SCORE:"
  75. 2505  INVERSE 
  76. 2510  PRINT N$(1) TAB( 11)WC TAB( 20)N$(2) TAB( 31)BC
  77. 2512  NORMAL 
  78. 2515  IF WC = BC  THEN  PRINT "IT WAS A TIE GAME.": GOTO 2600
  79. 2520 W = 1: IF BC >WC  THEN W = 2
  80. 2530  PRINT N$(W)" WAS THE WINNER."
  81. 2600  PRINT "WANT TO PLAY AGAIN? ";: GET A$: PRINT A$
  82. 2610  IF A$ < >"N"  THEN 700
  83. 2620  TEXT : HOME : END 
  84. 2990  REM  FLASH CURSOR AND SEE IF BUTTON PRESSED
  85. 3000  GOSUB 10000
  86. 3010 OC =  SCRN( C,R): COLOR= 1
  87. 3020  PLOT C,R
  88. 3030  FOR I = 1 TO 50: NEXT 
  89. 3035  COLOR= OC: PLOT C,R: FOR I = 1 TO 50: NEXT 
  90. 3040 X =  PEEK(49249):Y =  PEEK(49250)
  91. 3050  IF X >127  OR Y >127  THEN 3400
  92. 3060 A =  PEEK(49152):K =  PEEK(49168): IF A = 141  THEN CH = 0: RETURN 
  93. 3070  GOTO 3000
  94. 3390  REM  SEE IF HE CAN GO THERE
  95. 3400 R1 = (R -1)/4:C1 = (C -1)/4: IF BD(R1,C1) < >MT  THEN 3035
  96. 3410  GOSUB 38200: IF CH = 0  THEN BD(R1,C1) = MT: GOTO 3035
  97. 3420  RETURN 
  98. 3490  REM  COUNT FLIPS
  99. 3500 CH = 0:RM = 0:CM = 0:MC =  -1:O = 0
  100. 3510  FOR R1 = LR TO HR
  101. 3520  FOR C1 = LC TO HC
  102. 3530  IF BD(R1,C1) < >MT  THEN 3610
  103. 3550  GOSUB 38000
  104. 3560  IF CH >0  THEN CH = CH +VL%(R1 -1,C1 -1)
  105. 3570  IF CH = MC  THEN O = O +1: IF  RND(1) <1/O  THEN RM = R1:CM = C1
  106. 3590  IF CH >MC  THEN RM = R1:CM = C1:MC = CH
  107. 3610  NEXT C1
  108. 3620  NEXT R1
  109. 3800  IF MC >0  THEN R1 = RM:C1 = CM:R = R1 *4 +1:C = C1 *4 +1: GOSUB 38200
  110. 3900  RETURN 
  111. 4000  END 
  112. 9999  REM  GET PADDLE INPUT
  113. 10000 R =  INT( PDL(1)/230 *8) *4 +1:C =  INT( PDL(0)/230 *8) *4 +1
  114. 10010  IF C = 1  THEN C = 5
  115. 10020  IF R = 1  THEN R = 5
  116. 10030  RETURN 
  117. 37990  REM  CHECK IF PIECES FLIPPED
  118. 38000 CH = 0: FOR D = 0 TO 7
  119. 38010 RC = RC(D):CC = CC(D)
  120. 38020  GOSUB 39000: IF N >0  THEN CH = CH +N
  121. 38030  NEXT D
  122. 38040  RETURN 
  123. 38190  REM  PLOT PIECES FLIPPED
  124. 38200  COLOR= PL: PLOT C,R:BD(R1,C1) = PL
  125. 38210 CH = 0: FOR D = 0 TO 7
  126. 38220 RC = RC(D):CC = CC(D)
  127. 38230  GOSUB 39000: GOSUB 39100: IF N >0  THEN CH = CH +N
  128. 38240  PLOT C,R: NEXT D
  129. 38250  RETURN 
  130. 38990  REM  CHECK PIECES ON BOARD
  131. 39000 R0 = R1:C0 = C1
  132. 39010  FOR I = 1 TO 8
  133. 39020 R0 = R0 +RC:C0 = C0 +CC:BD = BD(R0,C0)
  134. 39030  IF BD = PL  THEN N = I -1: RETURN 
  135. 39040  IF BD = MT  THEN 39070
  136. 39050  NEXT I
  137. 39070 N =  -1: RETURN 
  138. 39100 R0 = R1:C0 = C1: IF N <1  THEN  RETURN 
  139. 39110  FOR I = 1 TO N
  140. 39120 R = R +RC *4:C = C +CC *4
  141. 39130 R1 = (R -1)/4:C1 = (C -1)/4:BD(R1,C1) = (WH +BL) -BD(R1,C1)
  142. 39135  COLOR= PL: PLOT C,R
  143. 39140  NEXT I:R1 = R0:R = R1 *4 +1:C1 = C0:C = C1 *4 +1: RETURN 
  144. 49900  REM  SET UP BOARD
  145. 50000  GR : COLOR= 2: FOR I = 3 TO 37  STEP 4
  146. 50010  HLIN 3,35 AT I: VLIN 3,35 AT I: NEXT I: RETURN 
  147. 59900  REM  INPUT SUBROUTINE
  148. 60000 A$ = ""
  149. 60010  GET B$
  150. 60020  IF B$ =  CHR$(13)  THEN  PRINT : RETURN 
  151. 60030  IF B$ < > CHR$(8)  THEN A$ = A$ +B$: PRINT B$;: GOTO 60010
  152. 60040  IF  LEN(A$) = 0  THEN 60010
  153. 60050  PRINT B$" "B$;: IF  LEN(A$) = 1  THEN A$ = "": GOTO 60010
  154. 60060 A$ =  LEFT$(A$, LEN(A$) -1): GOTO 60010
  155. 62000  REM  INSTRUCTIONS
  156. 62010  HOME : PRINT "   THE OBJECT OF OTHELLO IS TO OWN THE": PRINT "MOST PIECES AT THE END OF THE GAME.": PRINT "YOU GAIN PIECES BY FLANKING ROWS OF": PRINT "OPPONENT'S PIECES WITH YOUR OWN AND": PRINT "'FLIPPING' THEM TO BECOME YOUR OWN."
  157. 62020  PRINT "   USE THE GAME PADDLES TO MOVE THE": PRINT "RED SQUARE (CURSOR) AROUND THE SCREEN."
  158. 62030  PRINT "WHEN THE CURSOR IS WHERE YOU WANT TO": PRINT "MOVE, PRESS EITHER GAME BUTTON. IF THE": PRINT "MOVE IS ILLEGAL, THE CURSOR WILL RE-"
  159. 62040  PRINT "APPEAR AND YOU WILL HAVE TO MOVE SOME-": PRINT "WHERE ELSE. IF YOU HAVE NO MOVE AT ALL,": PRINT "PRESS ";: INVERSE : PRINT "RETURN";: NORMAL : PRINT "."
  160. 62045  PRINT "   THE FIRST PLAYER'S PIECES ARE ORANGE,";: PRINT "AND THE SECOND PLAYER'S ARE GREEN."
  161. 62050  VTAB 23: HTAB 9: INVERSE : PRINT "PRESS RETURN TO CONTINUE": NORMAL 
  162. 62060 K =  PEEK(49152): IF K <128  THEN 62060
  163. 62070 K =  PEEK(49168): RETURN