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.