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

  1. 10  REM ************************
  2. 20  REM * OTHELLO              *
  3. 30  REM * BY DOUG HENNIG       *
  4. 40  REM * COPYRIGHT (C) 1986   *
  5. 50  REM * BY MICROSPARC, INC.  *
  6. 60  REM * CONCORD, MA  01742   *
  7. 70  REM ************************
  8. 80  PRINT  CHR$(4);"MAXFILES 1": HIMEM: 34816
  9. 90  ONERR  GOTO 1540
  10. 100 F$ = "GAME.SET": PRINT  CHR$(4)"BLOAD GAME.SET"
  11. 110 F$ = "CHAR.GEN": PRINT  CHR$(4)"BLOAD CHAR.GEN": CALL 35840:F$ = ""
  12. 120  IF  PEEK(48896) = 76  THEN  PRINT  CHR$(4)"PR#A$8DC1": PRINT  CHR$(4)"IN#A$8ECA"
  13. 130  HCOLOR= 3: GOSUB 1420: VTAB 10: INVERSE : HTAB 12: PRINT " O T H E L L O ": NORMAL 
  14. 140  VTAB 12: PRINT  TAB( 13)"By Doug Hennig": PRINT : PRINT " COPYRIGHT 1986 BY MICROSPARC, INC."
  15. 150  REM  VARIABLE INITIALIZATION
  16. 160  DIM BD(9,9),RC(7),CC(7),DC(9),VL%(7,7),V(4),PIECE$(5):WH = 1:BL = 2:MT = 0
  17. 170  FOR I = 0 TO 7: READ RC(I),CC(I): NEXT : FOR I = 1 TO 9: READ DC(I): NEXT 
  18. 180  DATA -1,-1,-1,0,-1,1,0,1
  19. 190  DATA 1,1,1,0,1,-1,0,-1
  20. 200  DATA 6,5,4,7,-1,3,0,1,2
  21. 210 CR$ =  CHR$(13):PIECE$(0) = "q":PIECE$(1) = "Q":PIECE$(2) = "W":PIECE$(3) = "+":PIECE$(4) = "w":PIECE$(5) = " "
  22. 220 V(1) = 2:V(2) = 3:V(3) = 1:V(4) = 4
  23. 230  FOR I = 0 TO 7:V = V( ABS(3.5 -I) +0.5)/2
  24. 240  FOR J = 0 TO 7:VL%(I,J) = VL%(I,J) +V: NEXT 
  25. 250  FOR J = 0 TO 7:VL%(J,I) = VL%(J,I) +V: NEXT : NEXT I: GOSUB 1510
  26. 260  &  HOME : INVERSE : PRINT  TAB( 13)"O T H E L L O" TAB( 39): NORMAL : PRINT :PR$ = "Do you want instructions": GOSUB 1080: IF A$ = "Y"  OR A$ =  CHR$(121)  THEN  GOSUB 1470
  27. 270  REM  SEE WHO WILL PLAY
  28. 280  VTAB 3: PRINT : &  CLEAR P: PRINT "How many players (1 or 2): ";
  29. 290  GET A$:NP =  VAL(A$): IF NP <1  OR NP >2  THEN 290
  30. 300  PRINT A$: PRINT : IF NP = 1  THEN 330
  31. 310  FOR I = 1 TO 2: PRINT "Name of player #"I": ";: &  INPUT (N$(I),10): NEXT 
  32. 320  GOTO 360
  33. 330  PRINT "Your name: ";: &  INPUT (N$(1),10)
  34. 340 N$(2) = "APPLE"
  35. 350  REM  SET UP INITIAL BOARD
  36. 360  FOR I = 1 TO 8: FOR J = 1 TO 8:BD(I,J) = 0: NEXT J,I
  37. 370 BD(4,4) = WH:BD(4,5) = BL
  38. 380 BD(5,4) = BL:BD(5,5) = WH
  39. 390  GOSUB 1390:SK = 0
  40. 400  GOSUB 1430: FOR R = 4 TO 5: FOR C = 4 TO 5:PIECE = BD(R,C): GOSUB 1460: NEXT : NEXT : GOSUB 1440
  41. 410 LR = 3:HR = 6:LC = 3:HC = 6
  42. 420 M = 5:ROW = 1:COL = 1
  43. 430 WC = 2:BC = 2
  44. 440  REM  MAIN GAME ROUTINE
  45. 450  GOSUB 1450: PRINT "Scores:": PRINT : INVERSE : PRINT N$(1);: NORMAL : PRINT ": "WC TAB( 20);: INVERSE : PRINT N$(2);: NORMAL : PRINT ": "BC;
  46. 460 CH = 0
  47. 470 T = (M  AND 1): IF T  THEN 530
  48. 480 A = 2: GOSUB 1060
  49. 490 PL = BL
  50. 500  ON NP GOSUB 910,790
  51. 510  IF CH >0  THEN BC = BC +1
  52. 520  GOTO 570
  53. 530 A = 1: GOSUB 1060
  54. 540 PL = WH
  55. 550  GOSUB 790
  56. 560  IF CH >0  THEN WC = WC +1
  57. 570  IF (M  AND 1) = 0  THEN CH =  -CH
  58. 580 WC = WC +CH:BC = BC -CH
  59. 590  GOSUB 1450: VTAB 23: HTAB  LEN(N$(1)) +3: PRINT WC" ";: HTAB  LEN(N$(2)) +22: PRINT BC" ";
  60. 600  IF CH = 0  THEN SK = SK +1
  61. 610  IF CH < >0  THEN SK = 0
  62. 620 M = 5 -M
  63. 630  IF WC +BC = 64  OR SK = 2  OR WC = 0  OR BC = 0  THEN 700
  64. 640  IF R1 < = LR  AND LR >1  THEN LR = R1 -1: IF LR <0  THEN LR = 0
  65. 650  IF R1 > = HR  AND HR <8  THEN HR = R1 +1
  66. 660  IF C1 < = LC  AND LC >1  THEN LC = C1 -1: IF LC <0  THEN LC = 0
  67. 670  IF C1 > = HC  AND HC <8  THEN HC = C1 +1
  68. 680  GOTO 460
  69. 690  REM  GAME OVER
  70. 700  GOSUB 1440: &  HOME : PRINT "The game is over.": PRINT "Final score:": PRINT 
  71. 710  INVERSE : PRINT N$(1)":" TAB( 12)WC TAB( 20): PRINT N$(2)":" TAB( 12)BC TAB( 20): NORMAL : PRINT 
  72. 720  IF WC = BC  THEN  PRINT "It was a tie game.": GOTO 750
  73. 730 W = 1: IF BC >WC  THEN W = 2
  74. 740  PRINT "The winner was:": PRINT : HTAB 9 - LEN(N$(W))/2: INVERSE : PRINT N$(W): NORMAL 
  75. 750  PRINT : PRINT "Play again? ";: GET A$: PRINT A$
  76. 760  IF A$ < >"N"  AND A$ < > CHR$(110)  THEN 360
  77. 770  PRINT  CHR$(4)"PR#0": PRINT  CHR$(4)"IN#0": TEXT : HOME : END 
  78. 780  REM  FLASH CURSOR AND SEE IF BUTTON PRESSED
  79. 790  GOSUB 1050
  80. 800 A = BD(R,C):PIECE = 4 *(A = BL) +3 *(A = MT): GOSUB 1460: IF R < >ROW  OR C < >COL  THEN A = BD(ROW,COL):PIECE = A *(A = WH  OR A = BL) +5 *(A = MT):A = R:B = C:R = ROW:C = COL:ROW = A:COL = B: GOSUB 1460:R = A:C = B
  81. 810 X =  PEEK(49249):Y =  PEEK(49250)
  82. 820  IF X >127  OR Y >127  THEN 860
  83. 830 A =  PEEK(49152):K =  PEEK(49168): IF A = 141  THEN CH = 0: RETURN 
  84. 840  GOTO 790
  85. 850  REM  SEE IF HE CAN GO THERE
  86. 860 R1 = R:C1 = C: IF BD(R1,C1) < >MT  THEN 890
  87. 870  GOSUB 1180: IF CH = 0  THEN BD(R1,C1) = MT: GOTO 890
  88. 880  RETURN 
  89. 890  GOSUB 1440: VTAB 11: HTAB 1: INVERSE : PRINT "   IMPROPER MOVE ": NORMAL : FOR I = 1 TO 1000: NEXT : &  HOME :A = PL: GOSUB 1060: GOTO 810: REM  3 SPACES BEFORE IMPROPER
  90. 900  REM  COUNT FLIPS
  91. 910 CH = 0:RM = 0:CM = 0:MC =  -1:O = 0
  92. 920  FOR R1 = LR TO HR
  93. 930  FOR C1 = LC TO HC
  94. 940  IF BD(R1,C1) < >MT  THEN 990
  95. 950  GOSUB 1120
  96. 960  IF CH >0  THEN CH = CH +VL%(R1 -1,C1 -1)
  97. 970  IF CH = MC  THEN O = O +1: IF  RND(1) <1/O  THEN RM = R1:CM = C1
  98. 980  IF CH >MC  THEN RM = R1:CM = C1:MC = CH
  99. 990  NEXT C1
  100. 1000  NEXT R1
  101. 1010  IF MC >0  THEN R1 = RM:C1 = CM:R = R1:C = C1: GOSUB 1180
  102. 1020  RETURN 
  103. 1030  END 
  104. 1040  REM  GET PADDLE INPUT
  105. 1050 R =  INT( PDL(1)/255 *7) +1:C =  INT( PDL(0)/255 *7) +1: RETURN 
  106. 1060  GOSUB 1440:A$ = N$(A) +"'S MOVE": VTAB 11: PRINT  TAB( 10 - LEN(A$)/2);: INVERSE : PRINT A$ CHR$(7): NORMAL 
  107. 1070  POKE 7, PEEK(7) +3: VTAB 13: HTAB 9: PRINT PIECE$(A): POKE 7, PEEK(7) -3: RETURN 
  108. 1080  PRINT PR$" (Y or N)? ";
  109. 1090  POKE 24,255: GET A$: IF A$ < >"Y"  AND A$ < >"N"  AND A$ < > CHR$(121)  AND A$ < > CHR$(110)  THEN 1090
  110. 1100  PRINT A$: RETURN 
  111. 1110  REM  CHECK IF PIECES FLIPPED
  112. 1120 CH = 0: FOR D = 0 TO 7
  113. 1130 RC = RC(D):CC = CC(D)
  114. 1140  GOSUB 1250: IF N >0  THEN CH = CH +N
  115. 1150  NEXT D
  116. 1160  RETURN 
  117. 1170  REM  PLOT PIECES FLIPPED
  118. 1180 PIECE = PL: GOSUB 1460:BD(R1,C1) = PL
  119. 1190 CH = 0: FOR D = 0 TO 7
  120. 1200 RC = RC(D):CC = CC(D)
  121. 1210  GOSUB 1250: GOSUB 1320: IF N >0  THEN CH = CH +N
  122. 1220  GOSUB 1460: NEXT D
  123. 1230  RETURN 
  124. 1240  REM  CHECK PIECES ON BOARD
  125. 1250 RA = R1:CA = C1
  126. 1260  FOR I = 1 TO 8
  127. 1270 RA = RA +RC:CA = CA +CC:BD = BD(RA,CA)
  128. 1280  IF BD = PL  THEN N = I -1: RETURN 
  129. 1290  IF BD = MT  THEN 1310
  130. 1300  NEXT I
  131. 1310 N =  -1: RETURN 
  132. 1320 RA = R1:CA = C1: IF N <1  THEN  RETURN 
  133. 1330  FOR I = 1 TO N
  134. 1340 R = R +RC:C = C +CC
  135. 1350 R1 = R:C1 = C:BD(R1,C1) = 3 -BD(R1,C1)
  136. 1360 PIECE = PL: GOSUB 1460:A =  PEEK(49200) + PEEK(49200)
  137. 1370  NEXT I:R1 = RA:R = R1:C1 = CA:C = C1: RETURN 
  138. 1380  REM  SET UP BOARD
  139. 1390 X = 17:Y = 20: & WINDOW(1,2 TO 38,22): HOME : &  CLEAR P: GOSUB 1420: HPLOT X -1,Y -1 TO X +113,Y -1 TO X +113,Y +129 TO X -1,Y +129 TO X -1,Y -1
  140. 1400  FOR I = 0 TO 8: HPLOT I *14 +X,Y TO I *14 +X,Y +128: HPLOT X,I *16 +Y TO X +112,I *16 +Y: NEXT 
  141. 1410  RETURN 
  142. 1420  HPLOT 0,0 TO 279,0 TO 279,191 TO 0,191 TO 0,0: HPLOT 1,1 TO 278,1 TO 278,190 TO 1,190 TO 1,1: & WINDOW(1,1 TO 38,22): RETURN 
  143. 1430  & WINDOW(1,3 TO 20,20): HOME : RETURN 
  144. 1440  & WINDOW(20,3 TO 38,20): HOME : RETURN 
  145. 1450  & WINDOW(1,20 TO 38,22): HOME : RETURN 
  146. 1460  GOSUB 1430: VTAB R *2 +2: HTAB C *2 +1: POKE 7, PEEK(7) +3: PRINT PIECE$(PIECE);: POKE 7, PEEK(7) -3: RETURN 
  147. 1470  VTAB 4: &  CLEAR P
  148. 1480  PRINT "   The object of OTHELLO is to own themost pieces at the end of the game.   You gain pieces by flanking rows of   your opponent's pieces with your own  and 'flipping' them to become your ownpieces."
  149. 1490  PRINT : PRINT "   Use the game paddles (or joystick) to move the '+' around the screen.    When the '+' is in the square where   you want to move, press either game   button. If the move is illegal, the"
  150. 1500  PRINT "'+' will reappear and you will have tomove somewhere else. If you have no   move at all, press <RETURN>."
  151. 1510  VTAB 22: HTAB 9: INVERSE : PRINT "PRESS <RETURN> TO CONTINUE";: NORMAL 
  152. 1520  IF  PEEK(49152) <128  THEN 1520
  153. 1530  POKE 49168,0: RETURN 
  154. 1540 ER =  PEEK(222):EL =  PEEK(219) *256 + PEEK(218)
  155. 1550  TEXT : HOME : VTAB 7: PRINT : PRINT  CHR$(4)"CLOSE"
  156. 1560  IF ER = 6  THEN  PRINT "FILE NOT FOUND": GOTO 1610
  157. 1570  IF ER = 8  THEN  PRINT "I/O ERROR": GOTO 1600
  158. 1580  IF ER = 16  THEN  PRINT "SYNTAX ERROR IN LINE "EL: GOTO 1600
  159. 1590  PRINT "UNANTICIPATED ERROR IN LINE "EL
  160. 1600  CALL  -3288: VTAB 23: PRINT "<RETURN> TO RESTART, <ESC> TO QUIT";: GET CH$: PRINT CH$: ON CH$ < > CHR$(27) GOTO 100: TEXT : END 
  161. 1610  CALL  -3288: IF F$ = ""  THEN 1600
  162. 1620  PRINT : PRINT "THE FILE '"F$"' IS NOT ON THIS DISK.": PRINT "INSERT THE DISK WITH '"F$"'": PRINT : PRINT "AND PRESS <RETURN> ";
  163. 1630  POKE  -16368,0: GET CH$: PRINT CH$
  164. 1640  IF F$ = "GAME.SET"  THEN 100
  165. 1650  GOTO 110