home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib33b.dsk / CONNECTION.bas < prev    next >
BASIC Source File  |  2023-02-26  |  10KB  |  209 lines

  1. 1  REM  **********************
  2. 2  REM  *     CONNECTION     *
  3. 3  REM  *   BY RUDY A. GUY   *
  4. 4  REM  * COPYRIGHT (C) 1988 *
  5. 5  REM  * BY MICROSPARC, INC *
  6. 6  REM  * CONCORD, MA  01742 *
  7. 7  REM  **********************
  8. 60  IF  PEEK(104) < >64  THEN  POKE 103,1: POKE 104,64: POKE 16384,0: PRINT  CHR$(4)"RUN CONNECTION": REM  RELOCATE BASIC CODE ABOVE HI-RES
  9. 70  IF  PEEK(48896) = 76  THEN ADR = 768: POKE ADR,32: POKE ADR +1,248: POKE ADR +2,190: POKE ADR +3,96: CALL ADR: REM   PRODOS FREEBUFF CALL 
  10. 80  ONERR  GOTO 2030
  11. 90  PRINT  CHR$(12) CHR$(21)
  12. 100  PRINT  CHR$(4)"BLOAD CONNECT.ST": POKE 232,0: POKE 233,147: SCALE= 1: ROT= 0: POKE 216,0
  13. 110  HIMEM: 37632
  14. 120  DIM R%(11,11),C%(11,11),B%(100)
  15. 130 SK = 50
  16. 140  HGR : TEXT : HOME : HCOLOR= 3: HPLOT 0,0: CALL  -3082
  17. 150 SC$ = "00":T$(0) = "00":T$(1) = "00":S(0) = 0:S(1) = 0
  18. 160  GOSUB 350
  19. 170  REM  CHECK FOR WINNER
  20. 180  FOR I = 0 TO 1: IF S(I) >50  THEN 250
  21. 190  NEXT : IF S(0) = 50  AND S(1) = 50  THEN 320
  22. 200  REM  MOVE
  23. 210  ON C +1 GOSUB 540,1010
  24. 220 SC$ = T$(C): GOSUB 1880: GOSUB 1850
  25. 230  IF MV  THEN MV = 0: GOTO 170
  26. 240 C =  INT( ABS(C -1)): GOTO 170
  27. 250  HOME : FOR I = 1 TO 5: PRINT  CHR$(7): NEXT : VTAB 22
  28. 260  IF S(0) >50  THEN A$ = "Congratulations human, you win!": GOSUB 1380: GOTO 280
  29. 270 A$ = "Too bad human, I won!": GOSUB 1380
  30. 280  FOR I = 1 TO 3000: NEXT 
  31. 290  VTAB 23: HTAB 7: INPUT "Another game?";YN$
  32. 300  IF  LEFT$(YN$,1) = "n"  OR  LEFT$(YN$,1) = "N"  THEN  TEXT : HOME : END 
  33. 310  FOR I = 0 TO 1:T$(I) = "00": NEXT :SK = SK +5: GOTO 140
  34. 320  REM  TIE GAME
  35. 330 A$ = "The game ends in a tie!": HOME : VTAB 21: GOSUB 1380: GOTO 280
  36. 340  REM  DRAW GRID
  37. 350  FOR I = 1 TO 100:B%(I) = 0: NEXT 
  38. 360  FOR J = 15 TO 145  STEP 13
  39. 370  FOR I = 75 TO 205  STEP 13: XDRAW 1 AT I,J: NEXT I,J
  40. 380  FOR I = 1 TO 11: FOR J = 1 TO 11:R%(I,J) = 0:C%(I,J) = 0: NEXT J,I
  41. 390 J = 35: FOR I = 6 TO 10: XDRAW I AT 35,J:J = J +18: NEXT 
  42. 400  XDRAW 21 AT 230,60: XDRAW 22 AT 230,90
  43. 410  FOR J = 0 TO 1:C = J: GOSUB 1850: NEXT : REM  DRAW INITIAL SCORE
  44. 420  REM  SELECT WHO MOVES FIRST
  45. 430  INVERSE : PRINT " *-* CONNECTION *-* ";: NORMAL : PRINT "   By Rudy A. Guy"
  46. 440 A$ = "Copyright (c) 1988 - MicroSPARC Inc.": GOSUB 1380
  47. 450  IF SK = 50  THEN  GOSUB 1940
  48. 460  VTAB 12: PRINT "Please press a key to see who will make the first move."
  49. 470 X =  PEEK( -16384):A =  INT( RND(1) *9) +1: IF X <127  THEN 470
  50. 480  POKE  -16368,0: IF A/2 =  INT(A/2)  THEN C = 1: GOTO 500
  51. 490 C = 0
  52. 500  VTAB 12: CALL  -958: IF C  THEN PL$ = "Computer"
  53. 510  IF   NOT C  THEN PL$ = "Human"
  54. 520  PRINT "The "PL$" will make the first move.": FOR I = 1 TO 3000: NEXT : POKE  -16304,0: POKE  -16301,0: POKE  -16300,0: POKE  -16297,0: RETURN 
  55. 530  REM  HUMAN MOVE
  56. 540  HOME : VTAB 23:M = 0: PRINT "(Q)uit";: VTAB 22: POKE 36,0
  57. 550  PRINT "(H)orizontal or (V)ertical line:";: GET A$: IF A$ < >"H"  AND A$ < >"V"  AND A$ < >"h"  AND A$ < >"v"  AND A$ < >"Q"  AND A$ < >"q"  THEN  CALL  -198: GOTO 540
  58. 560  HOME : VTAB 22: PRINT "Use left and right arrow keys to select move. Return to make move."
  59. 570  IF A$ = "H"  OR A$ = "h"  THEN S = 2: GOTO 790
  60. 580 S = 3: IF A$ = "Q"  OR A$ = "q"  THEN 2050
  61. 590  FOR J = 1 TO 10: FOR I = 1 TO 11: IF R%(I,J) = 0  THEN TI = I:TJ = J:I = 11:J = 10: GOSUB 1350
  62. 600  NEXT : NEXT 
  63. 610  POKE  -16368,0
  64. 620 X =  PEEK( -16384): XDRAW S AT TX,TY:M =  ABS(M -1): IF X = 136  OR X = 149  OR X = 141  OR X = 200  OR X = 232  THEN  POKE  -16368,0: GOTO 640
  65. 630  GOTO 620
  66. 640  IF X = 141  AND   NOT M  THEN  XDRAW S AT TX,TY: IF C  THEN  RETURN 
  67. 650  IF X = 141  THEN  GOSUB 1400: RETURN 
  68. 660  IF M  THEN  XDRAW S AT TX,TY:M = 0
  69. 670  IF X = 200  OR X = 232  THEN S = 2: GOTO 790
  70. 680  IF X = 149  THEN 740
  71. 690  IF TI = 1  AND TJ = 1  THEN TI = 11:TJ = 10: GOTO 720
  72. 700  IF TI = 1  THEN TJ = TJ -1:TI = 11: GOTO 720
  73. 710 TI = TI -1
  74. 720  IF R%(TI,TJ) = 0  THEN  GOSUB 1350: GOTO 620
  75. 730  GOTO 690
  76. 740  IF TI = 11  AND TJ = 10  THEN TI = 1:TJ = 1: GOTO 770
  77. 750  IF TI = 11  THEN TJ = TJ +1:TI = 1: GOTO 770
  78. 760 TI = TI +1
  79. 770  IF R%(TI,TJ) = 0  THEN  GOSUB 1350: GOTO 620
  80. 780  GOTO 740
  81. 790 S = 2: REM   HORIZONTAL MOVE
  82. 800  FOR J = 1 TO 11: FOR I = 1 TO 10: IF C%(I,J) = 0  THEN TI = I:TJ = J:I = 10:J = 11: GOSUB 1370
  83. 810  NEXT : NEXT 
  84. 820  POKE  -16368,0
  85. 830 X =  PEEK( -16384): XDRAW S AT TX,TY:M =  ABS(M -1): IF X = 136  OR X = 149  OR X = 141  OR X = 214  OR X = 246  THEN  POKE  -16368,0: GOTO 850
  86. 840  GOTO 830
  87. 850  IF X = 141  AND   NOT M  THEN  XDRAW S AT TX,TY: IF C  THEN  RETURN 
  88. 860  IF X = 141  THEN  GOSUB 1580: RETURN 
  89. 870  IF M  THEN  XDRAW S AT TX,TY:M = 0
  90. 880  IF X = 214  OR X = 246  THEN S = 3: GOTO 590
  91. 890  IF X = 149  THEN 950
  92. 900  IF TI = 1  AND TJ = 1  THEN TI = 10:TJ = 11: GOTO 930
  93. 910  IF TI = 1  THEN TJ = TJ -1:TI = 10: GOTO 930
  94. 920 TI = TI -1
  95. 930  IF C%(TI,TJ) = 0  THEN  GOSUB 1370: GOTO 830
  96. 940  GOTO 900
  97. 950  IF TI = 10  AND TJ = 11  THEN TI = 1:TJ = 1: GOTO 980
  98. 960  IF TI = 10  THEN TJ = TJ +1:TI = 1: GOTO 980
  99. 970 TI = TI +1
  100. 980  IF C%(TI,TJ) = 0  THEN  GOSUB 1370: GOTO 830
  101. 990  GOTO 950
  102. 1000  REM   COMPUTER'S MOVE
  103. 1010 A$ = "The computer is deciding on a move...": HOME : VTAB 22: GOSUB 1380
  104. 1020 X = 141:M = 0:A = 1
  105. 1030  FOR I = 1 TO 100: IF B%(I) = 3  THEN  GOSUB 1180:I = 100
  106. 1040  NEXT : IF TT  THEN TT = 0: RETURN 
  107. 1050 FL = 0:N =  INT( RND(1) *2)
  108. 1060  IF N = 1  THEN 1120
  109. 1070 TI =  INT( RND(1) *11) +1:TJ =  INT( RND(1) *10) +1: IF R%(TI,TJ) = 0  THEN S = 3:: GOTO 1090
  110. 1080  GOTO 1050
  111. 1090  IF A < = SK  THEN  GOSUB 1510
  112. 1100  GOSUB 1350: GOSUB 1330: GOSUB 1400: RETURN 
  113. 1110  GOTO 1050
  114. 1120 TI =  INT( RND(1) *10) +1:TJ =  INT( RND(1) *11) +1: IF C%(TI,TJ) = 0  THEN S = 2: GOTO 1140
  115. 1130  GOTO 1050
  116. 1140  IF A < = SK  THEN  GOSUB 1690
  117. 1150  GOSUB 1370: GOSUB 1330: GOSUB 1580: RETURN 
  118. 1160  GOTO 1050
  119. 1170  REM  FIND OPEN AREA
  120. 1180  IF I < = 10  THEN TJ = 1:TI = I: IF R%(TI,TJ) = 0  THEN S = 3: GOSUB 1350: GOSUB 1330: GOSUB 1400:TT = 1: RETURN 
  121. 1190  IF I < = 10  THEN TI = TI +1: IF R%(TI,TJ) = 0  THEN S = 3: GOSUB 1350: GOSUB 1330: GOSUB 1400:TT = 1: RETURN 
  122. 1200  IF I < = 10  THEN TJ = 1:TI = I: IF C%(TI,TJ) = 0  THEN S = 2: GOSUB 1370: GOSUB 1330: GOSUB 1580:TT = 1: RETURN 
  123. 1210  IF I < = 10  THEN TJ = 2: IF C%(TI,TJ) = 0  THEN S = 2: GOSUB 1370: GOSUB 1330: GOSUB 1580:TT = 1: RETURN 
  124. 1220 A$ =  STR$(I):I =  VAL( RIGHT$(A$,1)):J =  VAL( LEFT$(A$,1)) +1: IF  LEN(A$) = 3  THEN J =  VAL( LEFT$(A$,2)) +1:I = 10
  125. 1230  IF I = 0  THEN I = 10
  126. 1240  IF J = 11  THEN J = 10
  127. 1250  IF  RIGHT$(A$,1) = "0"  AND  LEN(A$) <3  THEN J = J -1
  128. 1260  IF J = 11  THEN J = 10
  129. 1270 TI = I:TJ = J
  130. 1280 S = 3: IF R%(TI,TJ) = 0  THEN  GOSUB 1350: GOSUB 1330: GOSUB 1400:TT = 1: RETURN 
  131. 1290 TI = TI +1: IF R%(TI,TJ) = 0  THEN  GOSUB 1350: GOSUB 1330: GOSUB 1400:TT = 1: RETURN 
  132. 1300 S = 2:TI = I: IF C%(TI,TJ) = 0  THEN  GOSUB 1370: GOSUB 1330: GOSUB 1580:TT = 1: RETURN 
  133. 1310 TJ = TJ +1: IF C%(TI,TJ) = 0  THEN  GOSUB 1370: GOSUB 1330: GOSUB 1580:TT = 1: RETURN 
  134. 1320  STOP : REM  PROGRAM SHOULD NOT GET HERE
  135. 1330  FOR K = 1 TO 25: XDRAW S AT TX,TY: FOR L = 1 TO 20: NEXT : NEXT : RETURN 
  136. 1340  REM  LOCATE VERTICAL LINE
  137. 1350 TX = 63 +(TI *13):TY = 12 +(TJ *13): RETURN 
  138. 1360  REM   LOCATE HORIZONTAL LINE
  139. 1370 TX = 66 +(TI *13):TY = 2 +(TJ *13): RETURN 
  140. 1380  HTAB 20 - LEN(A$)/2: PRINT A$: RETURN 
  141. 1390  REM  CHECK FOR COMPLETED SQUARES
  142. 1400 R%(TI,TJ) = 1
  143. 1410  IF TI = 11  THEN TI = 10:FL = 1
  144. 1420  GOSUB 1760
  145. 1430 B%(BL) = B%(BL) +1
  146. 1440  IF B%(BL) = 4  THEN  GOSUB 1780:S(C) = S(C) +1:MV = 1
  147. 1450 BL$ =  STR$(BL): IF  RIGHT$(BL$,1) = "1"  THEN  RETURN 
  148. 1460  IF FL  THEN FL = 0: RETURN 
  149. 1470 B%(BL -1) = B%(BL -1) +1:TI = TI -1
  150. 1480  IF B%(BL -1) = 4  THEN  GOSUB 1780:S(C) = S(C) +1:MV = 1
  151. 1490  RETURN 
  152. 1500  REM  CHECK FOR STATUS OF VERTICAL MOVE
  153. 1510  IF TI = 11  THEN TI = 10:FL = 1
  154. 1520  GOSUB 1760
  155. 1530  IF B%(BL) = 2  THEN A = A +1: POP : GOTO 1050
  156. 1540  IF FL  THEN FL = 0:TI = 11: RETURN 
  157. 1550  IF B%(BL -1) = 2  THEN A = A +1: POP : GOTO 1050
  158. 1560  RETURN 
  159. 1570  REM  SET STATUS OF HORIZONTAL POSITION
  160. 1580 C%(TI,TJ) = 1
  161. 1590  IF TJ = 11  THEN TJ = 10:FL = 1
  162. 1600  GOSUB 1760
  163. 1610 B%(BL) = B%(BL) +1
  164. 1620  IF B%(BL) = 4  THEN  GOSUB 1780:S(C) = S(C) +1:MV = 1
  165. 1630  IF FL  THEN FL = 0: RETURN 
  166. 1640  IF TJ = 1  THEN  RETURN 
  167. 1650 B%(BL -10) = B%(BL -10) +1:TJ = TJ -1
  168. 1660  IF B%(BL -10) = 4  THEN  GOSUB 1780:S(C) = S(C) +1:MV = 1
  169. 1670  RETURN 
  170. 1680  REM  CHECK STATUS OF HOR. MOVE
  171. 1690  IF TJ = 11  THEN TJ = 10:FL = 1
  172. 1700  GOSUB 1760
  173. 1710  IF B%(BL) = 2  THEN A = A +1: POP : GOTO 1050
  174. 1720  IF FL  THEN FL = 0:TJ = 11: RETURN 
  175. 1730  IF TJ = 1  THEN  RETURN 
  176. 1740  IF B%(BL -10) = 2  THEN A = A +1: POP : GOTO 1050
  177. 1750  RETURN 
  178. 1760 BL = (TJ -1) *10 +TI: RETURN 
  179. 1770  REM  DRAW PIECE
  180. 1780  IF C  THEN S = 4: GOTO 1800
  181. 1790 S = 5
  182. 1800  GOSUB 1830: XDRAW S AT TX,TY
  183. 1810  RETURN 
  184. 1820  REM  POSITION PLAYER MARKER
  185. 1830 TX = 66 +(TI *13):TY = 12 +(TJ *13): RETURN 
  186. 1840  REM  UPDATE SCORE
  187. 1850  IF C = 1  THEN SC$ =  STR$(S(1)): GOTO 1870
  188. 1860 SC$ =  STR$(S(0))
  189. 1870  IF  LEN(SC$) <2  THEN SC$ = "0" +SC$: GOTO 1870
  190. 1880 X = 240: IF C = 1  THEN Y = 70: GOTO 1900
  191. 1890 Y = 100
  192. 1900  FOR I = 1 TO 2:S =  ASC( MID$ (SC$,I,1)) -37: XDRAW S AT X,Y:X = X +6: NEXT 
  193. 1910  IF C = 1  THEN T$(C) = SC$: RETURN 
  194. 1920 T$(C) = SC$: RETURN 
  195. 1930  REM  INSTRUCTIONS
  196. 1940  PRINT : PRINT "The object of CONNECTION is to place    horizontal and vertical lines on the    game grid to make a square."
  197. 1950  PRINT : PRINT "First, decide if you want to draw a     horizontal or vertical line by entering 'H' or 'V'. The line is then moved on"
  198. 1960  PRINT "the grid with the left and right arrow  keys. Press the RETURN key to place the line. You may change the type of line"
  199. 1970  PRINT "selected by entering an 'H' while in thevertical line mode or 'V' from the      horizontal mode."
  200. 1980  PRINT : PRINT "The game ends when either you or the    computer captures 51 squares. By the    way, the computer learns with each game."
  201. 1990  PRINT "Press a key to begin.": POKE 49168,0: REM CLEAR KEYBD. STROBE
  202. 2000 X =  PEEK( -16384): IF X >127  THEN  POKE  -16368,0: VTAB 4: CALL  -958: RETURN 
  203. 2010  GOTO 2000
  204. 2020  REM  ERROR RTN.
  205. 2030 EL =  PEEK(218) + PEEK(219) *256
  206. 2040  IF EL = 100  THEN  HOME : VTAB 12: PRINT "AN ERROR OCCURRED TRYING TO LOAD THE     SHAPE TABLE. PLEASE TRY AGAIN.": END 
  207. 2050  HOME : POKE  -16303,0:A$ = "ARE YOU SURE YOU WANT TO QUIT?": HTAB 20 - INT( LEN(A$)/2): VTAB 11: PRINT A$;: INPUT "";A$:A$ =  LEFT$(A$,1)
  208. 2060  IF A$ < >"Y"  AND A$ < >"y"  THEN  POKE  -16304,0: GOTO 540
  209. 2070  TEXT : HOME : END