home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib39b.dsk / PAWNS.bas < prev    next >
BASIC Source File  |  2023-02-26  |  25KB  |  708 lines

  1. 10  REM   *************************
  2. 20  REM   * PAWNS                 *
  3. 30  REM   * BY DAVID ROTH         *
  4. 40  REM   * COPYRIGHT(C) 1990     *
  5. 50  REM   * MINDCRAFT PUBL. CORP. *
  6. 60  REM   * CONCORD, MA 01742     *
  7. 70  REM   *************************
  8. 80  PRINT  CHR$(21): ONERR  GOTO 7090
  9. 90  IF  PEEK(104) < >64  THEN  POKE 103,1: POKE 104,64: POKE 16384,0: PRINT  CHR$(4);"RUN PAWNS"
  10. 100  ONERR  GOTO 6550
  11. 110  DIM CB(64): DIM HB(64): DIM MV(16,3)
  12. 120 N =  RND( - PEEK(78))
  13. 130  IF J >0  THEN  GOTO 320
  14. 140 CT = 0:J = 100
  15. 150  HOME 
  16. 160  PRINT  TAB( 18)"PAWNS"
  17. 170  PRINT  TAB( 14)"BY DAVID ROTH"
  18. 180  PRINT  TAB( 12)"COPYRIGHT(C) 1990"
  19. 190  PRINT  TAB( 11)"MINDCRAFT PUBL.CORP."
  20. 200  PRINT : PRINT : PRINT : PRINT  TAB( 16)"MAIN MENU"
  21. 210  PRINT : PRINT : PRINT 
  22. 220  PRINT  TAB( 10)"1. HELP"
  23. 230  PRINT : PRINT  TAB( 10)"2. START GAME"
  24. 240  PRINT : PRINT  TAB( 10)"3. QUIT"
  25. 250  PRINT : PRINT : PRINT : PRINT "PLEASE MAKE YOUR CHOICE:";
  26. 260  GET CH$
  27. 270  PRINT CH$
  28. 280 G =  VAL(CH$)
  29. 290  IF G = 2  THEN  GOTO 320
  30. 300  ON G = 1 GOSUB 4600: ON G = 3 GOSUB 4550
  31. 310  GOTO 150
  32. 320  HOME : PRINT : PRINT : PRINT : PRINT  TAB( 13)"PLAYING LEVELS"
  33. 330  PRINT : PRINT : PRINT 
  34. 340  PRINT  TAB( 10)"1. JOURNEYMAN"
  35. 350  PRINT : PRINT  TAB( 10)"2. ADVANCED"
  36. 360  PRINT : PRINT  TAB( 10)"3. MASTER"
  37. 370  PRINT : PRINT  TAB( 10)"4. GENIUS"
  38. 380  PRINT : PRINT  TAB( 10)"ESC KEY TO BACK UP"
  39. 390  PRINT : PRINT : PRINT : PRINT "PLEASE MAKE YOUR CHOICE:";
  40. 400  GET CH$
  41. 410  IF  ASC(CH$) = 27  THEN  GOTO 150
  42. 420  PRINT CH$
  43. 430 G =  VAL(CH$)
  44. 440  IF G = 1  THEN  GOTO 490
  45. 450  IF G = 2  THEN LE = 1: GOTO 490
  46. 460  IF G = 3  THEN LE = 2: GOTO 490
  47. 470  IF G = 4  THEN LE = 3: GOTO 490
  48. 480  GOTO 320
  49. 490  GOSUB 4840: GOSUB 4880
  50. 500  HGR : HCOLOR= 3
  51. 510  GOSUB 4960
  52. 520  GOSUB 5050: GOSUB 5120
  53. 530  GOSUB 5330
  54. 540  IF LE = 2  THEN  GOSUB 4250
  55. 550  IF LE = 3  THEN CR = 1:HR = 1
  56. 560  HOME : VTAB 21: REM    RETURN POINT FOR MAIN LOOP                           
  57. 570  GOSUB 4770
  58. 580  PRINT "<ESC> TO MENU"; SPC( 10);LE$" LEVEL"
  59. 590  PRINT "MOVE THE PAWN AT ";: REM  1 SPACE
  60. 600  POKE 49168,0
  61. 610  GET L$: PRINT L$;: IF  ASC(L$) = 27  THEN  GOTO 6080
  62. 620  GET R$: PRINT R$;: IF  ASC(R$) = 27  THEN  GOTO 560
  63. 630  IF  ASC(R$) = 8  THEN  GOTO 610
  64. 640  PRINT  SPC( 1);"TO ";: REM  1 SPACE
  65. 650  GET LL$: PRINT LL$;: IF  ASC(LL$) = 27  THEN  GOTO 560
  66. 660  IF  ASC(LL$) = 8  THEN  CALL  -926: CALL  -998: PRINT "MOVE THE PAWN AT "L$;R$;: CALL  -1008: GOTO 620
  67. 670  GET RR$: PRINT RR$;: IF  ASC(RR$) = 27  THEN  GOTO 560
  68. 680  IF  ASC(RR$) = 8  THEN  GOTO 650
  69. 690  PRINT : PRINT : PRINT "PRESS RETURN TO MOVE, <---- TO CHANGE.";
  70. 700  CALL  -998: CALL  -998: FOR L = 1 TO 13: CALL  -1008: NEXT L: GET G$
  71. 710  IF  ASC(G$) = 27  THEN  GOTO 560
  72. 720  IF  ASC(G$) = 8  THEN  CALL  -1008: GOTO 670
  73. 730 R =  VAL(R$)
  74. 740  IF ( ASC(L$) >64  AND  ASC(L$) <73)  OR ( ASC(L$) >96  AND  ASC(L$) <105)  THEN  GOTO 760
  75. 750  GOSUB 5870: GOTO 560
  76. 760  IF R >0  AND R <9  THEN  GOTO 780
  77. 770  GOSUB 5870: GOTO 560
  78. 780 RR =  VAL(RR$)
  79. 790  IF ( ASC(LL$) >64  AND  ASC(LL$) <73)  OR ( ASC(LL$) >96  AND  ASC(LL$) <105)  THEN  GOTO 810
  80. 800  GOSUB 5870: GOTO 560
  81. 810  IF RR >0  AND RR <9  THEN  GOTO 830
  82. 820  GOSUB 5870: GOTO 560
  83. 830  GOSUB 5800: GOTO 840
  84. 840  REM  LEGAL/ILLEGAL MOVES
  85. 850  IF HB(P1) = 0  THEN  HOME : VTAB 21: PRINT "YOU DO NOT HAVE A PAWN AT "L$R$".": GOSUB 5880: GOTO 560
  86. 860  REM  STRAIGHT-AHEAD MOVE
  87. 870  IF (P2 = P1 +8  AND HB(P2) = 0  AND CB(P2) = 0)  THEN  GOTO 980
  88. 880  REM  DIAGONAL RIGHT MOVE
  89. 890  IF (P2 = P1 +9  AND CB(P2) = 1)  THEN  GOTO 980
  90. 900  REM  DIAGONAL LEFT MOVE
  91. 910  IF (P2 = P1 +7  AND CB(P2) = 1)  THEN  GOTO 980
  92. 920  REM  DOUBLE MOVE AT START
  93. 930  IF (P1 <9  AND P2 = P1 +16)  THEN  GOTO 950
  94. 940  GOTO 960
  95. 950  IF (HB(P2) = 0  AND HB(P2 -8) = 0  AND CB(P2) = 0  AND CB(P2 -8) = 0)  THEN  GOTO 980
  96. 960  GOSUB 5870: GOTO 560
  97. 970  REM  MAKING PLAYER MOVE
  98. 980  GOSUB 5920
  99. 990  HCOLOR= 0
  100. 1000  GOSUB 5180: GOSUB 5240: REM   ERASE OLD POSITION                            
  101. 1010  GOSUB 6000
  102. 1020  HCOLOR= 3
  103. 1030  GOSUB 5180: GOSUB 5240: REM   DRAWING NEW POSITION                          
  104. 1040  REM  FIXING ARRAYS
  105. 1050 HB(P2) = 1:HB(P1) = 0
  106. 1060  IF CB(P2) = 1  THEN CB(P2) = 0: PRINT  CHR$(7)
  107. 1070  PRINT  CHR$(7)
  108. 1080 SH = 1
  109. 1090  FOR L = 1 TO 8
  110. 1100  IF HB(L) = 1  THEN SH = 0
  111. 1110  NEXT L
  112. 1120  IF HR = 1  AND SH = 1  THEN  GOSUB 5040: GOSUB 4880:HR = 0: PRINT  CHR$(7)
  113. 1130 CT = CT +1
  114. 1140  GOSUB 6630: REM  TESTS FOR HUMAN VICTORY
  115. 1150  REM  COMPUTER MOVES SECTION
  116. 1160  HOME : VTAB 22
  117. 1170  PRINT "PLEASE WAIT WHILE I SELECT MY MOVE..."
  118. 1180 PC = 0
  119. 1190  IF GG = 1  THEN  GOTO 1250
  120. 1200  IF  RND(1) >.499  THEN  GOTO 1250
  121. 1210  FOR K = 64 TO 1  STEP  -1
  122. 1220  IF CB(K) = 1  THEN PC = PC +1:MV(PC,1) = K
  123. 1230  NEXT K
  124. 1240  GOTO 1280
  125. 1250  FOR K = 1 TO 64
  126. 1260  IF CB(K) = 1  THEN PC = PC +1:MV(PC,1) = K
  127. 1270  NEXT K
  128. 1280  FOR P = 1 TO PC
  129. 1290  GOSUB 1750
  130. 1300  NEXT P
  131. 1310  FOR W = 34 TO  -5  STEP  -1
  132. 1320  FOR P = 1 TO PC
  133. 1330  IF MV(P,2) = 0  THEN  GOTO 1350
  134. 1340  IF MV(P,3) =  >W  THEN M = 1:TP = P:P = PC:W =  -5
  135. 1350  NEXT P
  136. 1360  NEXT W
  137. 1370  IF M = 1  THEN M = 0:P = TP: GOTO 1390
  138. 1380  GOTO 6880
  139. 1390  IF A >0  THEN  GOTO 1410
  140. 1400  IF CT <8  AND LE = 1  THEN  GOSUB 3890
  141. 1410  GOSUB 1700
  142. 1420  REM  MAKE THE MOVE
  143. 1430  REM  ERASE OLD POSITION
  144. 1440 T = S1: GOSUB 6430
  145. 1450  HCOLOR= 0: GOSUB 5180
  146. 1460  REM  DRAW NEW POSITION
  147. 1470 T = S2: GOSUB 6430
  148. 1480  IF HB(S2) = 1  THEN HB(S2) = 0: GOSUB 5240: CALL  -198
  149. 1490  HCOLOR= 3: GOSUB 5180
  150. 1500 CB(S2) = 1:CB(S1) = 0
  151. 1510 T = 0: PRINT  CHR$(7)
  152. 1520  REM  TEST FOR AND REPLACES COMPUTER'S HOME ROW, IF LE=3
  153. 1530 SC = 1
  154. 1540  FOR L = 57 TO 64
  155. 1550  IF CB(L) = 1  THEN SC = 0
  156. 1560  NEXT L
  157. 1570  IF CR = 1  AND SC = 1  THEN  GOSUB 5120: GOSUB 4840:CR = 0: CALL  -198
  158. 1580 CC = CT
  159. 1590  GOSUB 6740: REM   TESTS FOR COMPUTER VICTORY                               
  160. 1600  REM  CLEARS OUT ALL OLD VALUES IN ARRAY MV
  161. 1610  FOR P = 1 TO PC
  162. 1620  FOR C = 0 TO 3
  163. 1630 MV(P,C) = 0
  164. 1640  NEXT C
  165. 1650  NEXT P
  166. 1660  IF A = 1  THEN A = 2
  167. 1670 FL = 0
  168. 1680  CALL  -198: GOTO 560
  169. 1690  REM  FIND FOR VALUES FOR COMPUTER MOVE
  170. 1700 S1 = MV(P,1):S2 = MV(P,2)
  171. 1710  RETURN 
  172. 1720  REM  FILL ARRAY MV WITH MOVES AND THEIR WEIGHT
  173. 1730  REM  TOTAL OF 4 MOVES - START WITH WEAKEST
  174. 1740  REM  SQ=SQUARE TOKEN
  175. 1750 SQ = MV(P,1)
  176. 1760  REM  STRAIGHT-AHEAD 1 SQUARE
  177. 1770  IF CB(SQ -8) = 0  AND HB(SQ -8) = 0  THEN  GOTO 1790
  178. 1780  GOTO 1970
  179. 1790 MV(P,2) = SQ -8:MV(P,3) = 6
  180. 1800  IF SQ <17  THEN  GOTO 1940
  181. 1810  IF (SQ/8) - INT(SQ/8) = 0  THEN  GOTO 1880
  182. 1820  IF  INT(((SQ/8) - INT(SQ/8)) *10) = 1  THEN  GOTO 1920
  183. 1830  REM  COLS. B-G
  184. 1840  IF HB(SQ -17) = 1  OR HB(SQ -15) = 1  THEN MV(P,3) = MV(P,3) -4
  185. 1850  IF CB(SQ -17) = 1  OR CB(SQ -15) = 1  THEN MV(P,3) = MV(P,3) +1
  186. 1860  GOTO 1940
  187. 1870  REM  COL. H
  188. 1880  IF HB(SQ -17) = 1  THEN MV(P,3) = MV(P,3) -4
  189. 1890  IF CB(SQ -17) = 1  THEN MV(P,3) = MV(P,3) +1
  190. 1900  GOTO 1940
  191. 1910  REM  COL. A
  192. 1920  IF HB(SQ -15) = 1  THEN MV(P,3) = MV(P,3) -4
  193. 1930  IF CB(SQ -15) = 1  THEN MV(P,3) = MV(P,3) +1
  194. 1940  IF SQ -8 <9  THEN MV(P,3) = MV(P,3) +34
  195. 1950 SM = MV(P,3)
  196. 1960  REM  DOUBLE MOVE AT START
  197. 1970  IF SQ <57  THEN  GOTO 2190
  198. 1980  IF CB(SQ -8) = 0  AND CB(SQ -16) = 0  AND HB(SQ -8) = 0  AND HB(SQ -16) = 0  THEN MV(P,2) = SQ -16:MV(P,3) = 9: GOTO 2000
  199. 1990  GOTO 2190
  200. 2000  IF SQ <60  OR SQ >61  THEN MV(P,3) = MV(P,3) -2
  201. 2010  IF (SQ/8) - INT(SQ/8) = 0  THEN  GOTO 2080
  202. 2020  IF  INT(((SQ/8) - INT(SQ/8)) *10) = 1  THEN  GOTO 2120
  203. 2030  REM  COLS. B-G
  204. 2040  IF HB(SQ -25) = 1  OR HB(SQ -23) = 1  THEN MV(P,3) = MV(P,3) -8
  205. 2050  IF CB(SQ -25) = 1  OR CB(SQ -23) = 1  THEN MV(P,3) = MV(P,3) +4
  206. 2060  GOTO 2140
  207. 2070  REM  COL. H
  208. 2080  IF HB(SQ -25) = 1  THEN MV(P,3) = MV(P,3) -8
  209. 2090  IF CB(SQ -25) = 1  THEN MV(P,3) = MV(P,3) +4
  210. 2100  GOTO 2140
  211. 2110  REM  COL. A
  212. 2120  IF HB(SQ -23) = 1  THEN MV(P,3) = MV(P,3) -8
  213. 2130  IF CB(SQ -23) = 1  THEN MV(P,3) = MV(P,3) +4
  214. 2140 DM = MV(P,3)
  215. 2150  REM  COMPARE SINGLE/DOUBLE MOVES
  216. 2160  IF SM >DM  THEN MV(P,2) = SQ -8:MV(P,3) = SM
  217. 2170  IF DM =  >SM  THEN MV(P,2) = SQ -16:MV(P,3) = DM
  218. 2180  REM  DIAGONAL RIGHT CAPTURE
  219. 2190  IF  INT(((SQ/8) - INT(SQ/8)) *10) = 1  THEN  GOTO 2250
  220. 2200  IF HB(SQ -9) = 1  THEN MV(P,2) = SQ -9:MV(P,3) = 20: GOTO 2220
  221. 2210  GOTO 2250
  222. 2220  IF SQ <17  THEN  GOTO 2250
  223. 2230  IF HB(SQ -16) = 0  AND HB(SQ -18) = 0  THEN MV(P,3) = MV(P,3) +2
  224. 2240  REM  DIAGONAL LEFT CAPTURE
  225. 2250  IF (SQ/8) - INT(SQ/8) = 0  THEN  GOTO 2300
  226. 2260  IF HB(SQ -7) = 1  THEN MV(P,2) = SQ -7:MV(P,3) = 20: GOTO 2280
  227. 2270  GOTO 2300
  228. 2280  IF SQ <17  THEN  GOTO 2300
  229. 2290  IF HB(SQ -16) = 0  AND HB(SQ -14) = 0  THEN MV(P,3) = MV(P,3) +2
  230. 2300  IF MV(P,2) = SQ -9  OR MV(P,2) = SQ -7  THEN  GOTO 2320
  231. 2310  GOTO 2330
  232. 2320  IF SQ -8 <9  AND SQ -8 >0  THEN MV(P,3) = MV(P,3) +20
  233. 2330  IF LE >0  THEN  GOTO 2480
  234. 2340  REM  FOR JOURNEYMAN MODE
  235. 2350  REM  OPEN COL.
  236. 2360 AL =  INT((SQ/8) -.05)
  237. 2370 BL = 0:AS = SQ
  238. 2380  GOSUB 4190
  239. 2390  IF BL < >0  THEN  GOTO 2410
  240. 2400 GG = 1:RS = 0:MV(P,3) = MV(P,3) +1
  241. 2410  IF GG = 1  THEN  RETURN 
  242. 2420  REM  VARY THE MOVES
  243. 2430  IF P = PC  THEN RS =  INT( RND(1) *PC) +1: GOTO 2450
  244. 2440  RETURN 
  245. 2450  IF MV(RS,1) >56  THEN  RETURN 
  246. 2460 MV(RS,3) = MV(RS,3) +2: RETURN 
  247. 2470  REM  FOR MASTER MODE
  248. 2480  GOSUB 4140: REM   EVAL. THREAT SITUATION.                                  
  249. 2490  IF A = 1  THEN  GOTO 2620
  250. 2500  IF LE < >2  THEN  GOTO 2620
  251. 2510  IF MV(P,2) = SQ -7  OR MV(P,2) = SQ -9  THEN  GOTO 2620
  252. 2520 ZZ = Z +56
  253. 2530  IF MV(P,1) = ZZ  THEN MV(P,3) = MV(P,3) +4
  254. 2540  REM  COL. TO RIGHT
  255. 2550  IF ZZ = 57  THEN  GOTO 2580
  256. 2560  IF MV(P,1) = ZZ -1  THEN MV(P,2) = SQ -16:MV(P,3) = MV(P,3) +2
  257. 2570  REM  COL TO LEFT
  258. 2580  IF ZZ = 64  THEN  GOTO 2620
  259. 2590  IF MV(P,1) = ZZ +1  THEN MV(P,2) = SQ -16:MV(P,3) = MV(P,3) +2
  260. 2600  REM  ADVANCED PLAY MODE
  261. 2610  REM  ATTACKING WHEN SUPPORTED
  262. 2620  IF MV(P,2) = SQ -8  OR MV(P,2) = SQ -16  THEN  GOTO 2640
  263. 2630  GOTO 2930
  264. 2640  IF SQ <17  THEN  GOTO 2930
  265. 2650  IF SQ >56  AND LE = 3  AND CR = 0  THEN  GOTO 2930
  266. 2660  IF SQ >56  AND LE < >3  THEN  GOTO 2930
  267. 2670  IF (SQ/8) - INT(SQ/8) = 0  THEN  GOTO 2750
  268. 2680  IF  INT(((SQ/8) - INT(SQ/8)) *10) = 1  THEN  GOTO 2780
  269. 2690  REM  ATTACK FROM COLS. B-G
  270. 2700  IF A >0  THEN  GOTO 2720
  271. 2710  IF CB(SQ -1) = 1  AND CB(SQ +1) = 1  THEN MV(P,3) = MV(P,3) +8: GOTO 2810
  272. 2720  IF CB(SQ -1) = 1  OR CB(SQ +1) = 1  THEN MV(P,3) = MV(P,3) +5: GOTO 2810
  273. 2730  GOTO 2930
  274. 2740  REM  ATTACK FROM COL. H
  275. 2750  IF CB(SQ -1) = 1  THEN MV(P,3) = MV(P,3) +5: GOTO 2810
  276. 2760  GOTO 2930
  277. 2770  REM  ATTACK FROM COL. A
  278. 2780  IF CB(SQ +1) = 1  THEN MV(P,3) = MV(P,3) +5: GOTO 2810
  279. 2790  GOTO 2930
  280. 2800  REM  FAVORING EQUAL EXCHANGES
  281. 2810  IF (SQ/8) - INT(SQ/8) = 0  THEN  GOTO 2880
  282. 2820  IF  INT(((SQ/8) - INT(SQ/8)) *10) = 1  THEN  GOTO 2910
  283. 2830  REM  COLS. B-G
  284. 2840  IF (HB(SQ -15) = 0  AND HB(SQ -17) = 1)  OR (HB(SQ -15) = 1  AND HB(SQ -17) = 0)  THEN MV(P,3) = MV(P,3) +5
  285. 2850  IF HB(SQ -15) = 1  AND HB(SQ -17) = 1  THEN MV(P,3) = MV(P,3) -2
  286. 2860  GOTO 2930
  287. 2870  REM  COL. H
  288. 2880  IF HB(SQ -17) = 1  THEN MV(P,3) = MV(P,3) +5
  289. 2890  GOTO 2930
  290. 2900  REM  COL. A
  291. 2910  IF HB(SQ -15) = 1  THEN MV(P,3) = MV(P,3) +5
  292. 2920  REM  2-ON-1 AND 3-ON-2
  293. 2930 AL =  INT((SQ/8) -.05)
  294. 2940 BL = 0:AS = SQ
  295. 2950  GOSUB 4190
  296. 2960  IF BL = 0  THEN  GOTO 2980
  297. 2970  GOTO 3000
  298. 2980  IF MV(P,2) = SQ -8  OR MV(P,2) = SQ -16  THEN MV(P,3) = MV(P,3) +2
  299. 2990  REM  SUPPORT PIECES
  300. 3000  IF SQ <17  THEN  GOTO 3220
  301. 3010  IF (SQ/8) - INT(SQ/8) = 0  THEN  GOTO 3110
  302. 3020  REM  SUPPORT OF PIECE TO THE LEFT
  303. 3030  IF CB(SQ -7) < >1  THEN  GOTO 3110
  304. 3040 NS = SQ -7
  305. 3050 AL =  INT((NS/8) -.05)
  306. 3060 BL = 0:AS = NS
  307. 3070  GOSUB 4190
  308. 3080  IF BL = 0  THEN  GOTO 3100
  309. 3090  GOTO 3110
  310. 3100  IF (MV(P,2) = SQ -8)  OR (MV(P,2) = SQ -16)  THEN MV(P,3) = MV(P,3) +2
  311. 3110  IF  INT(((SQ/8) - INT(SQ/8)) *10) = 1  THEN  GOTO 3220
  312. 3120  REM  SUPPORT OF PIECE TO THE RIGHT
  313. 3130  IF CB(SQ -9) < >1  THEN  GOTO 3220
  314. 3140 NS = SQ -9
  315. 3150 AL =  INT((NS/8) -.05)
  316. 3160 BL = 0:AS = NS
  317. 3170  GOSUB 4190
  318. 3180  IF BL = 0  THEN  GOTO 3200
  319. 3190  GOTO 3220
  320. 3200  IF (MV(P,2) = SQ -8)  OR (MV(P,2) = SQ -16)  THEN MV(P,3) = MV(P,3) +2
  321. 3210  REM  GOING FOR THE GOLD
  322. 3220 AL =  INT((SQ/8) -.05)
  323. 3230 BL = 0:AS = SQ
  324. 3240  GOSUB 4190
  325. 3250  IF BL < >0  THEN  GOTO 3470
  326. 3260  IF SQ <17  THEN  GOTO 3470
  327. 3270  REM  TEST FOR COL. TO LEFT
  328. 3280  IF (SQ/8) - INT(SQ/8) = 0  THEN  GOTO 3350
  329. 3290 NS = SQ -7
  330. 3300 AL =  INT((NS/8) -.05)
  331. 3310 AS = NS
  332. 3320  GOSUB 4190
  333. 3330  IF BL < >0  THEN  GOTO 3470
  334. 3340  REM  TEST FOR COL. TO RIGHT
  335. 3350  IF  INT(((SQ/8) - INT(SQ/8)) *10) = 1  THEN  GOTO 3410
  336. 3360 NS = SQ -9
  337. 3370 AL =  INT((NS/8) -.05)
  338. 3380 AS = NS
  339. 3390  GOSUB 4190
  340. 3400  IF BL < >0  THEN  GOTO 3470
  341. 3410  IF MV(P,2) = SQ -8  OR MV(P,2) = SQ -16  THEN MV(P,3) = MV(P,3) +15: GOTO 3440
  342. 3420  IF SQ >40  THEN  GOTO 3470
  343. 3430  IF MV(P,2) = SQ -7  OR MV(P,2) = SQ -9  THEN MV(P,2) = SQ -8:MV(P,3) = MV(P,3) +4
  344. 3440 GG = 1:MV(P,0) = 5
  345. 3450  REM   TEST FOR ATTACK TOO CLOSE TO HOME ROW.                               
  346. 3460  REM  AND TEST FOR MORE THAN ONE PIECE IN THE CLEAR
  347. 3470  IF GG = 1  AND P = PC  THEN  GOTO 3490
  348. 3480  GOTO 3650
  349. 3490  FOR PP = 1 TO PC
  350. 3500  IF MV(PP,0) = 5  THEN MV(PP,3) = MV(PP,3) +6: GOSUB 3530:PP = PC
  351. 3510  NEXT PP
  352. 3520  GOTO 3650
  353. 3530  FOR UP = 1 TO PC
  354. 3540  IF MV(UP,1) -MV(UP,2) = 9  OR MV(UP,1) -MV(UP,2) = 7  THEN  GOSUB 3570
  355. 3550  NEXT UP
  356. 3560  RETURN 
  357. 3570 Q = MV(PP,1):U = MV(UP,1)
  358. 3580 AL =  INT((Q/8) -.05)
  359. 3590 UL = 8 - INT((U/8) -.05)
  360. 3600  IF UL <AL  THEN  GOTO 3620
  361. 3610  RETURN 
  362. 3620 MV(UP,3) = MV(UP,3) +15
  363. 3630  RETURN 
  364. 3640  REM  SUPPORT PIECE DIRECTLY BEHIND = +1
  365. 3650  IF SQ >56  THEN  GOTO 3680
  366. 3660  IF CB(SQ +8) = 1  THEN MV(P,3) = MV(P,3) +1
  367. 3670  REM  BEST OF BAD MOVES
  368. 3680  IF P = PC  THEN  GOTO 3700
  369. 3690  GOTO 3840
  370. 3700  FOR PL = 1 TO PC
  371. 3710  IF MV(PL,3) >4  THEN GM = 1:PL = PC
  372. 3720  NEXT PL
  373. 3730  IF GM = 1  THEN GM = 0: GOTO 3840
  374. 3740  FOR K = 1 TO 64
  375. 3750  IF CB(K) = 1  THEN  GOSUB 3780
  376. 3760  NEXT K
  377. 3770  GOTO 3840
  378. 3780  FOR PL = 1 TO PC
  379. 3790  IF FL = 1  THEN PL = PC: GOTO 3820
  380. 3800  IF MV(PL,2) = 0  THEN  GOTO 3820
  381. 3810  IF MV(PL,1) = K  THEN MV(PL,3) = MV(PL,3) +2:FL = 1
  382. 3820  NEXT PL
  383. 3830  RETURN 
  384. 3840  IF LE < >3  THEN  RETURN 
  385. 3850  REM  SPECIAL STRATEGY FOR GENIUS LEVEL (3 OF 0-3)
  386. 3860  IF SQ >56  AND CR = 1  THEN MV(P,3) = MV(P,3) +2
  387. 3870  RETURN 
  388. 3880  REM  SPECIAL OPENINGS FOR ADVANCED MODE
  389. 3890  FOR LP = 1 TO PC
  390. 3900  IF MV(LP,1) -MV(LP,2) = 9  OR MV(LP,1) -MV(LP,2) = 7  THEN A = 1:LP = PC
  391. 3910  NEXT LP
  392. 3920  IF A = 1  THEN  RETURN 
  393. 3930  IF J <100  THEN  GOTO 3960
  394. 3940  IF  RND(1) <.167  THEN A = 1: RETURN 
  395. 3950 J =  INT( RND(1) *5) *14
  396. 3960  IF J = 0  OR MT = 1  THEN  GOTO 4010
  397. 3970  FOR L = 1 TO J
  398. 3980  READ MV(P,1)
  399. 3990  NEXT L
  400. 4000 MT = 1
  401. 4010  READ MV(P,1),MV(P,2)
  402. 4020  RETURN 
  403. 4030  REM  THE PICK OPENING
  404. 4040  DATA  59,51,60,44,61,45,63,55,62,46,58,42,57,49
  405. 4050  REM  THE LOW FENCE OPENING
  406. 4060  DATA  59,43,60,52,58,50,61,45,62,54,63,47,64,56
  407. 4070  REM  THE SLOT OPENING
  408. 4080  DATA  59,43,60,44,44,36,58,50,62,46,61,53,63,55
  409. 4090  REM  THE TWO-HILLS OPENING
  410. 4100  DATA  59,43,58,50,61,53,60,44,57,41,63,55,64,48
  411. 4110  REM  THE SAG OPENING
  412. 4120  DATA  60,52,59,43,61,53,62,54,58,50,64,56,63,47
  413. 4130  REM  EVAL. THREAT
  414. 4140  FOR L = 33 TO 64
  415. 4150  IF HB(L) = 1  THEN A = 1
  416. 4160  NEXT L
  417. 4170  RETURN 
  418. 4180  REM  LOOP FOR OPEN COL. & ADJACENT OPEN COL.
  419. 4190  FOR L = 1 TO AL
  420. 4200 AS = AS -8
  421. 4210  IF HB(AS) = 1  OR CB(AS) = 1  THEN BL = 1
  422. 4220  NEXT L
  423. 4230  RETURN 
  424. 4240  REM  ERASE PIECE @ RAN. FROM PLAYER'S START
  425. 4250 T = Z:
  426. 4260  GOSUB 6430
  427. 4270  HCOLOR= 0
  428. 4280  GOSUB 5180: GOSUB 5240
  429. 4290  HCOLOR= 3:T = 0
  430. 4300  RETURN 
  431. 4310  REM  HUMAN VICTORY
  432. 4320  HOME : VTAB 21
  433. 4330  FOR L = 1 TO 10
  434. 4340  CALL  -198
  435. 4350  NEXT L
  436. 4360  PRINT "YOU HAVE WON IN "CT" MOVES!!!"
  437. 4370  PRINT "NICE TO KNOW SOMEONE SO BRIGHT!"
  438. 4380  GOTO 4490
  439. 4390  REM  COMPUTER VICTORY
  440. 4400  HOME : VTAB 21
  441. 4410 E = 12
  442. 4420 E = E -1: IF E = 0  THEN  GOTO 4470
  443. 4430  FOR EL = 1 TO 20
  444. 4440 ES =  PEEK(49200)
  445. 4450  NEXT EL
  446. 4460  GOTO 4420
  447. 4470  PRINT "I HAVE BEATEN YOU IN "CC" MOVES!!!"
  448. 4480  PRINT "HOW DOES THAT FEEL?"
  449. 4490  PRINT 
  450. 4500  PRINT "(Y/N TO PLAY AGAIN.)";
  451. 4510  POKE 49168,0
  452. 4520  GET G$: PRINT G$
  453. 4530  IF G$ = "Y"  OR G$ = "y"  THEN  TEXT : CLEAR : GOTO 100
  454. 4540  TEXT : GOTO 4580
  455. 4550  HOME : PRINT "DO YOU REALLY WANT TO QUIT? (Y/N) ";: GET G$
  456. 4560  IF G$ = "Y"  OR G$ = "y"  THEN  GOTO 4580
  457. 4570  RETURN 
  458. 4580  HOME : PRINT "PLEASE PLAY AGAIN SOMETIME...": END 
  459. 4590  REM  HELP
  460. 4600  HOME 
  461. 4610  PRINT "TO WIN, POSITION PAWN ON COMPUTER'S": PRINT "HOME ROW BEFORE IT PLACES ONE ON YOUR": PRINT "HOME ROW."
  462. 4620  PRINT 
  463. 4630  PRINT "1. ADVANCE PAWNS IN COORDINATED GROUPS"
  464. 4640  PRINT  TAB( 4)"SO THAT NO PIECE IS LEFT UNDEFENDED."
  465. 4650  PRINT : PRINT "2. TIMING IS IMPORTANT - TRY NOT TO BE"
  466. 4660  PRINT  TAB( 4)"FORCED INTO BAD MOVES."
  467. 4670  PRINT : PRINT "3. YOU CAN OFTEN UPSET THE COMPUTER'S"
  468. 4680  PRINT  TAB( 4)"GAME BY MOVING QUICKLY UP THE BOARD"
  469. 4690  PRINT  TAB( 4)"INTO HIS FORMATIONS."
  470. 4700  PRINT : PRINT "4. EXPERIMENT. SEE WHAT WORKS AND"
  471. 4710  PRINT  TAB( 4)"WHAT DOESN'T. A LOSS REALLY ISN'T A"
  472. 4720  PRINT  TAB( 4)"LOSS IF IT CONTRIBUTES KNOWLEDGE"
  473. 4730  PRINT  TAB( 4)"TOWARD FUTURE WINS."
  474. 4740  PRINT : PRINT : PRINT : PRINT "(PRESS <RETURN> FOR MENU.)";
  475. 4750  GET G$: RETURN 
  476. 4760  REM  DISPLAY OF LEVEL BEING PLAYED
  477. 4770 DS = LE +1
  478. 4780  ON DS GOSUB 4800,4810,4820,4830
  479. 4790  RETURN 
  480. 4800 LE$ = "JOURNEYMAN": RETURN 
  481. 4810 LE$ = "ADVANCED": RETURN 
  482. 4820 LE$ = "MASTER": RETURN 
  483. 4830 LE$ = "GENIUS": RETURN 
  484. 4840  FOR T = 57 TO 64
  485. 4850 CB(T) = 1
  486. 4860  NEXT T
  487. 4870  RETURN 
  488. 4880  FOR T = 1 TO 8
  489. 4890 HB(T) = 1
  490. 4900  NEXT T
  491. 4910  IF LE < >2  THEN  RETURN : REM   ERASES FROM ARRAY FOR LEVEL 2.           
  492. 4920 Z =  INT( RND(1) *8) +1
  493. 4930 HB(Z) = 0
  494. 4940  RETURN 
  495. 4950  REM  DRAW BOARD
  496. 4960  FOR H = 70 TO 190  STEP 15
  497. 4970  HPLOT H,20 TO H,140
  498. 4980  NEXT H
  499. 4990  FOR V = 20 TO 140  STEP 15
  500. 5000  HPLOT 70,V TO 190,V
  501. 5010  NEXT V
  502. 5020  RETURN 
  503. 5030  REM  DRAW STARTING POSITIONS
  504. 5040  REM  WHITE PIECES
  505. 5050 Y = 125
  506. 5060  FOR X = 70 TO 175  STEP 15
  507. 5070  GOSUB 5180
  508. 5080  GOSUB 5240
  509. 5090  NEXT X
  510. 5100  RETURN 
  511. 5110  REM  BLACK PIECES
  512. 5120 Y = 20
  513. 5130  FOR X = 70 TO 175  STEP 15
  514. 5140  GOSUB 5180
  515. 5150  NEXT X
  516. 5160  RETURN 
  517. 5170  REM  OUTLINE OF ALL PIECES
  518. 5180  HPLOT X +6,Y +2 TO X +6,Y +10 TO X +2,Y +10
  519. 5190  HPLOT X +2,Y +10 TO X +2,Y +13 TO X +13,Y +13
  520. 5200  HPLOT X +13,Y +13 TO X +13,Y +10 TO X +9,Y +10 TO X +9,Y +2
  521. 5210  HPLOT X +9,Y +2 TO X +6,Y +2
  522. 5220  RETURN 
  523. 5230  REM  FILL IN WHITE PIECES
  524. 5240  FOR F = 7 TO 8
  525. 5250  HPLOT X +F,Y +2 TO X +F,Y +10
  526. 5260  NEXT F
  527. 5270  FOR F = 11 TO 12
  528. 5280  HPLOT X +2,Y +F TO X +13,Y +F
  529. 5290  NEXT F
  530. 5300  RETURN 
  531. 5310  REM  DRAW COORDINATES
  532. 5320  REM  LETTER A
  533. 5330  HPLOT 75,142 TO 80,142: HPLOT 75,142 TO 75,152
  534. 5340  HPLOT 80,142 TO 80,152: HPLOT 75,148 TO 80,148
  535. 5350  REM  LETTER B
  536. 5360  HPLOT 90,142 TO 90,152: HPLOT 90,142 TO 95,142
  537. 5370  HPLOT 95,142 TO 95,152: HPLOT 90,152 TO 95,152
  538. 5380  HPLOT 90,148 TO 95,148
  539. 5390  REM  LETTER C
  540. 5400  HPLOT 105,142 TO 105,152: HPLOT 105,142 TO 110,142
  541. 5410  HPLOT 105,152 TO 110,152
  542. 5420  REM  LETTER D
  543. 5430  HPLOT 120,142 TO 120,152: HPLOT 120,142 TO 125,142
  544. 5440  HPLOT 125,142 TO 125,152 TO 120,152
  545. 5450  REM  LETTER E
  546. 5460  HPLOT 135,142 TO 135,152 TO 140,152
  547. 5470  HPLOT 135,142 TO 140,142: HPLOT 135,148 TO 139,148
  548. 5480  REM  LETTER F
  549. 5490  HPLOT 150,142 TO 150,152: HPLOT 150,142 TO 155,142
  550. 5500  HPLOT 150,148 TO 154,148
  551. 5510  REM  LETTER G
  552. 5520  HPLOT 165,142 TO 165,152: HPLOT 165,142 TO 170,142
  553. 5530  HPLOT 165,152 TO 170,152 TO 170,148 TO 168,148
  554. 5540  REM  LETTER H
  555. 5550  HPLOT 180,142 TO 180,152: HPLOT 185,142 TO 185,152
  556. 5560  HPLOT 180,148 TO 185,148
  557. 5570  REM  NUMBER 1
  558. 5580  HPLOT 197,128 TO 197,138
  559. 5590  REM  NUMBER 2
  560. 5600  HPLOT 195,113 TO 200,113 TO 200,118 TO 195,118 TO 195,123 TO 200,123
  561. 5620  REM  NUMBER 3
  562. 5630  HPLOT 195,98 TO 200,98 TO 200,108 TO 195,108
  563. 5640  HPLOT 196,104 TO 200,104
  564. 5650  REM  NUMBER 4
  565. 5660  HPLOT 195,83 TO 195,89 TO 200,89
  566. 5670  HPLOT 200,83 TO 200,93
  567. 5680  REM  NUMBER 5
  568. 5690  HPLOT 195,68 TO 200,68: HPLOT 195,68 TO 195,74
  569. 5700  HPLOT 195,74 TO 200,74 TO 200,78 TO 195,78
  570. 5710  REM  NUMBER 6
  571. 5720  HPLOT 195,53 TO 195,63 TO 200,63 TO 200,59 TO 195,59
  572. 5730  REM  NUMBER 7
  573. 5740  HPLOT 195,38 TO 200,38 TO 200,48
  574. 5750  REM  NUMBER 8
  575. 5760  HPLOT 195,23 TO 195,33 TO 200,33 TO 200,23 TO 195,23
  576. 5770  HPLOT 195,29 TO 200,29
  577. 5780  RETURN 
  578. 5790  REM  EXTRACTS VALUES FOR P1 AND P2
  579. 5800 L1 =  ASC(L$):L2 =  ASC(LL$)
  580. 5810  IF L1 >72  THEN L1 = L1 -32:L$ =  CHR$(L1)
  581. 5820  IF L2 >72  THEN L2 = L2 -32:LL$ =  CHR$(L2)
  582. 5830 P1 = ( ASC(L$) -64) +((R *8) -8)
  583. 5840 P2 = ( ASC(LL$) -64) +((RR *8) -8)
  584. 5850  RETURN 
  585. 5860  REM   INPUT ERROR                                                          
  586. 5870  HOME : VTAB 21: PRINT L$R$" TO "LL$RR$" IS ILLEGAL. PLEASE TRY AGAIN."
  587. 5880  PRINT "(PRESS <RETURN> TO CONTINUE GAME.)";
  588. 5890  GET G$: PRINT G$
  589. 5900  RETURN 
  590. 5910  REM  FINDING OFFSETS FOR X & Y
  591. 5920  FOR XX = 65 TO 72
  592. 5930  IF  ASC(L$) = XX  THEN X = 70 +((XX -65) *15)
  593. 5940  NEXT XX
  594. 5950  FOR YY = 1 TO 8
  595. 5960  IF R = YY  THEN Y = 140 -(YY *15)
  596. 5970  NEXT YY
  597. 5980  RETURN 
  598. 5990  REM  FINDING OFFSETS FOR X & Y
  599. 6000  FOR XX = 65 TO 72
  600. 6010  IF  ASC(LL$) = XX  THEN X = 70 +((XX -65) *15)
  601. 6020  NEXT XX
  602. 6030  FOR YY = 1 TO 8
  603. 6040  IF RR = YY  THEN Y = 140 -(YY *15)
  604. 6050  NEXT YY
  605. 6060  RETURN 
  606. 6070  REM  MENU FOR GAME IN PROGRESS & RETURN
  607. 6080  TEXT : HOME 
  608. 6090  PRINT : PRINT : PRINT : PRINT  TAB( 16)"GAME MENU"
  609. 6100  PRINT : PRINT : PRINT 
  610. 6110  PRINT  TAB( 10)"1. HELP"
  611. 6120  PRINT : PRINT  TAB( 10)"2. QUIT"
  612. 6130  PRINT : PRINT  TAB( 10)"3. RESTART CURRENT GAME"
  613. 6140  PRINT : PRINT  TAB( 10)"4. START A NEW GAME"
  614. 6150  PRINT : PRINT : PRINT : PRINT "PLEASE MAKE YOUR CHOICE:";
  615. 6160  GET CH$
  616. 6170  PRINT CH$
  617. 6180 G =  VAL(CH$)
  618. 6190  IF G = 3  THEN  GOTO 6240
  619. 6200  IF G = 4  THEN  CLEAR :J = 100: GOTO 100
  620. 6210  ON G GOSUB 4600,4550
  621. 6220  GOTO 6080
  622. 6230  REM  REDRAW GAME BOARD
  623. 6240  HGR : HCOLOR= 3
  624. 6250  GOSUB 4960
  625. 6260  GOSUB 5330
  626. 6270  FOR T = 1 TO 64
  627. 6280  IF CB(T) = 1  THEN  GOSUB 6340
  628. 6290  IF HB(T) = 1  THEN  GOSUB 6380
  629. 6300  NEXT T
  630. 6310  IF CT >CC  THEN  VTAB 22: GOTO 1170
  631. 6320  GOTO 560
  632. 6330  REM  REDRAW BLACK PIECES
  633. 6340  GOSUB 6430
  634. 6350  GOSUB 5180
  635. 6360  RETURN 
  636. 6370  REM  REDRAW WHITE PIECES
  637. 6380  GOSUB 6430
  638. 6390  GOSUB 5180: GOSUB 5240
  639. 6400  RETURN 
  640. 6410  REM  FINDING FOR X & Y FOR REDRAW
  641. 6420  REM  FIND FOR Y OFFSET
  642. 6430  FOR YY = 9 TO 65  STEP 8
  643. 6440  IF T <YY  THEN Y = 140 -( INT(YY/8) *15):YY = 65
  644. 6450  NEXT YY
  645. 6460  REM  FIND FOR X OFFSET
  646. 6470 X = 0
  647. 6480  FOR XX = 1 TO 9
  648. 6490  IF  INT(((T/8) - INT(T/8)) *10) = XX  THEN X = 55 +(XX *15):XT = XX:XX = 9
  649. 6500  NEXT XX
  650. 6510  IF X = 0  THEN X = 175: RETURN 
  651. 6520  IF XT >4  THEN X = X -15
  652. 6530  RETURN 
  653. 6540  REM  ONERR TRAP
  654. 6550 CD =  PEEK(222):LN =  PEEK(219) *256 + PEEK(218)
  655. 6560  PRINT : PRINT "ERROR #"CD" OCCURRED ON LINE #"LN"."
  656. 6570  CALL  -958
  657. 6580  CALL 62248
  658. 6590  PRINT "(PRESS <RETURN> TO CONTINUE GAME.)";
  659. 6600  GET G$: PRINT G$
  660. 6610  HOME : GOTO 560
  661. 6620  REM  TESTS FOR HUMAN VICTORY
  662. 6630  FOR L = 57 TO 64
  663. 6640  IF HB(L) = 1  THEN  GOTO 4320
  664. 6650  NEXT L
  665. 6660  FOR L = 64 TO 1  STEP  -1
  666. 6670  IF CB(L) = 1  THEN L = 1: NEXT L: RETURN 
  667. 6680  NEXT L
  668. 6690  HOME : VTAB 21
  669. 6700  PRINT "YOU HAVE TAKEN MY LAST PIECE..."
  670. 6710  PRINT "AND BEATEN ME IN "CT" MOVES!"
  671. 6720  GOTO 4490
  672. 6730  REM  TESTS FOR COMPUTER VICTORY
  673. 6740  HOME : VTAB 22: PRINT "PLEASE WAIT WHILE I CHECK THE BOARD..."
  674. 6750  FOR L = 1 TO 8
  675. 6760  IF CB(L) = 1  THEN  GOTO 4400
  676. 6770  NEXT L
  677. 6780  FOR L = 1 TO 64
  678. 6790  IF HB(L) = 1  THEN L = 64: NEXT L: GOTO 6840
  679. 6800  NEXT L
  680. 6810  PRINT "I HAVE TAKEN YOUR LAST PIECE..."
  681. 6820  PRINT "AND BEATEN YOU IN "CC" MOVES!"
  682. 6830  GOTO 4490
  683. 6840  GOSUB 6940: REM  DOES WHITE HAVE ANY MOVES LEFT?
  684. 6850  IF MH = 0  THEN  GOTO 6890
  685. 6860  RETURN 
  686. 6870  REM  TESTS FOR STALEMATE
  687. 6880  GOSUB 6940: GOTO 6900
  688. 6890  GOSUB 7020: REM  DOES BLACK HAVE ANY MOVES LEFT?
  689. 6900  IF MH = 0  AND MC = 0  THEN  PRINT "THERE ARE NO LEGAL MOVES LEFT...": PRINT "WE HAVE REACHED STALEMATE - NO ONE WINS.": GOTO 4500
  690. 6910  IF MH = 1  AND MC = 0  THEN  PRINT "I HAVE NO LEGAL MOVE...": PRINT "YOU HAVE BEATEN ME IN "CT" MOVES!": GOTO 4490
  691. 6920  IF MH = 0  AND MC = 1  THEN  PRINT "YOU DO NOT HAVE ANY LEGAL MOVES LEFT...": PRINT "I HAVE BEATEN YOU IN "CC" MOVES!": GOTO 4490
  692. 6930  REM  TEST IF WHITE HAS ANY MOVES LEFT
  693. 6940 MH = 0
  694. 6950  FOR L = 1 TO 64
  695. 6960  IF HB(L) < >1  THEN  GOTO 6990
  696. 6970  IF HB(L) = 1  AND HB(L +8) = 0  AND CB(L +8) = 0  THEN MH = 1:L = 64: GOTO 6990
  697. 6980  IF (HB(L) = 1  AND CB(L +9) = 1)  OR (HB(L) = 1  AND CB(L +7) = 1)  THEN MH = 1:L = 64
  698. 6990  NEXT L
  699. 7000  RETURN 
  700. 7010  REM  TEST IF BLACK HAS ANY MOVES LEFT
  701. 7020 MC = 0
  702. 7030  FOR L = 64 TO 1  STEP  -1
  703. 7040  IF CB(L) < >1  THEN  GOTO 7070
  704. 7050  IF CB(L) = 1  AND CB(L -8) = 0  AND HB(L -8) = 0  THEN MC = 1:L = 1: GOTO 7070
  705. 7060  IF (CB(L) = 1  AND HB(L -9) = 1)  OR (CB(L) = 1  AND HB(L -7) = 1)  THEN MC = 1:L = 1
  706. 7070  NEXT L
  707. 7080  RETURN 
  708. 7090  HOME : PRINT "I/O ERROR. PLEASE CHECK DISK DRIVE.": END