Computer Chess Club Archives


Search

Terms

Messages

Subject: Old chess program in BASIC (long post)

Author: Walter Faxon

Date: 17:20:40 03/20/05

Go up one level in this thread


On March 19, 2005 at 13:42:26, William H Rogers wrote:

>I have been playing multiple tournements lately and am now in the process of
>playing tournements with programs written in Basic.
>In passing I found that I have a very old program written for the Radio Shack
>Model 100 portable computer. RS Basic saves programs in a tokenized fashion so
>the occupy the least amount of space. In this case the program was only about 4k
>long. When converted to QBasic and expanded it now occupies about 8k.
>It does not follow 50 move rule or the 3 move repetition and I am not sure if
>allows captures enpassant but for a tiny program it plays fairley well.
>I am not sure how to post the program here or I would. If anyone is interested
>then maybe they can show me how to post the program here.
>Bill


Here is the BASIC program as sent to me by Bill (323 lines):
=================================
1000 'CHESS.BA  - BY Mike Weiblen
1010 'CLUB 100 library - 415/939-1246 BBS,    937-5039 NEWSLETTER, 932-8856
VOICE
1020 DEFINT A-Z:
1030 DEFSNG F:
1040 DIM A(7, 7), U(1, 6):
1050 P0$ = CHR$(177) + "P NB R QK"
1060 R0$ = ""
1070 N0$ = ""
1080 C0$ = ""
1090 X$ = "74500547":
1100 U = -1
1110 COLOR 0, 3
1120 CLS :
1130 PRINT "Model 100 Chess":
1140 PRINT :
1150 PRINT "Do you want to be white (Y/N)"; :
1160 C$ = INPUT$(1):
1170 IF C$ > "Y" THEN C$ = CHR$(ASC(C$) - 32)
1180 IF C$ <> "Y" AND C$ <> "N" THEN 1120
1190 FOR X = 0 TO 7:
1200    A(X, 0) = VAL(MID$(X$, X + 1, 1)):
1210    A(X, 7) = -A(X, 0):
1220    A(X, 1) = 2: A(X, 6) = -2:
1230 NEXT:
1240 IF C$ = "Y" THEN A(3, 0) = 9: A(4, 0) = 99: A(3, 7) = -9: A(4, 7) = -99: I
= 1: GOSUB 3860: GOTO 1900
1250 A(3, 0) = 99:
1260 A(4, 0) = 9:
1270 A(3, 7) = -99:
1280 A(4, 7) = -9:
1290 I = -1:
1300 GOSUB 3860:
1310 GOTO 1630

1320 U = U + 1:
1330 U(U, 0) = S:
1340 U(U, 1) = X:
1350 U(U, 2) = Y:
1360 U(U, 3) = A:
1370 U(U, 4) = B:
1380 U(U, 5) = Q0:
1390 U(U, 6) = A(A, B):
1400 A(A, B) = A(X, Y):
1410 A(X, Y) = 0:
1420 LOCATE 12, 1:
1430 PRINT "COUNT= "; U
1440 PRINT "SIDE=  "; U(U, 0)
1450 PRINT "FROM=  "; U(U, 1); U(U, 2)
1460 PRINT "TO=    "; U(U, 3); U(U, 4)
1470 PRINT "SCORE?="; U(U, 5)
1480 RETURN

1490 S = U(U, 0):
1500 X = U(U, 1):
1510 Y = U(U, 2):
1520 A = U(U, 3):
1530 B = U(U, 4):
1540 Q0 = U(U, 5):
1550 A(X, Y) = A(A, B):
1560 A(A, B) = U(U, 6):
1570 U = U - 1:
1580 RETURN

1590 Z = 0:
1600 Y = Y + 1:
1610 IF Y > 7 THEN Y = 0: X = X + 1: IF X > 7 THEN Z = 1
1620 RETURN

