home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib39b.dsk
/
PAWNS.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
25KB
|
708 lines
10 REM *************************
20 REM * PAWNS *
30 REM * BY DAVID ROTH *
40 REM * COPYRIGHT(C) 1990 *
50 REM * MINDCRAFT PUBL. CORP. *
60 REM * CONCORD, MA 01742 *
70 REM *************************
80 PRINT CHR$(21): ONERR GOTO 7090
90 IF PEEK(104) < >64 THEN POKE 103,1: POKE 104,64: POKE 16384,0: PRINT CHR$(4);"RUN PAWNS"
100 ONERR GOTO 6550
110 DIM CB(64): DIM HB(64): DIM MV(16,3)
120 N = RND( - PEEK(78))
130 IF J >0 THEN GOTO 320
140 CT = 0:J = 100
150 HOME
160 PRINT TAB( 18)"PAWNS"
170 PRINT TAB( 14)"BY DAVID ROTH"
180 PRINT TAB( 12)"COPYRIGHT(C) 1990"
190 PRINT TAB( 11)"MINDCRAFT PUBL.CORP."
200 PRINT : PRINT : PRINT : PRINT TAB( 16)"MAIN MENU"
210 PRINT : PRINT : PRINT
220 PRINT TAB( 10)"1. HELP"
230 PRINT : PRINT TAB( 10)"2. START GAME"
240 PRINT : PRINT TAB( 10)"3. QUIT"
250 PRINT : PRINT : PRINT : PRINT "PLEASE MAKE YOUR CHOICE:";
260 GET CH$
270 PRINT CH$
280 G = VAL(CH$)
290 IF G = 2 THEN GOTO 320
300 ON G = 1 GOSUB 4600: ON G = 3 GOSUB 4550
310 GOTO 150
320 HOME : PRINT : PRINT : PRINT : PRINT TAB( 13)"PLAYING LEVELS"
330 PRINT : PRINT : PRINT
340 PRINT TAB( 10)"1. JOURNEYMAN"
350 PRINT : PRINT TAB( 10)"2. ADVANCED"
360 PRINT : PRINT TAB( 10)"3. MASTER"
370 PRINT : PRINT TAB( 10)"4. GENIUS"
380 PRINT : PRINT TAB( 10)"ESC KEY TO BACK UP"
390 PRINT : PRINT : PRINT : PRINT "PLEASE MAKE YOUR CHOICE:";
400 GET CH$
410 IF ASC(CH$) = 27 THEN GOTO 150
420 PRINT CH$
430 G = VAL(CH$)
440 IF G = 1 THEN GOTO 490
450 IF G = 2 THEN LE = 1: GOTO 490
460 IF G = 3 THEN LE = 2: GOTO 490
470 IF G = 4 THEN LE = 3: GOTO 490
480 GOTO 320
490 GOSUB 4840: GOSUB 4880
500 HGR : HCOLOR= 3
510 GOSUB 4960
520 GOSUB 5050: GOSUB 5120
530 GOSUB 5330
540 IF LE = 2 THEN GOSUB 4250
550 IF LE = 3 THEN CR = 1:HR = 1
560 HOME : VTAB 21: REM RETURN POINT FOR MAIN LOOP
570 GOSUB 4770
580 PRINT "<ESC> TO MENU"; SPC( 10);LE$" LEVEL"
590 PRINT "MOVE THE PAWN AT ";: REM 1 SPACE
600 POKE 49168,0
610 GET L$: PRINT L$;: IF ASC(L$) = 27 THEN GOTO 6080
620 GET R$: PRINT R$;: IF ASC(R$) = 27 THEN GOTO 560
630 IF ASC(R$) = 8 THEN GOTO 610
640 PRINT SPC( 1);"TO ";: REM 1 SPACE
650 GET LL$: PRINT LL$;: IF ASC(LL$) = 27 THEN GOTO 560
660 IF ASC(LL$) = 8 THEN CALL -926: CALL -998: PRINT "MOVE THE PAWN AT "L$;R$;: CALL -1008: GOTO 620
670 GET RR$: PRINT RR$;: IF ASC(RR$) = 27 THEN GOTO 560
680 IF ASC(RR$) = 8 THEN GOTO 650
690 PRINT : PRINT : PRINT "PRESS RETURN TO MOVE, <---- TO CHANGE.";
700 CALL -998: CALL -998: FOR L = 1 TO 13: CALL -1008: NEXT L: GET G$
710 IF ASC(G$) = 27 THEN GOTO 560
720 IF ASC(G$) = 8 THEN CALL -1008: GOTO 670
730 R = VAL(R$)
740 IF ( ASC(L$) >64 AND ASC(L$) <73) OR ( ASC(L$) >96 AND ASC(L$) <105) THEN GOTO 760
750 GOSUB 5870: GOTO 560
760 IF R >0 AND R <9 THEN GOTO 780
770 GOSUB 5870: GOTO 560
780 RR = VAL(RR$)
790 IF ( ASC(LL$) >64 AND ASC(LL$) <73) OR ( ASC(LL$) >96 AND ASC(LL$) <105) THEN GOTO 810
800 GOSUB 5870: GOTO 560
810 IF RR >0 AND RR <9 THEN GOTO 830
820 GOSUB 5870: GOTO 560
830 GOSUB 5800: GOTO 840
840 REM LEGAL/ILLEGAL MOVES
850 IF HB(P1) = 0 THEN HOME : VTAB 21: PRINT "YOU DO NOT HAVE A PAWN AT "L$R$".": GOSUB 5880: GOTO 560
860 REM STRAIGHT-AHEAD MOVE
870 IF (P2 = P1 +8 AND HB(P2) = 0 AND CB(P2) = 0) THEN GOTO 980
880 REM DIAGONAL RIGHT MOVE
890 IF (P2 = P1 +9 AND CB(P2) = 1) THEN GOTO 980
900 REM DIAGONAL LEFT MOVE
910 IF (P2 = P1 +7 AND CB(P2) = 1) THEN GOTO 980
920 REM DOUBLE MOVE AT START
930 IF (P1 <9 AND P2 = P1 +16) THEN GOTO 950
940 GOTO 960
950 IF (HB(P2) = 0 AND HB(P2 -8) = 0 AND CB(P2) = 0 AND CB(P2 -8) = 0) THEN GOTO 980
960 GOSUB 5870: GOTO 560
970 REM MAKING PLAYER MOVE
980 GOSUB 5920
990 HCOLOR= 0
1000 GOSUB 5180: GOSUB 5240: REM ERASE OLD POSITION
1010 GOSUB 6000
1020 HCOLOR= 3
1030 GOSUB 5180: GOSUB 5240: REM DRAWING NEW POSITION
1040 REM FIXING ARRAYS
1050 HB(P2) = 1:HB(P1) = 0
1060 IF CB(P2) = 1 THEN CB(P2) = 0: PRINT CHR$(7)
1070 PRINT CHR$(7)
1080 SH = 1
1090 FOR L = 1 TO 8
1100 IF HB(L) = 1 THEN SH = 0
1110 NEXT L
1120 IF HR = 1 AND SH = 1 THEN GOSUB 5040: GOSUB 4880:HR = 0: PRINT CHR$(7)
1130 CT = CT +1
1140 GOSUB 6630: REM TESTS FOR HUMAN VICTORY
1150 REM COMPUTER MOVES SECTION
1160 HOME : VTAB 22
1170 PRINT "PLEASE WAIT WHILE I SELECT MY MOVE..."
1180 PC = 0
1190 IF GG = 1 THEN GOTO 1250
1200 IF RND(1) >.499 THEN GOTO 1250
1210 FOR K = 64 TO 1 STEP -1
1220 IF CB(K) = 1 THEN PC = PC +1:MV(PC,1) = K
1230 NEXT K
1240 GOTO 1280
1250 FOR K = 1 TO 64
1260 IF CB(K) = 1 THEN PC = PC +1:MV(PC,1) = K
1270 NEXT K
1280 FOR P = 1 TO PC
1290 GOSUB 1750
1300 NEXT P
1310 FOR W = 34 TO -5 STEP -1
1320 FOR P = 1 TO PC
1330 IF MV(P,2) = 0 THEN GOTO 1350
1340 IF MV(P,3) = >W THEN M = 1:TP = P:P = PC:W = -5
1350 NEXT P
1360 NEXT W
1370 IF M = 1 THEN M = 0:P = TP: GOTO 1390
1380 GOTO 6880
1390 IF A >0 THEN GOTO 1410
1400 IF CT <8 AND LE = 1 THEN GOSUB 3890
1410 GOSUB 1700
1420 REM MAKE THE MOVE
1430 REM ERASE OLD POSITION
1440 T = S1: GOSUB 6430
1450 HCOLOR= 0: GOSUB 5180
1460 REM DRAW NEW POSITION
1470 T = S2: GOSUB 6430
1480 IF HB(S2) = 1 THEN HB(S2) = 0: GOSUB 5240: CALL -198
1490 HCOLOR= 3: GOSUB 5180
1500 CB(S2) = 1:CB(S1) = 0
1510 T = 0: PRINT CHR$(7)
1520 REM TEST FOR AND REPLACES COMPUTER'S HOME ROW, IF LE=3
1530 SC = 1
1540 FOR L = 57 TO 64
1550 IF CB(L) = 1 THEN SC = 0
1560 NEXT L
1570 IF CR = 1 AND SC = 1 THEN GOSUB 5120: GOSUB 4840:CR = 0: CALL -198
1580 CC = CT
1590 GOSUB 6740: REM TESTS FOR COMPUTER VICTORY
1600 REM CLEARS OUT ALL OLD VALUES IN ARRAY MV
1610 FOR P = 1 TO PC
1620 FOR C = 0 TO 3
1630 MV(P,C) = 0
1640 NEXT C
1650 NEXT P
1660 IF A = 1 THEN A = 2
1670 FL = 0
1680 CALL -198: GOTO 560
1690 REM FIND FOR VALUES FOR COMPUTER MOVE
1700 S1 = MV(P,1):S2 = MV(P,2)
1710 RETURN
1720 REM FILL ARRAY MV WITH MOVES AND THEIR WEIGHT
1730 REM TOTAL OF 4 MOVES - START WITH WEAKEST
1740 REM SQ=SQUARE TOKEN
1750 SQ = MV(P,1)
1760 REM STRAIGHT-AHEAD 1 SQUARE
1770 IF CB(SQ -8) = 0 AND HB(SQ -8) = 0 THEN GOTO 1790
1780 GOTO 1970
1790 MV(P,2) = SQ -8:MV(P,3) = 6
1800 IF SQ <17 THEN GOTO 1940
1810 IF (SQ/8) - INT(SQ/8) = 0 THEN GOTO 1880
1820 IF INT(((SQ/8) - INT(SQ/8)) *10) = 1 THEN GOTO 1920
1830 REM COLS. B-G
1840 IF HB(SQ -17) = 1 OR HB(SQ -15) = 1 THEN MV(P,3) = MV(P,3) -4
1850 IF CB(SQ -17) = 1 OR CB(SQ -15) = 1 THEN MV(P,3) = MV(P,3) +1
1860 GOTO 1940
1870 REM COL. H
1880 IF HB(SQ -17) = 1 THEN MV(P,3) = MV(P,3) -4
1890 IF CB(SQ -17) = 1 THEN MV(P,3) = MV(P,3) +1
1900 GOTO 1940
1910 REM COL. A
1920 IF HB(SQ -15) = 1 THEN MV(P,3) = MV(P,3) -4
1930 IF CB(SQ -15) = 1 THEN MV(P,3) = MV(P,3) +1
1940 IF SQ -8 <9 THEN MV(P,3) = MV(P,3) +34
1950 SM = MV(P,3)
1960 REM DOUBLE MOVE AT START
1970 IF SQ <57 THEN GOTO 2190
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
1990 GOTO 2190
2000 IF SQ <60 OR SQ >61 THEN MV(P,3) = MV(P,3) -2
2010 IF (SQ/8) - INT(SQ/8) = 0 THEN GOTO 2080
2020 IF INT(((SQ/8) - INT(SQ/8)) *10) = 1 THEN GOTO 2120
2030 REM COLS. B-G
2040 IF HB(SQ -25) = 1 OR HB(SQ -23) = 1 THEN MV(P,3) = MV(P,3) -8
2050 IF CB(SQ -25) = 1 OR CB(SQ -23) = 1 THEN MV(P,3) = MV(P,3) +4
2060 GOTO 2140
2070 REM COL. H
2080 IF HB(SQ -25) = 1 THEN MV(P,3) = MV(P,3) -8
2090 IF CB(SQ -25) = 1 THEN MV(P,3) = MV(P,3) +4
2100 GOTO 2140
2110 REM COL. A
2120 IF HB(SQ -23) = 1 THEN MV(P,3) = MV(P,3) -8
2130 IF CB(SQ -23) = 1 THEN MV(P,3) = MV(P,3) +4
2140 DM = MV(P,3)
2150 REM COMPARE SINGLE/DOUBLE MOVES
2160 IF SM >DM THEN MV(P,2) = SQ -8:MV(P,3) = SM
2170 IF DM = >SM THEN MV(P,2) = SQ -16:MV(P,3) = DM
2180 REM DIAGONAL RIGHT CAPTURE
2190 IF INT(((SQ/8) - INT(SQ/8)) *10) = 1 THEN GOTO 2250
2200 IF HB(SQ -9) = 1 THEN MV(P,2) = SQ -9:MV(P,3) = 20: GOTO 2220
2210 GOTO 2250
2220 IF SQ <17 THEN GOTO 2250
2230 IF HB(SQ -16) = 0 AND HB(SQ -18) = 0 THEN MV(P,3) = MV(P,3) +2
2240 REM DIAGONAL LEFT CAPTURE
2250 IF (SQ/8) - INT(SQ/8) = 0 THEN GOTO 2300
2260 IF HB(SQ -7) = 1 THEN MV(P,2) = SQ -7:MV(P,3) = 20: GOTO 2280
2270 GOTO 2300
2280 IF SQ <17 THEN GOTO 2300
2290 IF HB(SQ -16) = 0 AND HB(SQ -14) = 0 THEN MV(P,3) = MV(P,3) +2
2300 IF MV(P,2) = SQ -9 OR MV(P,2) = SQ -7 THEN GOTO 2320
2310 GOTO 2330
2320 IF SQ -8 <9 AND SQ -8 >0 THEN MV(P,3) = MV(P,3) +20
2330 IF LE >0 THEN GOTO 2480
2340 REM FOR JOURNEYMAN MODE
2350 REM OPEN COL.
2360 AL = INT((SQ/8) -.05)
2370 BL = 0:AS = SQ
2380 GOSUB 4190
2390 IF BL < >0 THEN GOTO 2410
2400 GG = 1:RS = 0:MV(P,3) = MV(P,3) +1
2410 IF GG = 1 THEN RETURN
2420 REM VARY THE MOVES
2430 IF P = PC THEN RS = INT( RND(1) *PC) +1: GOTO 2450
2440 RETURN
2450 IF MV(RS,1) >56 THEN RETURN
2460 MV(RS,3) = MV(RS,3) +2: RETURN
2470 REM FOR MASTER MODE
2480 GOSUB 4140: REM EVAL. THREAT SITUATION.
2490 IF A = 1 THEN GOTO 2620
2500 IF LE < >2 THEN GOTO 2620
2510 IF MV(P,2) = SQ -7 OR MV(P,2) = SQ -9 THEN GOTO 2620
2520 ZZ = Z +56
2530 IF MV(P,1) = ZZ THEN MV(P,3) = MV(P,3) +4
2540 REM COL. TO RIGHT
2550 IF ZZ = 57 THEN GOTO 2580
2560 IF MV(P,1) = ZZ -1 THEN MV(P,2) = SQ -16:MV(P,3) = MV(P,3) +2
2570 REM COL TO LEFT
2580 IF ZZ = 64 THEN GOTO 2620
2590 IF MV(P,1) = ZZ +1 THEN MV(P,2) = SQ -16:MV(P,3) = MV(P,3) +2
2600 REM ADVANCED PLAY MODE
2610 REM ATTACKING WHEN SUPPORTED
2620 IF MV(P,2) = SQ -8 OR MV(P,2) = SQ -16 THEN GOTO 2640
2630 GOTO 2930
2640 IF SQ <17 THEN GOTO 2930
2650 IF SQ >56 AND LE = 3 AND CR = 0 THEN GOTO 2930
2660 IF SQ >56 AND LE < >3 THEN GOTO 2930
2670 IF (SQ/8) - INT(SQ/8) = 0 THEN GOTO 2750
2680 IF INT(((SQ/8) - INT(SQ/8)) *10) = 1 THEN GOTO 2780
2690 REM ATTACK FROM COLS. B-G
2700 IF A >0 THEN GOTO 2720
2710 IF CB(SQ -1) = 1 AND CB(SQ +1) = 1 THEN MV(P,3) = MV(P,3) +8: GOTO 2810
2720 IF CB(SQ -1) = 1 OR CB(SQ +1) = 1 THEN MV(P,3) = MV(P,3) +5: GOTO 2810
2730 GOTO 2930
2740 REM ATTACK FROM COL. H
2750 IF CB(SQ -1) = 1 THEN MV(P,3) = MV(P,3) +5: GOTO 2810
2760 GOTO 2930
2770 REM ATTACK FROM COL. A
2780 IF CB(SQ +1) = 1 THEN MV(P,3) = MV(P,3) +5: GOTO 2810
2790 GOTO 2930
2800 REM FAVORING EQUAL EXCHANGES
2810 IF (SQ/8) - INT(SQ/8) = 0 THEN GOTO 2880
2820 IF INT(((SQ/8) - INT(SQ/8)) *10) = 1 THEN GOTO 2910
2830 REM COLS. B-G
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
2850 IF HB(SQ -15) = 1 AND HB(SQ -17) = 1 THEN MV(P,3) = MV(P,3) -2
2860 GOTO 2930
2870 REM COL. H
2880 IF HB(SQ -17) = 1 THEN MV(P,3) = MV(P,3) +5
2890 GOTO 2930
2900 REM COL. A
2910 IF HB(SQ -15) = 1 THEN MV(P,3) = MV(P,3) +5
2920 REM 2-ON-1 AND 3-ON-2
2930 AL = INT((SQ/8) -.05)
2940 BL = 0:AS = SQ
2950 GOSUB 4190
2960 IF BL = 0 THEN GOTO 2980
2970 GOTO 3000
2980 IF MV(P,2) = SQ -8 OR MV(P,2) = SQ -16 THEN MV(P,3) = MV(P,3) +2
2990 REM SUPPORT PIECES
3000 IF SQ <17 THEN GOTO 3220
3010 IF (SQ/8) - INT(SQ/8) = 0 THEN GOTO 3110
3020 REM SUPPORT OF PIECE TO THE LEFT
3030 IF CB(SQ -7) < >1 THEN GOTO 3110
3040 NS = SQ -7
3050 AL = INT((NS/8) -.05)
3060 BL = 0:AS = NS
3070 GOSUB 4190
3080 IF BL = 0 THEN GOTO 3100
3090 GOTO 3110
3100 IF (MV(P,2) = SQ -8) OR (MV(P,2) = SQ -16) THEN MV(P,3) = MV(P,3) +2
3110 IF INT(((SQ/8) - INT(SQ/8)) *10) = 1 THEN GOTO 3220
3120 REM SUPPORT OF PIECE TO THE RIGHT
3130 IF CB(SQ -9) < >1 THEN GOTO 3220
3140 NS = SQ -9
3150 AL = INT((NS/8) -.05)
3160 BL = 0:AS = NS
3170 GOSUB 4190
3180 IF BL = 0 THEN GOTO 3200
3190 GOTO 3220
3200 IF (MV(P,2) = SQ -8) OR (MV(P,2) = SQ -16) THEN MV(P,3) = MV(P,3) +2
3210 REM GOING FOR THE GOLD
3220 AL = INT((SQ/8) -.05)
3230 BL = 0:AS = SQ
3240 GOSUB 4190
3250 IF BL < >0 THEN GOTO 3470
3260 IF SQ <17 THEN GOTO 3470
3270 REM TEST FOR COL. TO LEFT
3280 IF (SQ/8) - INT(SQ/8) = 0 THEN GOTO 3350
3290 NS = SQ -7
3300 AL = INT((NS/8) -.05)
3310 AS = NS
3320 GOSUB 4190
3330 IF BL < >0 THEN GOTO 3470
3340 REM TEST FOR COL. TO RIGHT
3350 IF INT(((SQ/8) - INT(SQ/8)) *10) = 1 THEN GOTO 3410
3360 NS = SQ -9
3370 AL = INT((NS/8) -.05)
3380 AS = NS
3390 GOSUB 4190
3400 IF BL < >0 THEN GOTO 3470
3410 IF MV(P,2) = SQ -8 OR MV(P,2) = SQ -16 THEN MV(P,3) = MV(P,3) +15: GOTO 3440
3420 IF SQ >40 THEN GOTO 3470
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
3440 GG = 1:MV(P,0) = 5
3450 REM TEST FOR ATTACK TOO CLOSE TO HOME ROW.
3460 REM AND TEST FOR MORE THAN ONE PIECE IN THE CLEAR
3470 IF GG = 1 AND P = PC THEN GOTO 3490
3480 GOTO 3650
3490 FOR PP = 1 TO PC
3500 IF MV(PP,0) = 5 THEN MV(PP,3) = MV(PP,3) +6: GOSUB 3530:PP = PC
3510 NEXT PP
3520 GOTO 3650
3530 FOR UP = 1 TO PC
3540 IF MV(UP,1) -MV(UP,2) = 9 OR MV(UP,1) -MV(UP,2) = 7 THEN GOSUB 3570
3550 NEXT UP
3560 RETURN
3570 Q = MV(PP,1):U = MV(UP,1)
3580 AL = INT((Q/8) -.05)
3590 UL = 8 - INT((U/8) -.05)
3600 IF UL <AL THEN GOTO 3620
3610 RETURN
3620 MV(UP,3) = MV(UP,3) +15
3630 RETURN
3640 REM SUPPORT PIECE DIRECTLY BEHIND = +1
3650 IF SQ >56 THEN GOTO 3680
3660 IF CB(SQ +8) = 1 THEN MV(P,3) = MV(P,3) +1
3670 REM BEST OF BAD MOVES
3680 IF P = PC THEN GOTO 3700
3690 GOTO 3840
3700 FOR PL = 1 TO PC
3710 IF MV(PL,3) >4 THEN GM = 1:PL = PC
3720 NEXT PL
3730 IF GM = 1 THEN GM = 0: GOTO 3840
3740 FOR K = 1 TO 64
3750 IF CB(K) = 1 THEN GOSUB 3780
3760 NEXT K
3770 GOTO 3840
3780 FOR PL = 1 TO PC
3790 IF FL = 1 THEN PL = PC: GOTO 3820
3800 IF MV(PL,2) = 0 THEN GOTO 3820
3810 IF MV(PL,1) = K THEN MV(PL,3) = MV(PL,3) +2:FL = 1
3820 NEXT PL
3830 RETURN
3840 IF LE < >3 THEN RETURN
3850 REM SPECIAL STRATEGY FOR GENIUS LEVEL (3 OF 0-3)
3860 IF SQ >56 AND CR = 1 THEN MV(P,3) = MV(P,3) +2
3870 RETURN
3880 REM SPECIAL OPENINGS FOR ADVANCED MODE
3890 FOR LP = 1 TO PC
3900 IF MV(LP,1) -MV(LP,2) = 9 OR MV(LP,1) -MV(LP,2) = 7 THEN A = 1:LP = PC
3910 NEXT LP
3920 IF A = 1 THEN RETURN
3930 IF J <100 THEN GOTO 3960
3940 IF RND(1) <.167 THEN A = 1: RETURN
3950 J = INT( RND(1) *5) *14
3960 IF J = 0 OR MT = 1 THEN GOTO 4010
3970 FOR L = 1 TO J
3980 READ MV(P,1)
3990 NEXT L
4000 MT = 1
4010 READ MV(P,1),MV(P,2)
4020 RETURN
4030 REM THE PICK OPENING
4040 DATA 59,51,60,44,61,45,63,55,62,46,58,42,57,49
4050 REM THE LOW FENCE OPENING
4060 DATA 59,43,60,52,58,50,61,45,62,54,63,47,64,56
4070 REM THE SLOT OPENING
4080 DATA 59,43,60,44,44,36,58,50,62,46,61,53,63,55
4090 REM THE TWO-HILLS OPENING
4100 DATA 59,43,58,50,61,53,60,44,57,41,63,55,64,48
4110 REM THE SAG OPENING
4120 DATA 60,52,59,43,61,53,62,54,58,50,64,56,63,47
4130 REM EVAL. THREAT
4140 FOR L = 33 TO 64
4150 IF HB(L) = 1 THEN A = 1
4160 NEXT L
4170 RETURN
4180 REM LOOP FOR OPEN COL. & ADJACENT OPEN COL.
4190 FOR L = 1 TO AL
4200 AS = AS -8
4210 IF HB(AS) = 1 OR CB(AS) = 1 THEN BL = 1
4220 NEXT L
4230 RETURN
4240 REM ERASE PIECE @ RAN. FROM PLAYER'S START
4250 T = Z:
4260 GOSUB 6430
4270 HCOLOR= 0
4280 GOSUB 5180: GOSUB 5240
4290 HCOLOR= 3:T = 0
4300 RETURN
4310 REM HUMAN VICTORY
4320 HOME : VTAB 21
4330 FOR L = 1 TO 10
4340 CALL -198
4350 NEXT L
4360 PRINT "YOU HAVE WON IN "CT" MOVES!!!"
4370 PRINT "NICE TO KNOW SOMEONE SO BRIGHT!"
4380 GOTO 4490
4390 REM COMPUTER VICTORY
4400 HOME : VTAB 21
4410 E = 12
4420 E = E -1: IF E = 0 THEN GOTO 4470
4430 FOR EL = 1 TO 20
4440 ES = PEEK(49200)
4450 NEXT EL
4460 GOTO 4420
4470 PRINT "I HAVE BEATEN YOU IN "CC" MOVES!!!"
4480 PRINT "HOW DOES THAT FEEL?"
4490 PRINT
4500 PRINT "(Y/N TO PLAY AGAIN.)";
4510 POKE 49168,0
4520 GET G$: PRINT G$
4530 IF G$ = "Y" OR G$ = "y" THEN TEXT : CLEAR : GOTO 100
4540 TEXT : GOTO 4580
4550 HOME : PRINT "DO YOU REALLY WANT TO QUIT? (Y/N) ";: GET G$
4560 IF G$ = "Y" OR G$ = "y" THEN GOTO 4580
4570 RETURN
4580 HOME : PRINT "PLEASE PLAY AGAIN SOMETIME...": END
4590 REM HELP
4600 HOME
4610 PRINT "TO WIN, POSITION PAWN ON COMPUTER'S": PRINT "HOME ROW BEFORE IT PLACES ONE ON YOUR": PRINT "HOME ROW."
4620 PRINT
4630 PRINT "1. ADVANCE PAWNS IN COORDINATED GROUPS"
4640 PRINT TAB( 4)"SO THAT NO PIECE IS LEFT UNDEFENDED."
4650 PRINT : PRINT "2. TIMING IS IMPORTANT - TRY NOT TO BE"
4660 PRINT TAB( 4)"FORCED INTO BAD MOVES."
4670 PRINT : PRINT "3. YOU CAN OFTEN UPSET THE COMPUTER'S"
4680 PRINT TAB( 4)"GAME BY MOVING QUICKLY UP THE BOARD"
4690 PRINT TAB( 4)"INTO HIS FORMATIONS."
4700 PRINT : PRINT "4. EXPERIMENT. SEE WHAT WORKS AND"
4710 PRINT TAB( 4)"WHAT DOESN'T. A LOSS REALLY ISN'T A"
4720 PRINT TAB( 4)"LOSS IF IT CONTRIBUTES KNOWLEDGE"
4730 PRINT TAB( 4)"TOWARD FUTURE WINS."
4740 PRINT : PRINT : PRINT : PRINT "(PRESS <RETURN> FOR MENU.)";
4750 GET G$: RETURN
4760 REM DISPLAY OF LEVEL BEING PLAYED
4770 DS = LE +1
4780 ON DS GOSUB 4800,4810,4820,4830
4790 RETURN
4800 LE$ = "JOURNEYMAN": RETURN
4810 LE$ = "ADVANCED": RETURN
4820 LE$ = "MASTER": RETURN
4830 LE$ = "GENIUS": RETURN
4840 FOR T = 57 TO 64
4850 CB(T) = 1
4860 NEXT T
4870 RETURN
4880 FOR T = 1 TO 8
4890 HB(T) = 1
4900 NEXT T
4910 IF LE < >2 THEN RETURN : REM ERASES FROM ARRAY FOR LEVEL 2.
4920 Z = INT( RND(1) *8) +1
4930 HB(Z) = 0
4940 RETURN
4950 REM DRAW BOARD
4960 FOR H = 70 TO 190 STEP 15
4970 HPLOT H,20 TO H,140
4980 NEXT H
4990 FOR V = 20 TO 140 STEP 15
5000 HPLOT 70,V TO 190,V
5010 NEXT V
5020 RETURN
5030 REM DRAW STARTING POSITIONS
5040 REM WHITE PIECES
5050 Y = 125
5060 FOR X = 70 TO 175 STEP 15
5070 GOSUB 5180
5080 GOSUB 5240
5090 NEXT X
5100 RETURN
5110 REM BLACK PIECES
5120 Y = 20
5130 FOR X = 70 TO 175 STEP 15
5140 GOSUB 5180
5150 NEXT X
5160 RETURN
5170 REM OUTLINE OF ALL PIECES
5180 HPLOT X +6,Y +2 TO X +6,Y +10 TO X +2,Y +10
5190 HPLOT X +2,Y +10 TO X +2,Y +13 TO X +13,Y +13
5200 HPLOT X +13,Y +13 TO X +13,Y +10 TO X +9,Y +10 TO X +9,Y +2
5210 HPLOT X +9,Y +2 TO X +6,Y +2
5220 RETURN
5230 REM FILL IN WHITE PIECES
5240 FOR F = 7 TO 8
5250 HPLOT X +F,Y +2 TO X +F,Y +10
5260 NEXT F
5270 FOR F = 11 TO 12
5280 HPLOT X +2,Y +F TO X +13,Y +F
5290 NEXT F
5300 RETURN
5310 REM DRAW COORDINATES
5320 REM LETTER A
5330 HPLOT 75,142 TO 80,142: HPLOT 75,142 TO 75,152
5340 HPLOT 80,142 TO 80,152: HPLOT 75,148 TO 80,148
5350 REM LETTER B
5360 HPLOT 90,142 TO 90,152: HPLOT 90,142 TO 95,142
5370 HPLOT 95,142 TO 95,152: HPLOT 90,152 TO 95,152
5380 HPLOT 90,148 TO 95,148
5390 REM LETTER C
5400 HPLOT 105,142 TO 105,152: HPLOT 105,142 TO 110,142
5410 HPLOT 105,152 TO 110,152
5420 REM LETTER D
5430 HPLOT 120,142 TO 120,152: HPLOT 120,142 TO 125,142
5440 HPLOT 125,142 TO 125,152 TO 120,152
5450 REM LETTER E
5460 HPLOT 135,142 TO 135,152 TO 140,152
5470 HPLOT 135,142 TO 140,142: HPLOT 135,148 TO 139,148
5480 REM LETTER F
5490 HPLOT 150,142 TO 150,152: HPLOT 150,142 TO 155,142
5500 HPLOT 150,148 TO 154,148
5510 REM LETTER G
5520 HPLOT 165,142 TO 165,152: HPLOT 165,142 TO 170,142
5530 HPLOT 165,152 TO 170,152 TO 170,148 TO 168,148
5540 REM LETTER H
5550 HPLOT 180,142 TO 180,152: HPLOT 185,142 TO 185,152
5560 HPLOT 180,148 TO 185,148
5570 REM NUMBER 1
5580 HPLOT 197,128 TO 197,138
5590 REM NUMBER 2
5600 HPLOT 195,113 TO 200,113 TO 200,118 TO 195,118 TO 195,123 TO 200,123
5620 REM NUMBER 3
5630 HPLOT 195,98 TO 200,98 TO 200,108 TO 195,108
5640 HPLOT 196,104 TO 200,104
5650 REM NUMBER 4
5660 HPLOT 195,83 TO 195,89 TO 200,89
5670 HPLOT 200,83 TO 200,93
5680 REM NUMBER 5
5690 HPLOT 195,68 TO 200,68: HPLOT 195,68 TO 195,74
5700 HPLOT 195,74 TO 200,74 TO 200,78 TO 195,78
5710 REM NUMBER 6
5720 HPLOT 195,53 TO 195,63 TO 200,63 TO 200,59 TO 195,59
5730 REM NUMBER 7
5740 HPLOT 195,38 TO 200,38 TO 200,48
5750 REM NUMBER 8
5760 HPLOT 195,23 TO 195,33 TO 200,33 TO 200,23 TO 195,23
5770 HPLOT 195,29 TO 200,29
5780 RETURN
5790 REM EXTRACTS VALUES FOR P1 AND P2
5800 L1 = ASC(L$):L2 = ASC(LL$)
5810 IF L1 >72 THEN L1 = L1 -32:L$ = CHR$(L1)
5820 IF L2 >72 THEN L2 = L2 -32:LL$ = CHR$(L2)
5830 P1 = ( ASC(L$) -64) +((R *8) -8)
5840 P2 = ( ASC(LL$) -64) +((RR *8) -8)
5850 RETURN
5860 REM INPUT ERROR
5870 HOME : VTAB 21: PRINT L$R$" TO "LL$RR$" IS ILLEGAL. PLEASE TRY AGAIN."
5880 PRINT "(PRESS <RETURN> TO CONTINUE GAME.)";
5890 GET G$: PRINT G$
5900 RETURN
5910 REM FINDING OFFSETS FOR X & Y
5920 FOR XX = 65 TO 72
5930 IF ASC(L$) = XX THEN X = 70 +((XX -65) *15)
5940 NEXT XX
5950 FOR YY = 1 TO 8
5960 IF R = YY THEN Y = 140 -(YY *15)
5970 NEXT YY
5980 RETURN
5990 REM FINDING OFFSETS FOR X & Y
6000 FOR XX = 65 TO 72
6010 IF ASC(LL$) = XX THEN X = 70 +((XX -65) *15)
6020 NEXT XX
6030 FOR YY = 1 TO 8
6040 IF RR = YY THEN Y = 140 -(YY *15)
6050 NEXT YY
6060 RETURN
6070 REM MENU FOR GAME IN PROGRESS & RETURN
6080 TEXT : HOME
6090 PRINT : PRINT : PRINT : PRINT TAB( 16)"GAME MENU"
6100 PRINT : PRINT : PRINT
6110 PRINT TAB( 10)"1. HELP"
6120 PRINT : PRINT TAB( 10)"2. QUIT"
6130 PRINT : PRINT TAB( 10)"3. RESTART CURRENT GAME"
6140 PRINT : PRINT TAB( 10)"4. START A NEW GAME"
6150 PRINT : PRINT : PRINT : PRINT "PLEASE MAKE YOUR CHOICE:";
6160 GET CH$
6170 PRINT CH$
6180 G = VAL(CH$)
6190 IF G = 3 THEN GOTO 6240
6200 IF G = 4 THEN CLEAR :J = 100: GOTO 100
6210 ON G GOSUB 4600,4550
6220 GOTO 6080
6230 REM REDRAW GAME BOARD
6240 HGR : HCOLOR= 3
6250 GOSUB 4960
6260 GOSUB 5330
6270 FOR T = 1 TO 64
6280 IF CB(T) = 1 THEN GOSUB 6340
6290 IF HB(T) = 1 THEN GOSUB 6380
6300 NEXT T
6310 IF CT >CC THEN VTAB 22: GOTO 1170
6320 GOTO 560
6330 REM REDRAW BLACK PIECES
6340 GOSUB 6430
6350 GOSUB 5180
6360 RETURN
6370 REM REDRAW WHITE PIECES
6380 GOSUB 6430
6390 GOSUB 5180: GOSUB 5240
6400 RETURN
6410 REM FINDING FOR X & Y FOR REDRAW
6420 REM FIND FOR Y OFFSET
6430 FOR YY = 9 TO 65 STEP 8
6440 IF T <YY THEN Y = 140 -( INT(YY/8) *15):YY = 65
6450 NEXT YY
6460 REM FIND FOR X OFFSET
6470 X = 0
6480 FOR XX = 1 TO 9
6490 IF INT(((T/8) - INT(T/8)) *10) = XX THEN X = 55 +(XX *15):XT = XX:XX = 9
6500 NEXT XX
6510 IF X = 0 THEN X = 175: RETURN
6520 IF XT >4 THEN X = X -15
6530 RETURN
6540 REM ONERR TRAP
6550 CD = PEEK(222):LN = PEEK(219) *256 + PEEK(218)
6560 PRINT : PRINT "ERROR #"CD" OCCURRED ON LINE #"LN"."
6570 CALL -958
6580 CALL 62248
6590 PRINT "(PRESS <RETURN> TO CONTINUE GAME.)";
6600 GET G$: PRINT G$
6610 HOME : GOTO 560
6620 REM TESTS FOR HUMAN VICTORY
6630 FOR L = 57 TO 64
6640 IF HB(L) = 1 THEN GOTO 4320
6650 NEXT L
6660 FOR L = 64 TO 1 STEP -1
6670 IF CB(L) = 1 THEN L = 1: NEXT L: RETURN
6680 NEXT L
6690 HOME : VTAB 21
6700 PRINT "YOU HAVE TAKEN MY LAST PIECE..."
6710 PRINT "AND BEATEN ME IN "CT" MOVES!"
6720 GOTO 4490
6730 REM TESTS FOR COMPUTER VICTORY
6740 HOME : VTAB 22: PRINT "PLEASE WAIT WHILE I CHECK THE BOARD..."
6750 FOR L = 1 TO 8
6760 IF CB(L) = 1 THEN GOTO 4400
6770 NEXT L
6780 FOR L = 1 TO 64
6790 IF HB(L) = 1 THEN L = 64: NEXT L: GOTO 6840
6800 NEXT L
6810 PRINT "I HAVE TAKEN YOUR LAST PIECE..."
6820 PRINT "AND BEATEN YOU IN "CC" MOVES!"
6830 GOTO 4490
6840 GOSUB 6940: REM DOES WHITE HAVE ANY MOVES LEFT?
6850 IF MH = 0 THEN GOTO 6890
6860 RETURN
6870 REM TESTS FOR STALEMATE
6880 GOSUB 6940: GOTO 6900
6890 GOSUB 7020: REM DOES BLACK HAVE ANY MOVES LEFT?
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
6910 IF MH = 1 AND MC = 0 THEN PRINT "I HAVE NO LEGAL MOVE...": PRINT "YOU HAVE BEATEN ME IN "CT" MOVES!": GOTO 4490
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
6930 REM TEST IF WHITE HAS ANY MOVES LEFT
6940 MH = 0
6950 FOR L = 1 TO 64
6960 IF HB(L) < >1 THEN GOTO 6990
6970 IF HB(L) = 1 AND HB(L +8) = 0 AND CB(L +8) = 0 THEN MH = 1:L = 64: GOTO 6990
6980 IF (HB(L) = 1 AND CB(L +9) = 1) OR (HB(L) = 1 AND CB(L +7) = 1) THEN MH = 1:L = 64
6990 NEXT L
7000 RETURN
7010 REM TEST IF BLACK HAS ANY MOVES LEFT
7020 MC = 0
7030 FOR L = 64 TO 1 STEP -1
7040 IF CB(L) < >1 THEN GOTO 7070
7050 IF CB(L) = 1 AND CB(L -8) = 0 AND HB(L -8) = 0 THEN MC = 1:L = 1: GOTO 7070
7060 IF (CB(L) = 1 AND HB(L -9) = 1) OR (CB(L) = 1 AND HB(L -7) = 1) THEN MC = 1:L = 1
7070 NEXT L
7080 RETURN
7090 HOME : PRINT "I/O ERROR. PLEASE CHECK DISK DRIVE.": END