home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 187.lha / chess.bas < prev    next >
BASIC Source File  |  1988-04-28  |  21KB  |  1,171 lines

  1. 10 
  2.  
  3. Print "Chess c.4 from "Creative Computing", Dec. 1981, page 276
  4. Print "Rewritten for the Amiga by Douglas Bullard, 6-7-86
  5. print "Compiled using the AC-Basic Compiler"
  6.  
  7. DEFINT a-z
  8. DIM c(64),move(6,22),cols(8,8),pairs(6),length(6),strength(6)
  9. a=0
  10. b=0
  11. x=0
  12. y=0
  13. s=0
  14. a0=0
  15. t=0
  16. a8=0
  17. a1=0
  18. a2=0
  19. a3=0
  20. a4=0
  21. b1=0
  22. b6!=0
  23. h=0
  24. m=0
  25. n=0
  26. p=0
  27. w=0
  28. a5=0
  29. i=1
  30.  
  31. for cunt=1 to 10000:next cunt
  32.  
  33. CLS
  34. print "Do you want instructions? "
  35. 1101 in$=inkey$:if in$="" goto 1101
  36. in$=UCASE$(in$)
  37. print in$
  38. IF in$="Y" THEN GOSUB 3170
  39. cl$="N"
  40. CLS
  41. Input "What is your name";b$
  42. IF b$="" THEN b$="Gomer   " ELSE b$=LEFT$(b$,9)
  43. CLS
  44. input "Level of play (1-24)"; b8!
  45. IF b8!=0 THEN 
  46.    b8!=1
  47.    b7!=1+RND/2
  48. ELSE
  49.    b7!=(b8!+1+RND)/2
  50. END IF
  51.  
  52. CLS
  53. print "Do you want white?"
  54. 1011 c$=inkey$:if c$="" goto 1011
  55. c$=UCASE$(c$)
  56. GOSUB 2590
  57. flag1=1
  58. IF c$<> "Y" THEN flag1=0:GOSUB 3430
  59. CLS
  60. print "Do you want to recall a previous game?"
  61. 1111 prev$=inkey$:if prev$="" goto 1111
  62. prev$=UCASE$(prev$)    
  63. SCREEN 1,640,400,4,4
  64. WINDOW 2, "AmigaChess",,15,1
  65.  
  66.     PALETTE 0,0,.1,.03
  67.     PALETTE 1,.9,0,0
  68.     PALETTE 2,.8,0,0
  69.     PALETTE 3,.714,0,0
  70.     PALETTE 4,.571,0,0
  71.     PALETTE 5,.429,0,0
  72.     PALETTE 6,.228,0,0
  73.     PALETTE 7,.143,0,0
  74.     PALETTE 8,.1,.1,.1
  75.     PALETTE 9,0,0,.143
  76.     PALETTE 10,0,0,.228
  77.     PALETTE 11,0,0,.429
  78.     PALETTE 12,0,0,.571
  79.     PALETTE 13,0,0,.714
  80.     PALETTE 14,0,0,.8
  81.     PALETTE 15,0,0,.9
  82. IF prev$<>"Y" THEN GOSUB 2840:GOTO 740
  83. CLS
  84. Input "What is the game name"; gamename$
  85. gamename$="chess."+gamename$
  86. PRINT "OK, saving ";gamename$;
  87. OPEN "I",#1,gamename$
  88.  
  89. FOR al=1 TO 8
  90.    FOR be=1 TO 8
  91.       IF NOT EOF(1) THEN
  92.          INPUT #1,a(be,al)
  93.       ELSE
  94.            GOSUB 2840
  95.          GOTO 740
  96.       END IF
  97. NEXT be,al
  98.  
  99. GOSUB 2840
  100. GOTO 740
  101.  
  102. 300 IF UCASE$(cl$)="Y" THEN 
  103.    LOCATE 5,64
  104.    COLOR 4,8
  105.    PRINT "Start ";TIME$;
  106.    LOCATE 6,64
  107.    PRINT STRING$(14," ");
  108. END IF
  109.  
  110. 440 f!=-99
  111. a0=0
  112.  
  113. FOR j=1 TO 8
  114.    FOR k=1 TO 8
  115.       IF a(j,k)=99 THEN a6=j:a7=k
  116.    NEXT k
  117. NEXT j
  118.  
  119. FOR x=1 TO 8
  120.    FOR y=1 TO 8
  121.       IF a(x,y)<0 THEN 
  122.          GOSUB 910
  123.          IF f!>=b7! THEN 580
  124.       END IF
  125.    NEXT y
  126. NEXT x
  127.  
  128. IF f!>=-9 THEN 580 ELSE GOSUB 2840
  129. LOCATE 4,64
  130. PRINT "I concede"
  131. GOTO 4230
  132.  
  133. 580 a(r,u)=a(e,q)
  134. a(e,q)=1
  135. IF a(r,u)=-2 AND u=1 THEN a(r,u)=-9
  136. x=r
  137. y=u
  138. a0=4
  139. GOSUB 910
  140.  
  141. LINE (e*55-55,(190-q*24)*2)-STEP(54,24*2),1,b
  142. LINE (r*55-55,(190-u*24)*2)-STEP(54,24*2),1,b
  143. LOCATE 4,64
  144. PRINT "is my move    ";
  145. LOCATE 3,64
  146. PRINT CHR$(e+64);q;"- ";CHR$(r+64);u;
  147.  
  148. IF UCASE$(cl$)="Y" THEN LOCATE 6,64:PRINT "Stop ";TIME$;
  149. x=e
  150. y=q
  151. GOSUB 2840
  152. x=r
  153. y=u
  154.  
  155. IF c=1 THEN
  156.    LOCATE 4,64
  157.    PRINT "Check";b$;
  158.    c=0
  159. END IF
  160.  
  161. 740 IF x$="S" THEN 
  162.    GOSUB 3790
  163.    b7!=3*RND
  164.    LOCATE 1,64
  165.    PRINT "Self Playing";
  166.    GOSUB 4430
  167.    GOTO 440 
  168. ELSE 
  169.    LOCATE 2,64
  170.    PRINT "Move ";b$;
  171.    GOSUB 3500
  172.    d=0
  173.    b4=a
  174.    b9=b
  175.    b5=0
  176.    IF a(x,y)=2 AND y=5 AND b=6 AND a(a,b)=1 AND ABS(a-x)=1 THEN 
  177.       b5=1
  178.       GOTO 770
  179.    END IF
  180. END IF
  181.  
  182. IF x$="K" OR x$="Q" THEN
  183.    GOSUB 2840
  184.    LOCATE 2,65
  185.    PRINT STRING$(14," ");
  186.    GOTO 440
  187. END IF
  188.  
  189. IF x$="S" THEN
  190.    cl$="N"
  191.    GOTO 740
  192. ELSE
  193.    a0=3
  194.    GOSUB 900
  195.    IF d=0 THEN
  196.       LOCATE 3,64
  197.       PRINT "Illegal";
  198.       GOTO 740
  199.    END IF
  200. END IF
  201.  
  202. 770 LOCATE 2,64: PRINT "OK            ";
  203. a=b4
  204. b=b9
  205. a(a,b)=a(x,y)
  206. a(x,y)=1
  207. GOSUB 2840
  208. x=a
  209. y=b
  210. IF n$="N" THEN GOSUB 2840: n$=" "
  211.  
  212. IF a(a,b)=2 AND b=8 THEN
  213.    LOCATE 2,64
  214.    PRINT "What piece";
  215.    GOSUB 4350
  216.    x=a: y=b
  217.    GOSUB 2840
  218.    LOCATE 2,64
  219.    PRINT STRING$(14," ");
  220.    LOCATE 3,64
  221.    PRINT STRING$(14," ");
  222. END IF
  223.  
  224. IF b5=1 THEN 
  225.    a(a,b)=1
  226.    x=a
  227.    y=b-1
  228.    GOSUB 2840
  229. END IF
  230.  
  231. 890 GOTO 440
  232. 900 REM
  233. ON a(x,y) GOTO 10,1520,10,1270,1070,10,920,10,1070: GOTO 1460
  234.  
  235. 910 ON (-a(x,y)) GOTO 10,1640,10,1270,1070,10,920,10,1070: GOTO 1460
  236. 920 b=y
  237. a=x+1
  238. ender=8
  239.  
  240. 940   GOSUB 2040
  241. IF s=0 THEN
  242.    a=a+1
  243.    IF a<=ender THEN 940
  244. END IF
  245.  
  246. a=x-1
  247. ender=1
  248.  
  249. 970   GOSUB 2040
  250. IF s=0 THEN
  251.    a=a-1
  252.    IF a>=ender THEN 970
  253. END IF  
  254.  
  255. a=x
  256. b=y+1
  257. ender=8
  258.  
  259. 1010   GOSUB 2040
  260. IF s=0 THEN
  261.    b=b+1
  262.    IF b<=ender THEN 1010
  263. END IF
  264.  
  265. b=y-1
  266. ender=1
  267.  
  268. 1040   GOSUB 2040
  269. IF s=0 THEN
  270.    b=b-1
  271.    IF b>=ender THEN 1040
  272. END IF
  273.  
  274. RETURN
  275.  
  276. 1070 b=y
  277. a=x+1
  278. ender=8
  279.  
  280. 1090   b=b+1
  281. GOSUB 2040
  282.  
  283. IF s=0 THEN
  284.    a=a+1
  285.    IF a<=ender THEN 1090
  286. END IF
  287.  
  288. b=y
  289. a=x-1
  290. ender=1
  291.  
  292. 1140   b=b-1
  293.  
  294. GOSUB 2040
  295.  
  296. IF s=0 THEN
  297.    a=a-1
  298.    IF a>=ender THEN 1140
  299. END IF
  300.  
  301. b=y
  302. a=x-1
  303. ender=1
  304.  
  305. 1190   b=b+1
  306. GOSUB 2040
  307.  
  308. IF s=0 THEN
  309.    a=a-1
  310.    IF a>=ender THEN 1190
  311. END IF
  312.  
  313. b=y
  314. a=x+1
  315. ender=8
  316.  
  317. 1231   b=b-1
  318. GOSUB 2040
  319.  
  320. IF s=0 THEN
  321.    a=a+1
  322.    IF a<=ender THEN 1231
  323. END IF
  324.  
  325. IF ABS(a(x,y))=9 THEN 920 ELSE RETURN
  326.  
  327. 1270 a=x+2
  328. b=y+1
  329. IF a<9 AND b<9 THEN GOSUB 2060
  330. b=b-2
  331. IF b>0 AND a<9 THEN GOSUB 2060
  332. a=a-4
  333. IF a>0 AND b>0 THEN GOSUB 2060
  334. b=b+2
  335. IF b<9 AND a>0 THEN GOSUB 2060
  336. a=a+1
  337. b=b+1
  338. IF a>0 AND a<9 AND b<9 THEN GOSUB 2060
  339. b=b-4
  340. IF b>0 AND a>0 AND a<9 THEN GOSUB 2060
  341. a=a+2
  342. IF a>0 AND a<9 AND b>0 THEN GOSUB 2060
  343. b=b+4
  344. IF b<9 AND a>0 AND a<9 THEN GOSUB 2060
  345. RETURN
  346.  
  347. 1460 FOR a=x-1 TO x+1
  348.       FOR b=y-1 TO y+1
  349.          IF a(a,b)<>0 THEN GOSUB 2060
  350.       NEXT
  351. NEXT
  352.  
  353. RETURN
  354.  
  355. 1520 a=x
  356. IF y>2 THEN 1560
  357. b=y+1
  358.  
  359. IF a(a,b)=1 THEN 
  360.    GOSUB 2070
  361.    b=b+1
  362.    IF a(a,b)=1 THEN
  363.       GOSUB 2070
  364.       GOTO 1580
  365.    ELSE
  366.       GOTO 1580
  367.    END IF
  368. ELSE
  369.    GOTO 1580
  370. END IF
  371.  
  372. 1560 b=y+1
  373. IF a(a,b)=1 THEN GOSUB 2070
  374.  
  375. 1580 a=x+1
  376. b=y+1
  377. IF a(a,b)<0 THEN GOSUB 2070
  378. a=a-2
  379. IF a(a,b)<0 THEN GOSUB 2070
  380. RETURN
  381.  
  382. 1640 a=x
  383. IF y<7 THEN 1680
  384. b=y-1
  385.  
  386. IF a(a,b)=1 THEN
  387.    GOSUB 2070
  388.    b=b-1
  389.    IF a(a,b)=1 THEN
  390.       GOSUB 2070
  391.       GOTO 1700
  392.    ELSE 
  393.       GOTO 1700
  394.    END IF
  395. ELSE
  396.    GOTO 1700
  397. END IF
  398.  
  399. 1680 b=y-1
  400.  
  401. IF a(a,b)=1 THEN GOSUB 2070
  402.  
  403. 1700 a=x-1
  404.  
  405. b=y-1
  406. IF a(a,b)>1 THEN GOSUB 2070
  407. a=a+2
  408. IF a(a,b)>1 THEN GOSUB 2070
  409. RETURN
  410.  
  411. 1760 t=a(a,b)
  412.  
  413. IF t=-99 THEN b1=t: RETURN
  414. a5=s
  415.  
  416. IF ABS(t)<=a(x,y) THEN 
  417.    a(a,b)=a(x,y)
  418.    a(x,y)=1
  419.    GOTO 1820
  420. END IF
  421.  
  422. 1800 IF t<b1 THEN b1=t
  423.  
  424. s=a5
  425. RETURN
  426.  
  427. 1820 a1=x
  428. a2=y
  429. a3=a
  430. a4=b
  431. a8=t
  432. a0=2
  433.  
  434. FOR x=1 TO 8
  435.    FOR y= 1 TO 8
  436.       IF a(x,y)<0 THEN
  437.          GOSUB 910
  438.          IF t=0 THEN 1930
  439.       END IF
  440.    NEXT
  441. NEXT
  442.  
  443. 1930 x=a1
  444. y=a2
  445. a=a3
  446. b=a4
  447. a0=5
  448. a(x,y)=a(a,b)
  449. a(a,b)=a8
  450. GOTO 1800
  451. '*************************************************
  452. '* This subroutine checks the legality of a move *
  453. '*************************************************
  454.  
  455. 2040 s=0
  456. IF a(a,b)=1 THEN
  457.    GOTO 2070
  458. ELSEIF a(a,b)=0 THEN 
  459.    s=1
  460.    RETURN
  461. ELSEIF SGN(a(a,b))=SGN(a(x,y)) THEN
  462.    s=1
  463.    RETURN
  464. ELSE 
  465.    s=1
  466.    GOTO 2070
  467. END IF
  468.  
  469. 2060 IF a(a,b)=1 THEN 
  470.    GOTO 2070
  471. ELSEIF SGN(a(a,b))=SGN(a(x,y)) THEN
  472.    RETURN
  473. END IF
  474.  
  475. 2070 REM
  476. ON a0 GOTO 2090,2110,2130,2150,2170
  477. GOTO 2180
  478.  
  479. 2090 IF a6=a AND a7=b THEN b1=b1+1
  480. RETURN
  481.  
  482. 2110 IF a3=a AND a4=b THEN t=0
  483. RETURN
  484.  
  485. 2130 IF b4=a AND b9=b THEN d=1
  486. RETURN
  487.  
  488. 2150 IF a6=a AND a7=b THEN c=1
  489. RETURN
  490.  
  491. 2170 IF a(a,b)<0 THEN 1760 ELSE RETURN
  492.  
  493. 2180 b3=s
  494. w=x
  495. m=y
  496. n=a
  497. h=b
  498. p=a(a,b)
  499. a(a,b)=a(x,y)
  500. a(x,y)=1
  501. b1=0
  502. a0=5
  503.  
  504. FOR x=1 TO 8
  505.    FOR y=1 TO 8
  506.       IF a(x,y)>1 THEN GOSUB 900
  507.    NEXT y
  508. NEXT x
  509.  
  510. x=n
  511. y=h
  512. a0=1
  513. GOSUB 910
  514. a0=0
  515. s=b3
  516. x=w
  517. y=m
  518. a=n
  519. b=h
  520. a(x,y)=a(a,b)
  521. a(a,b)=p
  522. b6!=1/(ABS(4.5-a)+ABS(4.5-b)+1)
  523. IF a(x,y)<-2 AND a(x,y)>-9 THEN b6!=b6!+1/(ABS(a6-a)+ABS(a7-b)+5)+RND/15
  524. g!=p+b1+b6!
  525.  
  526. IF p=99 THEN 
  527.    GOSUB 2840
  528.    LOCATE 4,64
  529.    PRINT "Mate ";b$; 
  530.    GOTO 4230
  531. END IF
  532.  
  533. IF g!<=f! THEN RETURN
  534. f!=g!
  535. e=x
  536. q=y
  537. r=a
  538. u=b
  539. RETURN
  540.  
  541.  
  542. '*********************************
  543. '* Initialize positions on board *
  544. '*********************************
  545.  
  546. 2590 CLS
  547. restore positionsdata
  548. FOR y=1 TO 8
  549.    FOR x=1 TO 8
  550.       READ a(x,y)
  551.    NEXT x
  552. NEXT y
  553.  
  554. Positionsdata:
  555. DATA 7,4,5,9,99,5,4,7
  556. DATA 2,2,2,2,2,2,2,2
  557. DATA 1,1,1,1,1,1,1,1
  558. DATA 1,1,1,1,1,1,1,1
  559. DATA 1,1,1,1,1,1,1,1
  560. DATA 1,1,1,1,1,1,1,1
  561. DATA -2,-2,-2,-2,-2,-2,-2,-2
  562. DATA -7,-4,-5,-9,-99,-5,-4,-7
  563.  
  564. movesdata:
  565. '  knight
  566.       DATA 8, 1,2,  -1,-2,  2,1,  2,-1,  -1,2,  1,-2,  -2,-1,  -2,1,  0,2
  567. '  castle  
  568.       DATA 4, 8,0,  -8,0,  0,8,  0,-8,  8,1
  569. '  Bishop
  570.       DATA 1, 8,8,  8,1
  571. '  Queen
  572.       DATA 5, 8,8,  8,0,  0,8,  0,-8,  -8,0,  8,3
  573. '  King
  574.       DATA 8, 1,1,  1,-1,  -1,1,  -1,-1,  0,1,  -1,0,  1,0,  0,-1,   0,1
  575. '  Pawn
  576.       DATA 4, 1,1, -1,1, 0,1,  0,2,  0,1
  577.  
  578. restore movesdata
  579. FOR i=1 TO 6
  580.    READ pairs(i)
  581.    FOR j= 1 TO 2*pairs(i)
  582.       READ move(i,j)
  583.    NEXT j
  584.    READ length(i),strength(i)
  585. NEXT i
  586.  
  587. RETURN
  588.  
  589.  
  590. '**************************
  591. '* Draws board and pieces *
  592. '**************************
  593.  
  594. 2840  FOR i=1 TO 8
  595.       FOR j=1 TO 8
  596.          cols(i,j)=0
  597.       NEXT
  598.    NEXT
  599.  
  600. FOR i=1 TO 8
  601.    FOR j=1 TO 8
  602.       IF a(i,j)=1 THEN GOTO 2737
  603.       pi=6
  604.       IF ABS(a(i,j))=4 THEN pi=1
  605.       IF ABS(a(i,j))=7 THEN pi=2
  606.       IF ABS(a(i,j))=5 THEN pi=3
  607.       IF ABS(a(i,j))=9 THEN pi=4
  608.       IF ABS(a(i,j))=99 THEN pi=5
  609.       cols(i,j)=cols(i,j)+strength(pi)*SGN(a(i,j))
  610.       FOR pair=1 TO pairs(pi)*2 STEP 2
  611.          x=move(pi,pair)+i
  612.          y=move(pi,pair+1)+j
  613.          IF a(i,j)=-2 THEN
  614.             x=i-move(pi,pair)
  615.             y=j-move(pi,pair+1)
  616.          END IF
  617.          stepx=1
  618.          IF x<i THEN stepx=-1
  619.          stepy=1
  620.          IF y<j THEN stepy=-1
  621.          IF x=i AND y=j THEN 2735
  622. '  pawn, king, or knight
  623.       
  624.          IF length(pi)=0 THEN
  625.             IF pair>=6 THEN            
  626.                IF a(i,j)=-2 AND j<>7 THEN 2735
  627.                IF a(i,j)=2 AND j<>2 THEN 2735
  628.             END IF
  629.             IF x<1 OR x>8 OR y<1 OR y>8 THEN 2735
  630.             cols(x,y)=cols(x,y)+strength(pi)*SGN(a(i,j))
  631.          ELSEIF move(pi,pair)=0 OR move(pi,pair+1)=0 THEN
  632.           
  633.             FOR L=i TO x STEP stepx
  634.                FOR m=j TO y STEP stepy
  635.                   IF L<1 OR L>8 OR m<1 OR m>8 THEN 2736          
  636.                   IF L=i AND m=j THEN 
  637.                      GOTO 2736
  638.                   ELSE
  639.                      cols(L,m)=cols(L,m)+strength(pi)*SGN(a(i,j))
  640.                   END IF
  641.                IF a(L,m)<>1 THEN GOTO 2735
  642. 2736               NEXT m
  643.             NEXT L
  644.          ELSE           
  645. ' Diagonals           
  646.             FOR ll=1 TO 8
  647.                L=i+ll
  648.                m=j+ll
  649.                IF L<9 AND m<9 THEN cols(L,m)=cols(L,m)+strength(pi)*SGN(a(i,j))
  650.                IF a(L,m)<>1 THEN 2731
  651.             NEXT ll
  652. 2731            FOR ll=1 TO 8
  653.                L=i+ll
  654.                m=j-ll
  655.                IF L<9 AND m>0 THEN cols(L,m)=cols(L,m)+strength(pi)*SGN(a(i,j))
  656.                IF a(L,m)<>1 THEN 2732
  657.             NEXT ll
  658. 2732            FOR ll=1 TO 8
  659.                L=i-ll
  660.                m=j+ll
  661.                IF L>0 AND m<9 THEN cols(L,m)=cols(L,m)+strength(pi)*SGN(a(i,j))
  662.                IF a(L,m)<>1 THEN 2734
  663.             NEXT ll
  664. 2734            FOR ll=1 TO 8
  665.                L=i-ll
  666.                m=j-ll
  667.                IF L>0 AND m>0 THEN cols(L,m)=cols(L,m)+strength(pi)*SGN(a(i,j))
  668.                IF a(L,m)<>1 THEN 2735
  669.             NEXT ll
  670.          END IF
  671. 2735      NEXT pair   
  672. 2737  NEXT j   
  673. NEXT i
  674.  
  675. FOR x=1 TO 8
  676.    FOR y=1 TO 8
  677.       GOSUB 2845
  678.    NEXT y
  679. NEXT x
  680.  
  681. COLOR 5,0 
  682. RETURN
  683.  
  684. '****************************************************
  685. '* Subroutine to draw a square and the piece on it. *
  686. '* Square is identified by the coordinates x,y      *
  687. '****************************************************
  688.  
  689. 2845 yc=y*24
  690. xc=x*55
  691.  
  692. colors=(cols(x,y)+8)     
  693. IF colors >15 THEN colors=15
  694. IF colors <1 THEN colors=1
  695. LINE (xc-55,(190-yc)*2)-STEP(54,23*2),colors,bf
  696. LINE (x*55-55,(190-y*24)*2)-STEP(54,24*2),0,b
  697.  
  698. IF SGN(a(x,y))=-1 THEN 
  699.    COLOR 11,colors
  700.    Ccolor=11 
  701. ELSE 
  702.    COLOR 5,colors
  703.    Ccolor=5
  704. END IF
  705.  
  706. piece=ABS(a(x,y))
  707. IF piece=7 THEN GOSUB rook
  708. IF piece=4 THEN GOSUB knight
  709. IF piece=5 THEN GOSUB bishop
  710. IF piece=9 THEN GOSUB queen
  711. IF piece=99 THEN GOSUB king
  712. IF piece=2 THEN GOSUB pawn
  713.  
  714. COLOR 0,colors
  715. RETURN
  716. '****************
  717. '* Instructions *
  718. '****************
  719.  
  720. 3170 CLS
  721.  
  722. Print " Welcome to the game of Amiga Chess."
  723. Print 
  724. Print 
  725. Print 
  726. Print " There are a few differences between Amiga Chess and normal chess."
  727. Print " These differences have to do with the way the board is displayed,"
  728. Print " and the way the pieces are moved."
  729. Print 
  730. Print " The board is a mosaic of different colors, all shades of red, "
  731. Print " shades of blue, or completely black.  The intensity of the shade indicates"
  732. Print " which side dominates it the most, and to what degree.  A bright red square"
  733. Print " is heavily dominated by the red player," 
  734. Print " while a dim red square may be only mildly dominated by red.  "
  735. Print " A square that appears black is equally dominated by both sides."
  736. Print 
  737. Print 
  738. Print " To make a move, indicate the piece with a click of the left mouse "
  739. Print " button, then indicate the square you want to move it to."
  740. Print " Let the Amiga do the rest."
  741. print
  742. PRINT " Hit any key to continue"
  743. WHILE INKEY$="":WEND
  744. CLS
  745.  
  746. Print " 1. Special commands during player's move are:"
  747. Print "         'K' - to castle king side."
  748. Print "         'Q' - to castle queen side."
  749. Print "         'X' - to exhange pieces and let the computer play."
  750. Print "         'S' - to let the computer play by itself."
  751. Print "         'M' - to modify the board and enter the square followed by 'C', 'P'"
  752. Print "               or 'E' for computer, player or empty and 'S', 'P', 'N', 'B',"
  753. Print "               'R', 'Q', or 'K' for square, pawn,"
  754. Print "               knight, bishop, rook, queen, or king."
  755. Print "         'Z' - to escape from modify and let the computer move."
  756. Print "         'I' - to get instructions again."
  757. Print "         'L' - to look at or change level of play."
  758. Print " 2. To promote to P, N, B, R, or Q, enter the letter when prompted."
  759. Print " 3. To capture 'en passant' specify the 'from' - 'to' squares."
  760. Print " 4. Levels of play are from one to twenty four."
  761. Print " 5. Computer assumes mate if king is left in check, so be sure to watch for"
  762. Print "    the check message."
  763. Print " 6. If a move is illegal or an entry error is made,"
  764. Print "    simply type in a new move."
  765. Print "    A move may be started over by forcing an error. (i. e., '9')"
  766. Print " 7. To record a game on disk for future playing, type an 'R'."
  767.  
  768. PRINT " Hit any key to continue and return to the game."
  769. WHILE INKEY$="":WEND
  770. RETURN
  771.  
  772. 3430 i=-1
  773. a(4,1)=99
  774. a(5,1)=9
  775. a(4,8)=-99
  776. a(5,8)=-9
  777. IF flag1=1 THEN GOSUB 2840
  778. RETURN
  779.  
  780. 3500 LOCATE 1,64: PRINT STRING$(14," ");
  781. mou=MOUSE(0)
  782.  
  783. 3510 x$=""
  784.  
  785. WHILE x$="" AND MOUSE(0)=0
  786.    x$=UCASE$(INKEY$)
  787. WEND
  788. FOR dgb=1 TO 2000
  789. NEXT dgb
  790. IF x$<>"" GOTO 3570
  791.  
  792. FOR ex=1 TO 8
  793.    IF MOUSE(1)>ex*55-55 AND MOUSE(1)<ex*55-1 THEN
  794.       x$=CHR$(ex+64)
  795.       x=ex
  796.       GOTO 3520
  797.    END IF
  798. NEXT ex
  799.  
  800. 3520 FOR why=1 TO 8
  801.       IF MOUSE(2)>(190-why*24)*2 AND MOUSE(2)<(214-why*24)*2 THEN
  802.          y=why
  803.          GOTO 3530
  804.       END IF
  805. NEXT why
  806.  
  807. 3530 LINE (x*55-55,(190-y*24)*2)-STEP(54,24*2),15,b
  808. mou=MOUSE(0)
  809. GOTO 3660             
  810.  
  811. 3570 IF x$="N" THEN n$=x$
  812.  
  813. IF x$="R" THEN
  814.    LOCATE 1,64
  815.    INPUT "What name";gamename$
  816.    gamename$="chess."+gamename$
  817.    PRINT gamename$;
  818.    OPEN gamename$ FOR OUTPUT AS #1
  819.    FOR al=1 TO 8
  820.       FOR be=1 TO 8
  821.          WRITE #1,a(be,al)
  822.    NEXT be,al
  823.    CLOSE #1
  824.    WINDOW CLOSE 2
  825.    CLS
  826.    END
  827. END IF
  828.  
  829. IF x$="N" THEN 440
  830.  
  831. IF x$="K" AND a(5,1)=99 AND a(8,1)=7 THEN 
  832.    a(5,1)=1
  833.    a(8,1)=1
  834.    a(7,1)=99
  835.    a(6,1)=7
  836.    GOTO 3750 
  837. END IF
  838.  
  839. IF x$="Q" AND a(5,1)=99 AND a(1,1)=7 THEN 
  840.    a(5,1)=1
  841.    a(1,1)=1
  842.    a(3,1)=99
  843.    a(4,1)=7
  844.    GOTO 3750
  845. END IF
  846.  
  847. IF x$="K" AND a(4,1)=99 AND a(1,1)=7 THEN 
  848.    a(4,1)=1
  849.    a(1,1)=1
  850.    a(2,1)=99
  851.    a(3,1)=7
  852.    GOTO 3750  
  853. END IF
  854.  
  855. IF x$="Q" AND a(4,1)=99 AND a(8,1)=7 THEN 
  856.    a(4,1)=1
  857.    a(8,1)=1
  858.    a(6,1)=99
  859.    a(5,1)=7
  860.    GOTO 3750
  861. END IF
  862.  
  863. IF x$="X" THEN 
  864.    GOSUB 3790
  865.    LOCATE 1,64
  866.    PRINT "Exchanging   ";
  867.    GOSUB 4430
  868.    IF cl$="Y" THEN 
  869.       LOCATE 5,60
  870.       PRINT "Start ";TIME$;
  871.       GOTO 440 
  872.    ELSE
  873.       GOTO 440
  874.    END IF
  875. END IF
  876.  
  877. IF x$="S" THEN 3780
  878. IF x$="M" THEN GOSUB 3830
  879.  
  880. IF x$="I" THEN 
  881.    GOSUB 3170
  882.    CLS
  883.    GOSUB 2840
  884.    LOCATE 1,64
  885.    PRINT "Move ";b$;
  886. END IF
  887.  
  888. IF x$="L" THEN GOSUB 4140
  889. GOTO 3510
  890.  
  891. 3660 LOCATE 1,65: PRINT x$;
  892. 3670 LOCATE 1,66: PRINT y;
  893.  
  894. LOCATE 1,69: PRINT "-";
  895.  
  896. IF a(x,y)<2 OR a(x,y)>99 THEN 
  897.    LOCATE 4,64
  898.    PRINT "Entry error  ";
  899.    GOTO 3500
  900. END IF
  901.  
  902. 3710 WHILE MOUSE(0)=0:WEND
  903.  
  904. FOR ex=1 TO 8
  905.    IF MOUSE(1)>ex*55-55 AND MOUSE(1)<ex*55-1 THEN
  906.       a$=CHR$(ex+64)
  907.       a=ex
  908.       GOTO 3540
  909.    END IF
  910. NEXT ex
  911.  
  912. 3540 FOR why=1 TO 8
  913.       IF MOUSE(2)>(190-why*24)*2 AND MOUSE(2)<(214-why*24)*2 THEN
  914.          b=why
  915.          GOTO 3550
  916.       END IF
  917. NEXT why
  918.  
  919. 3550 LINE (a*55-55,(190-b*24)*2)-STEP(54,24*2),15,b
  920. LOCATE 1,71:PRINT a$
  921. LOCATE 1,72: PRINT b;
  922.  
  923. 3750 IF x$="K" OR x$="Q" THEN 
  924.    LOCATE 1,64
  925.    PRINT "Cstl. ";x$;"-side";
  926. END IF
  927.  
  928. GOSUB 3790
  929.  
  930. IF cl$="Y" THEN 
  931.    LOCATE 5,64
  932.    PRINT "Start ";TIME$;
  933. END IF
  934.  
  935. 3780 RETURN
  936.  
  937. 3790 FOR j=2 TO 7
  938.       LOCATE j,64
  939.       PRINT STRING$(16," ");
  940. NEXT j
  941.  
  942. RETURN
  943.  
  944. 3830 GOSUB 3790
  945. LOCATE 1,64: PRINT "Modifying    ";
  946.  
  947. 3850 GOSUB 4060
  948. IF m$<"A" OR m$>"H" THEN 3850
  949. x=VAL(CHR$(ASC(m$)-16))
  950. LOCATE 2,64: PRINT m$;
  951.  
  952. 3890 m$=INKEY$: IF m$<"1" OR m$>"8" THEN 3890
  953. y=VAL(m$)
  954. LOCATE 2,66: PRINT m$;" = ";
  955.  
  956. 3920 m$=UCASE$(INKEY$)
  957. IF m$="C" OR m$="P" OR m$="E" THEN 
  958.    s1$=m$
  959.    LOCATE 2,70
  960.    PRINT m$;
  961. ELSE
  962.    GOTO 3920
  963. END IF
  964.  
  965. 3930 m$=UCASE$(INKEY$):
  966. IF m$="S" OR m$="P" OR m$="N" OR m$="B" OR m$="R" OR m$="Q" OR m$="K" THEN 
  967.    v$=m$
  968.    LOCATE 2,72
  969.    PRINT m$;
  970. ELSE
  971.    GOTO 3930
  972. END IF
  973.  
  974. IF v$="P" THEN v1=2
  975. IF v$="N" THEN v1=4
  976. IF v$="B" THEN v1=5
  977. IF v$="R" THEN v1=7
  978. IF v$="Q" THEN v1=9
  979. IF v$="K" THEN v1=99
  980. IF v$="S" THEN v1=1
  981. IF s1$="C" AND v1<>1 THEN v1=-v1
  982. a(x,y)=v1
  983. IF s1$="E" THEN a(x,y)=1
  984. GOSUB 2840
  985. GOTO 3830
  986.  
  987. 4060 m$=UCASE$(INKEY$)
  988. IF m$="N" THEN 
  989.    GOTO 4060
  990. ELSEIF m$="Z" THEN
  991.    GOSUB 3790
  992.    LOCATE 1,64
  993.    PRINT STRING$(14," ");
  994.    GOSUB 2840
  995. ELSE 
  996.    RETURN
  997. END IF
  998.  
  999. IF cl$="Y" THEN LOCATE 5,60: PRINT "Start ";TIME$;
  1000. GOTO 440
  1001. 4140 GOSUB 3790
  1002. LOCATE 1,64: PRINT "Level=";b8!;"   ";
  1003. LOCATE 2,64: PRINT"Change levels?";
  1004.  
  1005. 4170 c$=UCASE$(INKEY$)
  1006. IF c$="N" THEN 
  1007.    GOTO 4225
  1008. ELSEIF c$="Y" THEN 
  1009.    LOCATE 1,71
  1010.    PRINT STRING$(7," ");
  1011.    GOSUB 3790
  1012. ELSE 
  1013.    GOTO 4170
  1014. END IF
  1015.  
  1016. 4180 l1$=INKEY$
  1017. IF l1$="" THEN 
  1018.    GOTO 4180
  1019. ELSEIF l1$>="0" AND l1$<"9" THEN 
  1020.    LOCATE 1,71
  1021.    PRINT l1$ 
  1022. ELSE 
  1023.    GOTO 4180
  1024. END IF
  1025.  
  1026. 4190 l2$=INKEY$
  1027. IF l2$="" THEN 
  1028.    GOTO 4190 
  1029. ELSEIF l2$<"0" OR l2$>"9" THEN 
  1030.    l2$=l1$
  1031.    l1$="0"
  1032. END IF
  1033.  
  1034. b8!=VAL(l1$)*10+VAL(l2$)
  1035. b7!=b8!/2
  1036. LOCATE 1,71: PRINT l1$;l2$;
  1037.  
  1038. 4225 GOSUB 3790
  1039. LOCATE 1,64
  1040. PRINT STRING$(14," ");
  1041. LOCATE 2,64
  1042. PRINT "Move ";b$;
  1043. RETURN
  1044.  
  1045. 4230 IF cl$="Y" THEN LOCATE 6,64: PRINT "Stop ";TIME$;
  1046. LOCATE 9,62: PRINT "Hit 'P' to play";
  1047. LOCATE 10,62: PRINT "or 'B' for basic";
  1048.  
  1049. 4260 a$=UCASE$(INKEY$)
  1050. IF a$="" THEN 
  1051.    GOTO 4260
  1052. ELSEIF a$="B" THEN 
  1053.    CLS
  1054.    END
  1055. ELSEIF a$="P" THEN
  1056.    GOTO 10
  1057. ELSE 
  1058.    GOTO 4260
  1059. END IF 
  1060.  
  1061. GOSUB 3790
  1062. LOCATE 1,64: PRINT STRING$(14," ");
  1063. LOCATE 2,64: PRINT "Move ";b$;
  1064. RETURN
  1065.  
  1066.  
  1067. '*********************
  1068. '* Promotion routine *
  1069. '*********************
  1070.  
  1071. 4350 LOCATE 3,64: PRINT "P, N, B, R, Q";
  1072. 4360 z$=UCASE$(INKEY$)
  1073.  
  1074. IF z$="P" THEN   a(a,b)=2: GOTO 4420
  1075. IF z$="N" THEN a(a,b)=4: GOTO 4420
  1076. IF z$="B" THEN a(a,b)=5: GOTO 4420
  1077. IF z$="R" THEN a(a,b)=7: GOTO 4420
  1078. IF z$="Q" THEN a(a,b)=9: GOTO 4420
  1079. GOTO 4360
  1080.  
  1081. 4420 RETURN
  1082. 4430 i=-1
  1083. GOSUB 4470
  1084. GOSUB 2840
  1085. RETURN
  1086.  
  1087. 4470 L=0
  1088. FOR j=1 TO 8
  1089.    FOR k=1 TO 8
  1090.       L=L+1
  1091.       IF a(j,k)<>1 THEN c(L)=-a(j,k) ELSE c(L)=a(j,k)
  1092.    NEXT k
  1093. NEXT j
  1094.  
  1095. L=65
  1096. FOR j=1 TO 8
  1097.    FOR k=1 TO 8
  1098.       L=L-1
  1099.       a(j,k)=c(L)
  1100.    NEXT k
  1101. NEXT j
  1102.  
  1103. RETURN
  1104. END
  1105.  
  1106.  
  1107. pawn:
  1108. LINE ((x-1)*55+15,(183-(y-1)*2)*24)-STEP(25,5*2),,bf
  1109. LINE ((x-1)*55+24,(183-(y-1)*24)*2)-STEP(8,-8*2),,bf
  1110. CIRCLE ((x-1)*55+28,(172-(y-1)*24)*2),8
  1111. 'PAINT ((x-1)*55+28,172-(y-1)*24),4
  1112. 'CIRCLE ((x-1)*55+28,172-(y-1)*24),8,0
  1113. RETURN
  1114.  
  1115.  
  1116. rook:
  1117. LINE ((x-1)*55+15,(183-(y-1)*24)*2)-STEP(25,5*2),,bf
  1118. LINE ((x-1)*55+22,(183-(y-1)*24)*2)-STEP(12,-8*2),,bf
  1119. LINE ((x-1)*55+26,(174-(y-1)*24)*2)-STEP(4,-3*2),,bf
  1120. LINE ((x-1)*55+16,(174-(y-1)*24)*2)-STEP(4,-3*2),,bf
  1121. LINE ((x-1)*55+37,(174-(y-1)*24)*2)-STEP(4,-3*2),,bf
  1122. RETURN
  1123.  
  1124. bishop:
  1125. LINE ((x-1)*55+15,(183-(y-1)*2)*24)-STEP(25,5*2),,bf
  1126. LINE ((x-1)*55+24,(183-(y-1)*24)*2)-STEP(8,-8*2),,bf
  1127. 'CIRCLE ((x-1)*55+28,173-(y-1)*24),8,,,,.7
  1128. 'PAINT ((x-1)*55+28,172-(y-1)*24)
  1129. CIRCLE ((x-1)*55+28,(173-(y-1)*24)*2),8,,,,.7
  1130. RETURN
  1131.  
  1132. queen:
  1133. LINE ((x-1)*55+15,(183-(y-1)*24)*2)-STEP(25,5),,bf
  1134. LINE ((x-1)*55+24,(183-(y-1)*24)*2)-STEP(8,-8),,bf
  1135. LINE ((x-1)*55+20,(175-(y-1)*24)*2)-STEP(16,-3),,bf
  1136. CIRCLE ((x-1)*55+18,(170-(y-1)*24)*2),3
  1137. 'PAINT ((x-1)*55+18,170-(y-1)*24)
  1138. CIRCLE ((x-1)*55+29,(168-(y-1)*24)*2),3
  1139. 'PAINT ((x-1)*55+29,168-(y-1)*24)
  1140. CIRCLE ((x-1)*55+39,(170-(y-1)*24)*2),3
  1141. 'PAINT ((x-1)*55+39,170-(y-1)*24)
  1142. RETURN
  1143.  
  1144. king:
  1145. LINE ((x-1)*55+15,(183-(y-1)*24)*2)-STEP(25,5),,bf
  1146. LINE ((x-1)*55+24,(183-(y-1)*24)*2)-STEP(8,-8),,bf
  1147. LINE ((x-1)*55+20,(175-(y-1)*24)*2)-STEP(16,-3),,bf
  1148. CIRCLE ((x-1)*55+18,(168-(y-1)*24)*2),3
  1149. 'PAINT ((x-1)*55+18,168-(y-1)*24)
  1150. CIRCLE ((x-1)*55+29,(168-(y-1)*24)*2),3
  1151. 'PAINT ((x-1)*55+29,168-(y-1)*24)
  1152. CIRCLE ((x-1)*55+39,(168-(y-1)*24)*2),3
  1153. 'PAINT ((x-1)*55+39,168-(y-1)*24)
  1154. CIRCLE ((x-1)*55+24,(168-(y-1)*24)*2),7,,3.1415,6.283
  1155. CIRCLE ((x-1)*55+34,(168-(y-1)*24)*2),7,,3.1415,6.283
  1156. RETURN
  1157.  
  1158. knight:
  1159. LINE ((x-1)*55+15,(183-(y-1)*24)*2)-STEP(25,5*2),,bf
  1160. LINE ((x-1)*55+24,(183-(y-1)*24)*2)-STEP(8,-8*2),,bf
  1161. LINE ((x-1)*55+26,(168-(y-1)*24)*2)-STEP(-16,8*2)
  1162. LINE STEP(0,0)-STEP(0,2*2)
  1163. LINE STEP(0,0)-STEP(3,0)
  1164. LINE STEP(0,0)-STEP(7,-1*2)
  1165. LINE STEP(0,0)-STEP(15,0)
  1166. LINE STEP(0,0)-STEP(0,-9*2)
  1167. LINE STEP(0,0)-STEP(-8,0)
  1168. 'PAINT ((x-1)*55+28,169-(y-1)*24)
  1169. CIRCLE ((x-1)*55+26,(172-(y-1)*24)*2),1,0
  1170. RETURN
  1171.