1630 F = -99:                           ' COMPUTER MOVE
1640 Q0 = 5:
1650 X = 0:                             ' LOWER LEFT
1660 Y = 0                              ' HAND CORNER
1670 LOCATE 3, 40:
1680 PRINT "Thinking "; CHR$(X + 65); CHR$(Y + 49); C0$; :
1690 IF A(X, Y) < 0 THEN GOSUB 2480      ' FOUND COMP MAN
1700 IF A(X, Y) = 99 THEN X8 = X: Y8 = Y
1710 GOSUB 1590:
1720 IF Z = 0 THEN 1670
1730 IF F < -9 THEN LOCATE 3, 40: PRINT "I Concede"; C0$; : GOTO 4030
1740 A(A0, B0) = A(X0, Y0):
1750 A(X0, Y0) = 0:
1760 IF A(A0, B0) = -2 AND B0 = 0 THEN A(A0, B0) = -9
1770 LOCATE 3, 40:
1780 PRINT "My move:"; CHR$(X0 + 65); CHR$(Y0 + 49); CHR$(A0 + 65); CHR$(B0 +
49); :
1790 X = X0: Y = Y0:
1800 GOSUB 3950:
1810 X = A0:
1820 Y = B0:
1830 GOSUB 3950:
1840 V0 = 0:
1850 X = A0:
1860 Y = B0:
1870 Q0 = 1:
1880 GOSUB 2480:
1890 IF V0 > 0 THEN LOCATE 3, 55: PRINT "Chk";
1900 LOCATE 5, 40:                      ' Human's move
1910 PRINT "Your move"; :
1920 INPUT X$:
1930 IF X$ = "P" THEN 1630               ' computer move again
1940 IF X$ = "K" THEN 2400               ' Castle king side
1950 IF X$ = "Q" THEN 2430               ' Castle queen side
1960 IF X$ = "X" THEN END                ' Quit
1970 IF LEN(X$) <> 4 THEN 2250
1980 X = ASC(LEFT$(X$, 1)) - 65:         ' Convert to numbers
1990 Y = ASC(MID$(X$, 2, 1)) - 49:
2000 A = ASC(MID$(X$, 3, 1)) - 65:
2010 B = ASC(RIGHT$(X$, 1)) - 49:
2020 P9 = 0:
2030                                    ' off board check
2040 IF X < 0 OR Y < 0 OR A < 0 OR B < 0 OR A > 7 OR B > 7 THEN 2250
2050 IF X > 7 OR Y > 7 THEN 2290
2060 IF A(X, Y) <= 0 THEN 2250           ' moving from empty square
2070 IF A(X, Y) = 2 AND A(A, B) = 0 AND Y = 4 AND B = 5 AND ABS(X - A) = 1 THEN
P9 = 1: GOTO 2140
2080 D = 0:
2090 A0 = A:
2100 B0 = B:
2110 Q0 = 3:
2120 GOSUB 2480:
2130 IF D = 0 THEN 2250
2140 A = A0:
2150 B = B0:
2160 A(A, B) = A(X, Y):
2170 A(X, Y) = 0:
2180 IF A(A, B) = 2 AND B = 7 THEN A(A, B) = 9
2190 GOSUB 3950:
2200 X = A:
2210 Y = B:
2220 GOSUB 3950:
2230 IF P9 = 1 THEN Y = B - 1: A(X, Y) = 0: GOSUB 3950
2240 GOTO 1630
2250 LOCATE 5, 40:
2260 PRINT "Invalid"; C0$; :
2270 BEEP:
2280 GOTO 1900
2290 X = A:
2300 Y = B:
2310 IF LEFT$(X$, 1) = "E" THEN Z = 0: GOTO 2370
2320 IF LEFT$(X$, 1) <> "C" AND LEFT$(X$, 1) <> "P" THEN 2250
2330 Z = INSTR(P0$, MID$(X$, 2, 1)):
2340 IF Z < 2 OR Z = 3 THEN 2250
2350 IF Z = 10 THEN Z = 99
2360 IF LEFT$(X$, 1) = "C" THEN Z = -Z
2370 A(X, Y) = Z:
2380 GOSUB 3950:
2390 GOTO 1900
2400 IF A(4, 0) = 99 AND A(7, 0) = 7 THEN A(4, 0) = 0: A(7, 0) = 0: A(6, 0) =
99: A(5, 0) = 7: GOTO 2460
2410 IF A(3, 0) = 99 AND A(0, 0) = 7 THEN A(3, 0) = 0: A(0, 0) = 0: A(1, 0) =
99: A(2, 0) = 7: GOTO 2460
2420 GOTO 2250
2430 IF A(4, 0) = 99 AND A(0, 0) = 7 THEN A(4, 0) = 0: A(0, 0) = 0: A(2, 0) =
99: A(3, 0) = 7: GOTO 2460
2440 IF A(3, 0) = 99 AND A(7, 0) = 7 THEN A(3, 0) = 0: A(7, 0) = 0: A(5, 0) =
99: A(4, 0) = 7: GOTO 2460
2450 GOTO 2250
2460 GOSUB 3860:
2470 GOTO 1630

2480 LOCATE 3, 54:
2490 PRINT "*"; :
2500 IF ABS(A(X, Y)) = 99 THEN 2520     ' IF KING THEN GO MOVE
2510 ON ABS(A(X, Y)) - 1 GOTO 3200, 1000, 3020, 2770, 1000, 2600, 1000, 2600
2520 A = X - 2
2530 B = Y - 2:
2540 A = A + 1
2550 GOSUB 3410:
2560 IF B < Y + 1 THEN 2570 ELSE IF A < X + 1 THEN 2530
2570 B = B + 1:
2580 RETURN

2590 B = Y
2600 A = X:
2610 A = A + 1:
2620 GOSUB 3410:
2630 IF S = 0 THEN 2610
2640 A = X
2650 A = A - 1:
2660 GOSUB 3410:
2670 IF S = 0 THEN 2650
2680 A = X
2690 B = B + 1:
2700 GOSUB 3410:
2710 IF S = 0 THEN 2690
2720 B = Y
2730 B = B - 1:
2740 GOSUB 3410:
2750 IF S = 0 THEN 2730
2760 IF ABS(A(X, Y)) = 7 THEN RETURN
2770 A = X:
2780 B = Y
2790 A = A + 1:
2800 B = B + 1:
2810 GOSUB 3410:
2820 IF S = 0 THEN 2790
2830 A = X:
2840 B = Y
2850 A = A + 1:
2860 B = B - 1:
2870 GOSUB 3410:
2880 IF S = 0 THEN 2850
2890 A = X:
2900 B = Y
2910 A = A - 1:
2920 B = B + 1:
2930 GOSUB 3410:
2940 IF S = 0 THEN 2910
2950 A = X:
2960 B = Y
2970 A = A - 1:
2980 B = B - 1:
2990 GOSUB 3410:
3000 IF S = 0 THEN 2970
3010 RETURN
3020 A = X + 2:
3030 B = Y + 1:
3040 GOSUB 3410:
3050 B = B - 2:
3060 GOSUB 3410:
3070 A = A - 4:
3080 GOSUB 3410:
3090 B = B + 2:
3100 GOSUB 3410:
3110 A = A + 1:
3120 B = B + 1:
3130 GOSUB 3410:
3140 B = B - 4:
3150 GOSUB 3410:
3160 A = A + 2:
3170 GOSUB 3410:
3180 B = B + 4:
3190 GOTO 3410
3200 A = X:
3210 IF A(X, Y) < 0 THEN 3270
3220 B = Y + 1:
3230 GOSUB 3350:
3240 IF Y < 2 AND S = 0 THEN B = B + 1: GOSUB 3350
3250 B = Y + 1:
3260 GOTO 3310
3270 B = Y - 1:
3280 GOSUB 3350:
3290 IF Y > 5 AND S = 0 THEN B = B - 1: GOSUB 3350
3300 B = Y - 1
3310 A = X + 1:
3320 GOSUB 3380:
3330 A = A - 2:
3340 GOTO 3380

3350 S = 0:
3360 IF A(A, B) THEN S = 1: RETURN
3370 GOTO 3450

3380 IF A < 0 OR A > 7 THEN RETURN
3390 IF A(A, B) = 0 OR SGN(A(A, B)) = SGN(A(X, Y)) THEN RETURN
3400 GOTO 3450

3410 S = 0:
3420 IF A < 0 OR A > 7 OR B < 0 OR B > 7 THEN S = 1: RETURN
3430 IF A(A, B) THEN S = 1
3440 IF SGN(A(A, B)) = SGN(A(X, Y)) THEN RETURN
3450 LOCATE 3, 54:
3460 PRINT " "; :
3470 ON Q0 GOTO 3480, 3500, 3520, 3540, 3670
3480 IF A(A, B) = 99 THEN V0 = V0 + 1
3490 RETURN

3500 IF U(U, 3) = A AND U(U, 4) = B THEN P = 0
3510 RETURN

3520 IF A0 = A AND B0 = B THEN D = 1
3530 RETURN

3540 IF A(A, B) >= 0 THEN RETURN
3550 P = A(A, B):
3560 IF ABS(P) > A(X, Y) THEN 3650
3570 GOSUB 1320:
3580 Q0 = 2:
3590 X = 0:
3600 Y = 0
3610 IF A(X, Y) < 0 THEN GOSUB 2480: IF P = 0 THEN 3640
3620 GOSUB 1590:
3630 IF Z = 0 THEN 3610
3640 GOSUB 1490
3650 IF P < V0 THEN V0 = P
3660 RETURN
3670 IF A(A, B) = 99 THEN LOCATE 3, 40: PRINT "CheckMate"; : GOTO 4030
3680 GOSUB 1320:
3690 V0 = 0:
3700 Q0 = 4:
3710 X = 0:
3720 Y = 0
3730 IF A(X, Y) > 0 THEN GOSUB 2480
3740 GOSUB 1590:
3750 IF Z = 0 THEN 3730
3760 X = U(U, 3):
3770 Y = U(U, 4):
3780 Q0 = 1:
3790 GOSUB 2480:
3800 GOSUB 1490:
3810 F9 = 1 / (ABS(3.5 - A) + ABS(3.5 - B) + 1) + RND(1) / 15:
3820 IF A(X, Y) >= -9 AND A(X, Y) <= -2 THEN F9 = F9 + 1 / (ABS(X8 - A) + ABS(Y8
- B) + 5)
3830 F9 = F9 + A(A, B) + V0:
3840 IF F9 > F THEN F = F9: X0 = X: Y0 = Y: A0 = A: B0 = B
3850 RETURN

3860 CLS :
3870 FOR Y = 7 TO 0 STEP -1:
3880    LOCATE 7 - Y + 1: COLOR 0, 6
3890    PRINT Y + 1; :
3900    FOR X = 0 TO 7:
3910       GOSUB 3950:
3920    NEXT X: PRINT
3930 NEXT Y:
3940 RETURN

3950 LOCATE 7 - Y + 1, X * 2 + 4:
3960 PRINT ""; :
3970 G6 = A(X, Y):
3980 IF G6 * I > 0 THEN COLOR 7, 3 ELSE COLOR 0, 3
3990 IF G6 = 0 THEN G6 = 3: IF INT((X + Y) / 2) = (X + Y) / 2 THEN G6 = 1
4000 IF ABS(G6) = 99 THEN G6 = 10
4010 PRINT MID$(P0$, ABS(G6), 1); : COLOR 0, 3
4020 RETURN

4030 BEEP:
4040 LOCATE 8, 40:
4050 PRINT "Hit any key"; :
4060 INPUT X$

=================================

You may have to fix up some line wraps (e.g. 1010, 1240, 1780, 2070, 2400-2440
and 3820; the submission form has lines more narrow than displayed messages).
Otherwise, somebody try it and let us know if it got through OK.

Yes, I know, chess purists will say that if it doesn't know all the rules it
doesn't really play chess.  Consider it a "chess-like" game ;)

-- Walter



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.