'=========================================================================== ' Subject: CHESS Date: 12/1981 (00:00) ' Author: S. W. Higgins Code: QB, QBasic, PDS ' Origin: comp.lang.basic.misc Packet: GAMES.ABC '=========================================================================== 0 ' exit on error 1 ' 2 CLEAR , , 2048: CLS : COLOR 0, 7: LOCATE 1, 6: PRINT SPACE$(68) 3 LOCATE 2, 6: PRINT " ********* Chess ********* By: M. C. Rakaska, Ides of March, 1980 " 4 LOCATE 3, 6: PRINT SPACE$(68): LOCATE 4, 6: PRINT " Adapted for the IBM PC by S. W. Huggins, December, 1981 " 5 LOCATE 5, 6: PRINT SPACE$(68) 6 ' 12 ' 20 DEFINT A-Z: a = 0: b = 0: X = 0: Y = 0: S = 0: A0 = 0: T = 0: A8 = 0: A1 = 0: A2 = 0: A3 = 0: A4 = 0: B1 = 0: B6! = 0: H = 0: M = 0: N = 0: P = 0: W = 0: A5 = 0: I = 1: DIM C(64), a(10, 10), b(10, 10), T(10, 10), S(8, 8) 25 COLOR 7, 0: LOCATE 18, 1: PRINT "Important: Use Caps Lock key to shift to UPPER CASE before continuing...." 30 LOCATE 21, 1: INPUT "DO YOU WANT INSTRUCTIONS "; IN$: IN$ = LEFT$(IN$, 1): IF IN$ = "Y" THEN GOSUB 2220 40 CL$ = "N" 50 CLS : INPUT "YOUR NAME IS "; b$: IF b$ = "" THEN b$ = " HUMAN " ELSE b$ = LEFT$(b$, 9) 60 CLS : PRINT "LEVEL OF PLAY"; : INPUT B8!: IF B8! = 0 THEN B8! = 1: B7! = 1 + RND(0) / 2: ELSE B7! = (B8! + 1) / 2 + RND(0) / 2 70 CLS : PRINT "DO YOU WANT WHITE "; b$; " "; : INPUT C$: GOSUB 790: IF LEFT$(C$, 1) <> "N" THEN GOSUB 900: GOTO 190 80 GOSUB 890: IF CL$ = "Y" THEN LOCATE 25, 6, 0: PRINT "START "; TIME$; 100 F! = -99: A0 = 0: FOR J = 1 TO 8: FOR K = 1 TO 8: IF a(J, K) = 99 THEN A6 = J: A7 = K 110 NEXT: NEXT 120 FOR X = 1 TO 8: FOR Y = 1 TO 8: IF a(X, Y) < 0 THEN GOSUB 270: IF F! >= B7! THEN GOTO 150 130 NEXT: NEXT: IF F! >= -9 THEN GOTO 150 ELSE GOSUB 900 140 LOCATE 25, 62, 0: PRINT "I CONCEED "; : GOTO 2190 150 a(R, U) = a(E, Q): a(E, Q) = 1: IF a(R, U) = -2 AND U = 1 THEN a(R, U) = -9 160 X = R: Y = U: A0 = 4: GOSUB 270: LOCATE 25, 62, 0: PRINT "IS MY MOVE "; : LOCATE 25, 51, 0: PRINT CHR$(E + 64); Q; "- "; CHR$(R + 64); U; 170 IF CL$ = "Y" THEN LOCATE 25, 31, 0: PRINT "STOP "; TIME$; 180 X = E: Y = Q: GOSUB 910: X = R: Y = U: GOSUB 910: IF C = 1 THEN LOCATE 24, 1, 1: PRINT "CHECK "; : C = 0 ELSE LOCATE 24, 1, 1: PRINT " "; 190 IF X$ = "S" THEN GOSUB 1830: B7! = 3 * RND(0): LOCATE 25, 1, 1: PRINT "SELF-PLAYING"; : GOSUB 2480: GOTO 100 195 LOCATE 25, 1, 1: PRINT "MOVE " + CHR$(7); b$; : GOSUB 1590: D = 0: B4 = a: B9 = b: B5 = 0: IF a(X, Y) = 2 AND Y = 5 AND b = 6 AND a(a, b) = 1 AND ABS(a - X) = 1 THEN B5 = 1: GOTO 220 200 IF X$ = "K" OR X$ = "Q" THEN GOSUB 900: LOCATE 25, 1, 0: PRINT STRING$(14, " "); : GOTO 100 210 IF X$ = "S" THEN CL$ = "N": GOTO 190: ELSE A0 = 3: GOSUB 250: IF D = 0 THEN LOCATE 25, 31, 0: PRINT "ILLEGAL "; : GOTO 190 220 LOCATE 25, 31, 1: PRINT "OK "; : a = B4: b = B9: a(a, b) = a(X, Y): a(X, Y) = 1: GOSUB 910: X = a: Y = b: GOSUB 910: IF N$ = "N" THEN GOSUB 900: N$ = " " 230 IF a(a, b) = 2 AND b = 8 THEN LOCATE 25, 31, 1: PRINT "WHAT PIECE"; : GOSUB 2100: X = a: Y = b: GOSUB 910: LOCATE 25, 31, 1: PRINT " "; 240 IF B5 = 1 THEN a(a, b - 1) = 1: X = a: Y = b - 1: GOSUB 910: GOTO 100: ELSE GOTO 100 250 LOCATE 1, 78, 0: PRINT "$ "; : ON a(X, Y) GOTO 0, 480, 0, 380, 330, 0, 280, 0, 330: GOTO 460 270 ON -a(X, Y) GOTO 0, 530, 0, 380, 330, 0, 280, 0, 330: GOTO 460 280 b = Y 281 FOR a = X + 1 TO 8 282 GOSUB 640 283 IF S <> 0 THEN EXIT FOR 284 NEXT 290 FOR a = X - 1 TO 1 STEP -1 291 GOSUB 640 292 IF S <> 0 THEN EXIT FOR 293 NEXT a 300 a = X 301 FOR b = Y + 1 TO 8 302 GOSUB 640 303 IF S <> 0 THEN EXIT FOR 304 NEXT 310 FOR b = Y - 1 TO 1 STEP -1 311 GOSUB 640 312 IF S <> 0 THEN RETURN 313 NEXT b 314 RETURN 330 b = Y 331 FOR a = X + 1 TO 8 332 b = b + 1 333 GOSUB 640 334 IF S <> 0 THEN EXIT FOR 335 NEXT 340 b = Y 341 FOR a = X - 1 TO 1 STEP -1 342 b = b - 1 343 GOSUB 640 344 IF S <> 0 THEN EXIT FOR 345 NEXT 350 b = Y 351 FOR a = X - 1 TO 1 STEP -1 352 b = b + 1 353 GOSUB 640 354 IF S <> 0 THEN EXIT FOR 355 NEXT a 360 b = Y 361 FOR a = X + 1 TO 8 362 b = b - 1 363 GOSUB 640 364 IF S <> 0 THEN EXIT FOR 365 NEXT a 370 IF ABS(a(X, Y)) = 9 THEN GOTO 280: ELSE RETURN 380 a = X + 2: b = Y + 1: IF a < 9 AND b < 9 THEN GOSUB 650 ELSE GOTO 390 390 b = b - 2: IF b > 0 AND a < 9 THEN GOSUB 650 ELSE GOTO 400 400 a = a - 4: IF a > 0 AND b > 0 THEN GOSUB 650 ELSE GOTO 410 410 b = b + 2: IF b < 9 AND a > 0 THEN GOSUB 650 ELSE GOTO 420 420 a = a + 1: b = b + 1: IF a > 0 AND a < 9 AND b < 9 THEN GOSUB 650 ELSE GOTO 430 430 b = b - 4: IF b > 0 AND a > 0 AND a < 9 THEN GOSUB 650 ELSE GOTO 440 440 a = a + 2: IF a > 0 AND a < 9 AND b > 0 THEN GOSUB 650 ELSE GOTO 450 450 b = b + 4: IF b < 9 AND a > 0 AND a < 9 THEN GOSUB 650: RETURN ELSE RETURN 460 FOR a = X - 1 TO X + 1: FOR b = Y - 1 TO Y + 1: IF a(a, b) <> 0 THEN GOSUB 650 470 NEXT: NEXT: RETURN 480 a = X: IF Y > 2 THEN GOTO 500 ELSE GOTO 490 490 b = Y + 1: IF a(a, b) = 1 THEN GOSUB 660: b = b + 1: IF a(a, b) = 1 THEN GOSUB 660: GOTO 510: ELSE GOTO 510: ELSE GOTO 510 500 b = Y + 1: IF a(a, b) = 1 THEN GOSUB 660 ELSE GOTO 510 510 a = X + 1: b = Y + 1: IF a(a, b) < 0 THEN GOSUB 660 ELSE GOTO 520 520 a = a - 2: IF a(a, b) < 0 THEN GOSUB 660: RETURN: ELSE RETURN 530 a = X: IF Y < 7 THEN GOTO 550 ELSE GOTO 540 540 b = Y - 1: IF a(a, b) = 1 THEN GOSUB 660: b = b - 1: IF a(a, b) = 1 THEN GOSUB 660: GOTO 560: ELSE GOTO 560: ELSE GOTO 560 550 b = Y - 1: IF a(a, b) = 1 THEN GOSUB 660 ELSE GOTO 560 560 a = X - 1: b = Y - 1: IF a(a, b) > 1 THEN GOSUB 660 ELSE GOTO 570 570 a = a + 2: IF a(a, b) > 1 THEN GOSUB 660: RETURN: ELSE GOTO 590 580 T = a(a, b): IF T = -99 THEN B1 = T: RETURN: ELSE GOTO 590 590 A5 = S: IF ABS(T) <= a(X, Y) THEN a(a, b) = a(X, Y): a(X, Y) = 1: GOTO 610: ELSE GOTO 600 600 IF T < B1 THEN B1 = T: S = A5: RETURN: ELSE S = A5: RETURN 610 A1 = X: A2 = Y: A3 = a: A4 = b: A8 = T: A0 = 2: FOR X = 1 TO 8: FOR Y = 1 TO 8: IF a(X, Y) < 0 THEN GOSUB 270: IF T = 0 THEN GOTO 630 620 NEXT: NEXT 630 X = A1: Y = A2: a = A3: b = A4: A0 = 5: a(X, Y) = a(a, b): a(a, b) = A8: GOTO 600 640 S = 0: IF a(a, b) = 1 THEN GOTO 660 ELSE IF a(a, b) = 0 THEN S = 1: RETURN: ELSE IF SGN(a(a, b)) = SGN(a(X, Y)) THEN S = 1: RETURN: ELSE S = 1: GOTO 660 650 IF a(a, b) = 1 THEN GOTO 660 ELSE IF SGN(a(a, b)) = SGN(a(X, Y)) THEN RETURN: ELSE GOTO 660 660 LOCATE 1, 78, 0: PRINT " "; : ON A0 GOTO 670, 680, 690, 700, 710: GOTO 720 670 IF A6 = a AND A7 = b THEN B1 = B1 + 1: RETURN: ELSE RETURN 680 IF A3 = a AND A4 = b THEN T = 0: RETURN: ELSE RETURN 690 IF B4 = a AND B9 = b THEN D = 1: RETURN: ELSE RETURN 700 IF A6 = a AND A7 = b THEN C = 1: RETURN: ELSE RETURN 710 IF a(a, b) < 0 THEN GOTO 580 ELSE RETURN 720 B3 = S: W = X: M = Y: N = a: H = b: P = a(a, b): a(a, b) = a(X, Y): a(X, Y) = 1: B1 = 0 730 A0 = 5: FOR X = 1 TO 8: FOR Y = 1 TO 8: IF a(X, Y) > 1 THEN GOSUB 250 740 NEXT: NEXT: X = N: Y = H: A0 = 1: GOSUB 270: A0 = 0: S = B3: X = W: Y = M: a = N: b = H: a(X, Y) = a(a, b): a(a, b) = P 750 B6! = 1 / (ABS(4.5 - a) + ABS(4.5 - b) + 1): IF a(X, Y) < -2 AND a(X, Y) > -9 THEN B6! = B6! + 1 / (ABS(A6 - a) + ABS(A7 - b) + 5) + RND(0) / 15 760 G! = P + B1 + B6!: IF P = 99 THEN GOSUB 900: LOCATE 25, 1, 1: PRINT "MATE "; b$; : GOTO 2190 770 IF G! <= F! THEN RETURN 780 F! = G!: E = X: Q = Y: R = a: U = b: RETURN 790 CLS 800 Y = 0: FOR J = 896 TO 0 STEP -128: Y = Y + 1: X = 0: FOR K = J TO 42 + J STEP 6: X = X + 1: T(X, Y) = K: NEXT: NEXT 810 Y = 0: FOR J = 960 TO 64 STEP -128: Y = Y + 1: X = 0: FOR K = J TO 42 + J STEP 6: X = X + 1: b(X, Y) = K: NEXT: NEXT 820 DATA -7, -4, -5, -9, -99, -5, -4, -7 830 DATA -2, -2, -2, -2, -2, -2, -2, -2 840 DATA 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 850 DATA 2, 2, 2, 2, 2, 2, 2, 2 860 DATA 7, 4, 5, 9, 99, 5, 4, 7 870 FOR Y = 8 TO 1 STEP -1: FOR X = 1 TO 7 STEP 2: S(X, Y) = I: S(X + 1, Y) = -I: NEXT: I = -I: NEXT 880 FOR Y = 8 TO 1 STEP -1: FOR X = 1 TO 8: READ a(X, Y): NEXT: NEXT: RETURN 890 I = -I: a(4, 1) = 99: a(5, 1) = 9: a(4, 8) = -99: a(5, 8) = -9 900 FOR Y = 1 TO 8: FOR X = 1 TO 8: GOSUB 910: NEXT: NEXT: RETURN 910 IF S(X, Y) > 0 THEN GOTO 940 920 ON ABS(a(X, Y)) GOSUB 980, 1040, 0, 1340, 1440, 0, 1540, 0, 1140: IF ABS(a(X, Y)) = 99 THEN GOSUB 1240: RETURN ELSE RETURN 940 ON ABS(a(X, Y)) GOSUB 960, 990, 0, 1290, 1390, 0, 1490, 0, 1090: IF ABS(a(X, Y)) = 99 THEN GOSUB 1190: RETURN ELSE RETURN 960 IF S(X, Y) < 0 THEN GOTO 980 970 LOCATE 25 - Y * 3, X * 8 + 1, 0 971 PRINT STRING$(8, CHR$(219)); 972 LOCATE 26 - Y * 3, X * 8 + 1, 0 973 PRINT STRING$(8, CHR$(219)); 974 LOCATE 27 - Y * 3, X * 8 + 1, 0 975 PRINT STRING$(8, CHR$(219)); : RETURN 980 LOCATE 25 - Y * 3, X * 8 + 1, 0 981 PRINT STRING$(8, " "); 982 LOCATE 26 - Y * 3, X * 8 + 1, 0 983 PRINT STRING$(8, " "); 984 LOCATE 27 - Y * 3, X * 8 + 1, 0 985 PRINT STRING$(8, " "); : RETURN 990 IF I * a(X, Y) < 0 THEN GOTO 1020 1000 LOCATE 25 - Y * 3, X * 8 + 1, 0 1001 PRINT STRING$(8, CHR$(219)); 1010 LOCATE 26 - Y * 3, X * 8 + 1, 0 1011 PRINT STRING$(3, CHR$(219)); CHR$(2); STRING$(4, CHR$(219)); 1012 LOCATE 27 - Y * 3, X * 8 + 1, 0 1013 PRINT STRING$(8, CHR$(219)): RETURN 1020 LOCATE 25 - Y * 3, X * 8 + 1, 0 1021 PRINT STRING$(8, CHR$(219)); 1030 LOCATE 26 - Y * 3, X * 8 + 1, 0 1031 PRINT STRING$(3, CHR$(219)); CHR$(1); STRING$(4, CHR$(219)); 1032 LOCATE 27 - Y * 3, X * 8 + 1, 0 1033 PRINT STRING$(8, CHR$(219)); : RETURN 1040 IF I * a(X, Y) < 0 THEN GOTO 1070 1050 LOCATE 25 - Y * 3, X * 8 + 1, 0 1051 PRINT STRING$(8, CHR$(32)); 1060 LOCATE 26 - Y * 3, X * 8 + 1, 0 1061 PRINT STRING$(3, CHR$(32)); CHR$(2); STRING$(4, CHR$(32)); 1062 LOCATE 27 - Y * 3, X * 8 + 1, 0 1063 PRINT STRING$(8, CHR$(32)): RETURN 1070 LOCATE 25 - Y * 3, X * 8 + 1, 0 1071 PRINT STRING$(8, CHR$(32)); 1080 LOCATE 26 - Y * 3, X * 8 + 1, 0 1081 PRINT STRING$(3, CHR$(32)); CHR$(1); STRING$(4, CHR$(32)); 1082 LOCATE 27 - Y * 3, X * 8 + 1, 0 1083 PRINT STRING$(8, CHR$(32)); : RETURN 1090 IF I * a(X, Y) < 0 THEN GOTO 1120 1100 LOCATE 25 - Y * 3, X * 8 + 1, 0 1101 PRINT STRING$(2, CHR$(219)); STRING$(3, CHR$(178)); STRING$(3, CHR$(219)); 1110 LOCATE 26 - Y * 3, X * 8 + 1, 0 1111 PRINT CHR$(219) + "QUEEN" + CHR$(219); CHR$(219); 1112 LOCATE 27 - Y * 3, X * 8 + 1, 0 1113 PRINT STRING$(2, CHR$(219)); STRING$(3, CHR$(178)); STRING$(3, CHR$(219)); : RETURN 1120 LOCATE 25 - Y * 3, X * 8 + 1, 0 1121 PRINT STRING$(2, CHR$(219)); STRING$(3, CHR$(176)); STRING$(3, CHR$(219)); 1130 LOCATE 26 - Y * 3, X * 8 + 1, 0 1131 PRINT CHR$(219) + "QUEEN" + CHR$(219); CHR$(219); 1132 LOCATE 27 - Y * 3, X * 8 + 1, 0 1133 PRINT STRING$(2, CHR$(219)); STRING$(3, CHR$(176)); STRING$(3, CHR$(219)); : RETURN 1140 IF I * a(X, Y) < 0 THEN GOTO 1170 1150 LOCATE 25 - Y * 3, X * 8 + 1, 0 1151 PRINT STRING$(2, CHR$(32)); STRING$(3, CHR$(178)); STRING$(3, CHR$(32)); 1160 LOCATE 26 - Y * 3, X * 8 + 1, 0 1161 PRINT CHR$(32) + "QUEEN" + CHR$(32); CHR$(32); 1162 LOCATE 27 - Y * 3, X * 8 + 1, 0 1163 PRINT STRING$(2, CHR$(32)); STRING$(3, CHR$(178)); STRING$(3, CHR$(32)); : RETURN 1170 LOCATE 25 - Y * 3, X * 8 + 1, 0 1171 PRINT STRING$(2, CHR$(32)); STRING$(3, CHR$(176)); STRING$(3, CHR$(32)); 1180 LOCATE 26 - Y * 3, X * 8 + 1, 0 1181 PRINT CHR$(32) + "QUEEN" + CHR$(32); CHR$(32); 1182 LOCATE 27 - Y * 3, X * 8 + 1, 0 1183 PRINT STRING$(2, CHR$(32)); STRING$(3, CHR$(176)); STRING$(3, CHR$(32)); : RETURN 1190 IF I * a(X, Y) < 0 THEN GOTO 1220 1200 LOCATE 25 - Y * 3, X * 8 + 1, 0 1201 PRINT STRING$(2, CHR$(219)); STRING$(4, CHR$(178)); STRING$(2, CHR$(219)); 1210 LOCATE 26 - Y * 3, X * 8 + 1, 0 1211 PRINT CHR$(219); CHR$(178) + "KING" + CHR$(178); CHR$(219); 1212 LOCATE 27 - Y * 3, X * 8 + 1, 0 1213 PRINT STRING$(2, CHR$(219)); STRING$(4, CHR$(178)); STRING$(2, CHR$(219)); : RETURN 1220 LOCATE 25 - Y * 3, X * 8 + 1, 0 1221 PRINT STRING$(2, CHR$(219)); STRING$(4, CHR$(176)); STRING$(2, CHR$(219)); 1230 LOCATE 26 - Y * 3, X * 8 + 1, 0 1231 PRINT CHR$(219); CHR$(176) + "KING" + CHR$(176); CHR$(219); 1232 LOCATE 27 - Y * 3, X * 8 + 1, 0 1233 PRINT STRING$(2, CHR$(219)); STRING$(4, CHR$(176)); STRING$(2, CHR$(219)); : RETURN 1240 IF I * a(X, Y) < 0 THEN GOTO 1270 1250 LOCATE 25 - Y * 3, X * 8 + 1, 0 1251 PRINT STRING$(2, CHR$(32)); STRING$(4, CHR$(178)); STRING$(2, CHR$(32)); 1260 LOCATE 26 - Y * 3, X * 8 + 1, 0 1261 PRINT CHR$(32); CHR$(178) + "KING" + CHR$(178); CHR$(32); 1262 LOCATE 27 - Y * 3, X * 8 + 1, 0 1263 PRINT STRING$(2, CHR$(32)); STRING$(4, CHR$(178)); STRING$(2, CHR$(32)); : RETURN 1270 LOCATE 25 - Y * 3, X * 8 + 1, 0 1271 PRINT STRING$(2, CHR$(32)); STRING$(4, CHR$(176)); STRING$(2, CHR$(32)); 1280 LOCATE 26 - Y * 3, X * 8 + 1, 0 1281 PRINT CHR$(32); CHR$(176) + "KING" + CHR$(176); CHR$(32); 1282 LOCATE 27 - Y * 3, X * 8 + 1, 0 1283 PRINT STRING$(2, CHR$(32)); STRING$(4, CHR$(176)); STRING$(2, CHR$(32)); : RETURN 1290 IF I * a(X, Y) < 0 THEN GOTO 1320 1300 LOCATE 25 - Y * 3, X * 8 + 1, 0 1301 PRINT STRING$(3, CHR$(219)); STRING$(2, CHR$(178)); STRING$(3, CHR$(219)); 1310 LOCATE 26 - Y * 3, X * 8 + 1, 0 1311 PRINT CHR$(219) + "KNIGHT" + CHR$(219); 1312 LOCATE 27 - Y * 3, X * 8 + 1, 0 1313 PRINT STRING$(3, CHR$(219)); STRING$(2, CHR$(178)); STRING$(3, CHR$(219)); : RETURN 1320 LOCATE 25 - Y * 3, X * 8 + 1, 0 1321 PRINT STRING$(3, CHR$(219)); STRING$(2, CHR$(176)); STRING$(3, CHR$(219)); 1330 LOCATE 26 - Y * 3, X * 8 + 1, 0 1331 PRINT CHR$(219) + "KNIGHT" + CHR$(219); 1332 LOCATE 27 - Y * 3, X * 8 + 1, 0 1333 PRINT STRING$(3, CHR$(219)); STRING$(2, CHR$(176)); STRING$(3, CHR$(219)); : RETURN 1340 IF I * a(X, Y) < 0 THEN GOTO 1370 1350 LOCATE 25 - Y * 3, X * 8 + 1, 0 1351 PRINT STRING$(3, CHR$(32)); STRING$(2, CHR$(178)); STRING$(3, CHR$(32)); 1360 LOCATE 26 - Y * 3, X * 8 + 1, 0 1361 PRINT CHR$(32) + "KNIGHT" + CHR$(32); 1362 LOCATE 27 - Y * 3, X * 8 + 1, 0 1363 PRINT STRING$(3, CHR$(32)); STRING$(2, CHR$(178)); STRING$(3, CHR$(32)); : RETURN 1370 LOCATE 25 - Y * 3, X * 8 + 1, 0 1371 PRINT STRING$(3, CHR$(32)); STRING$(2, CHR$(176)); STRING$(3, CHR$(32)); 1380 LOCATE 26 - Y * 3, X * 8 + 1, 0 1381 PRINT CHR$(32) + "KNIGHT" + CHR$(32); 1382 LOCATE 27 - Y * 3, X * 8 + 1, 0 1383 PRINT STRING$(3, CHR$(32)); STRING$(2, CHR$(176)); STRING$(3, CHR$(32)); : RETURN 1390 IF I * a(X, Y) < 0 THEN GOTO 1420 1400 LOCATE 25 - Y * 3, X * 8 + 1, 0 1401 PRINT STRING$(3, CHR$(219)); STRING$(2, CHR$(178)); STRING$(3, CHR$(219)); 1410 LOCATE 26 - Y * 3, X * 8 + 1, 0 1411 PRINT CHR$(219) + "BISHOP" + CHR$(219); 1412 LOCATE 27 - Y * 3, X * 8 + 1, 0 1413 PRINT STRING$(3, CHR$(219)); STRING$(2, CHR$(178)); STRING$(3, CHR$(219)); : RETURN 1420 LOCATE 25 - Y * 3, X * 8 + 1, 0 1421 PRINT STRING$(3, CHR$(219)); STRING$(2, CHR$(176)); STRING$(3, CHR$(219)); 1430 LOCATE 26 - Y * 3, X * 8 + 1, 0 1431 PRINT CHR$(219) + "BISHOP" + CHR$(219); 1432 LOCATE 27 - Y * 3, X * 8 + 1, 0 1433 PRINT STRING$(3, CHR$(219)); STRING$(2, CHR$(176)); STRING$(3, CHR$(219)); : RETURN 1440 IF I * a(X, Y) < 0 THEN GOTO 1470 1450 LOCATE 25 - Y * 3, X * 8 + 1, 0 1451 PRINT STRING$(3, CHR$(32)); STRING$(2, CHR$(178)); STRING$(3, CHR$(32)); 1460 LOCATE 26 - Y * 3, X * 8 + 1, 0 1461 PRINT CHR$(32) + "BISHOP" + CHR$(32); 1462 LOCATE 27 - Y * 3, X * 8 + 1, 0 1463 PRINT STRING$(3, CHR$(32)); STRING$(2, CHR$(178)); STRING$(3, CHR$(32)); : RETURN 1470 LOCATE 25 - Y * 3, X * 8 + 1, 0 1471 PRINT STRING$(3, CHR$(32)); STRING$(2, CHR$(176)); STRING$(3, CHR$(32)); 1480 LOCATE 26 - Y * 3, X * 8 + 1, 0 1481 PRINT CHR$(32) + "BISHOP" + CHR$(32); 1482 LOCATE 27 - Y * 3, X * 8 + 1, 0 1483 PRINT STRING$(3, CHR$(32)); STRING$(2, CHR$(176)); STRING$(3, CHR$(32)); : RETURN 1490 IF I * a(X, Y) < 0 THEN GOTO 1520 1500 LOCATE 25 - Y * 3, X * 8 + 1, 0 1501 PRINT CHR$(219); CHR$(219); CHR$(178); CHR$(219); CHR$(219); CHR$(178); CHR$(219); CHR$(219); 1510 LOCATE 26 - Y * 3, X * 8 + 1, 0 1511 PRINT CHR$(219); CHR$(219) + "ROOK" + CHR$(219); CHR$(219); 1512 LOCATE 27 - Y * 3, X * 8 + 1, 0 1513 PRINT STRING$(2, CHR$(219)); STRING$(4, CHR$(178)); STRING$(2, CHR$(219)); : RETURN 1520 LOCATE 25 - Y * 3, X * 8 + 1, 0 1521 PRINT CHR$(219); CHR$(219); CHR$(176); CHR$(219); CHR$(219); CHR$(176); CHR$(219); CHR$(219); 1530 LOCATE 26 - Y * 3, X * 8 + 1, 0 1531 PRINT CHR$(219); CHR$(219) + "ROOK" + CHR$(219); CHR$(219); 1532 LOCATE 27 - Y * 3, X * 8 + 1, 0 1533 PRINT STRING$(2, CHR$(219)); STRING$(4, CHR$(176)); STRING$(2, CHR$(219)); : RETURN 1540 IF I * a(X, Y) < 0 THEN GOTO 1570 1550 LOCATE 25 - Y * 3, X * 8 + 1, 0 1551 PRINT CHR$(32); CHR$(32); CHR$(178); CHR$(32); CHR$(32); CHR$(178); CHR$(32); CHR$(32); 1560 LOCATE 26 - Y * 3, X * 8 + 1, 0 1561 PRINT CHR$(32); CHR$(32) + "ROOK" + CHR$(32); CHR$(32); 1562 LOCATE 27 - Y * 3, X * 8 + 1, 0 1563 PRINT STRING$(2, CHR$(32)); STRING$(4, CHR$(178)); STRING$(2, CHR$(32)); : RETURN 1570 LOCATE 25 - Y * 3, X * 8 + 1, 0 1571 PRINT CHR$(32); CHR$(32); CHR$(176); CHR$(32); CHR$(32); CHR$(176); CHR$(32); CHR$(32); 1580 LOCATE 26 - Y * 3, X * 8 + 1, 0 1581 PRINT CHR$(32); CHR$(32) + "ROOK" + CHR$(32); CHR$(32); 1582 LOCATE 27 - Y * 3, X * 8 + 1, 0 1583 PRINT STRING$(2, CHR$(32)); STRING$(4, CHR$(176)); STRING$(2, CHR$(32)); : RETURN 1590 LOCATE 25, 31, 1: PRINT STRING$(10, " "); 1600 X$ = INKEY$: IF X$ = "N" THEN N$ = X$ 1610 IF X$ >= "A" AND X$ <= "H" THEN X = VAL(CHR$(ASC(X$) - 16)): GOTO 1730 1620 IF X$ = "N" THEN GOSUB 2030 1630 IF X$ = "K" AND a(5, 1) = 99 AND a(8, 1) = 7 THEN a(5, 1) = 1: a(8, 1) = 1: a(7, 1) = 99: a(6, 1) = 7: GOTO 1800 1640 IF X$ = "Q" AND a(5, 1) = 99 AND a(1, 1) = 7 THEN a(5, 1) = 1: a(1, 1) = 1: a(3, 1) = 99: a(4, 1) = 7: GOTO 1800 1650 IF X$ = "K" AND a(4, 1) = 99 AND a(1, 1) = 7 THEN a(4, 1) = 1: a(1, 1) = 1: a(2, 1) = 99: a(3, 1) = 7: GOTO 1800 1660 IF X$ = "Q" AND a(4, 1) = 99 AND a(8, 1) = 7 THEN a(4, 1) = 1: a(8, 1) = 1: a(6, 1) = 99: a(5, 1) = 7: GOTO 1800 1670 IF X$ = "X" THEN GOSUB 1830: LOCATE 25, 1, 0: PRINT "EXCHANGING "; : GOSUB 2480: IF CL$ = "Y" THEN LOCATE 25, 50, 0: PRINT "START "; TIME$; : GOTO 100: ELSE : GOTO 100 1680 IF X$ = "S" THEN GOTO 1820 1690 IF X$ = "M" THEN GOSUB 1840 1700 IF X$ = "I" THEN GOSUB 2220: CLS : GOSUB 900: LOCATE 25, 1, 1: PRINT "MOVE " + CHR$(7); b$; 1710 IF X$ = "L" THEN GOSUB 2040 1720 GOTO 1600 1730 LOCATE 25, 21, 1: PRINT X$; : LOCATE 25, 31, 1: PRINT " "; 1740 Y = VAL(INKEY$): IF Y = 0 THEN GOTO 1740 1750 LOCATE 25, 22, 1: PRINT Y; : LOCATE 25, 25, 1: PRINT "-"; 1760 IF a(X, Y) < 2 OR a(X, Y) > 99 THEN LOCATE 25, 31, 1: PRINT "ENTRY ERROR "; : GOTO 1590 1770 a$ = INKEY$: IF a$ < "A" OR a$ > "H" THEN GOTO 1770 ELSE a = VAL(CHR$(ASC(a$) - 16)) 1780 LOCATE 25, 27, 1: PRINT a$; 1790 b = VAL(INKEY$): IF b = 0 THEN GOTO 1790 ELSE LOCATE 25, 28, 1: PRINT b; 1800 IF X$ = "K" OR X$ = "Q" THEN LOCATE 25, 20, 1: PRINT "CSTL. "; X$; "-SIDE"; : GOSUB 1830 ELSE GOSUB 1830 1810 IF CL$ = "Y" THEN LOCATE 25, 50, 0: PRINT "START "; TIME$; 1820 RETURN 1830 LOCATE 25, 1, 1: PRINT STRING$(79, " "); : RETURN 1840 GOSUB 1830: LOCATE 25, 1, 1: PRINT "MODIFYING "; 1850 GOSUB 2010: IF M$ < "A" OR M$ > "H" THEN GOTO 1850 1860 X = VAL(CHR$(ASC(M$) - 16)): LOCATE 25, 21, 1: PRINT M$; 1870 M$ = INKEY$: IF M$ < "1" OR M$ > "8" THEN GOTO 1870 1880 Y = VAL(M$): LOCATE 25, 23, 1: PRINT M$; " = "; 1890 M$ = INKEY$: IF M$ = "C" OR M$ = "P" OR M$ = "E" THEN S1$ = M$: LOCATE 25, 27, 1: PRINT M$; : ELSE GOTO 1890 1900 M$ = INKEY$: IF M$ = "S" OR M$ = "P" OR M$ = "N" OR M$ = "B" OR M$ = "R" OR M$ = "Q" OR M$ = "K" THEN V$ = M$: LOCATE 25, 29, 1: PRINT M$; ELSE GOTO 1900 1910 IF V$ = "P" THEN V1 = 2 1920 IF V$ = "N" THEN V1 = 4 1930 IF V$ = "B" THEN V1 = 5 1940 IF V$ = "R" THEN V1 = 7 1950 IF V$ = "Q" THEN V1 = 9 1960 IF V$ = "K" THEN V1 = 99 1970 IF V$ = "S" THEN V1 = 1 1980 IF S1$ = "C" AND V1 <> 1 THEN V1 = -V1 1990 a(X, Y) = V1: IF S1$ = "E" THEN a(X, Y) = 1 2000 GOSUB 910: GOTO 1840 2010 M$ = INKEY$: IF M$ = "N" THEN GOSUB 2030: GOTO 2010: ELSE IF M$ = "Z" THEN GOSUB 1830: LOCATE 25, 20, 1: PRINT " "; : GOSUB 900: ELSE RETURN 2020 IF CL$ = "Y" THEN LOCATE 25, 51, 0: PRINT "START "; TIME$; : GOTO 100 ELSE GOTO 100 2030 FOR J = 1 TO 8: FOR K = 1 TO 8: K$ = STR$(K) 2031 LOCATE 27 - K * 3, J * 8 + 1, 0 2032 PRINT CHR$(J + 64); RIGHT$(K$, 1); : NEXT: NEXT: RETURN 2040 GOSUB 1830: LOCATE 25, 20, 1: PRINT "LEVEL="; B8!; : PRINT "CHANGE LEVELS?"; 2050 C$ = INKEY$: IF C$ = "N" THEN GOTO 2090 ELSE IF C$ = "Y" THEN LOCATE 25, 27, 1: PRINT " "; : GOSUB 1830: ELSE GOTO 2050 2060 L1$ = INKEY$: IF L1$ = "" THEN GOTO 2060 ELSE IF L1$ >= "0" AND L1$ <= "9" THEN LOCATE 25, 27, 1: PRINT L1$; : ELSE GOTO 2060 2070 L2$ = INKEY$: IF L2$ = "" THEN GOTO 2070 ELSE IF L2$ < "0" OR L2$ > "9" THEN L2$ = L1$: L1$ = "0" 2080 B8! = VAL(L1$) * 10 + VAL(L2$): B7! = B8! / 2: LOCATE 25, 27, 0: PRINT L1$; L2$; 2090 GOSUB 1830: LOCATE 25, 20, 0: PRINT " "; : LOCATE 25, 1, 1: PRINT "MOVE "; b$; : RETURN 2100 REM *** PROMOTION ROUTINE *** 2110 LOCATE 2, 1, 1: PRINT "P, N, B, R, Q "; 2120 Z$ = INKEY$: IF Z$ = "P" THEN a(a, b) = 2: GOTO 2180 2130 IF Z$ = "N" THEN a(a, b) = 4: GOTO 2180 2140 IF Z$ = "B" THEN a(a, b) = 5: GOTO 2180 2150 IF Z$ = "R" THEN a(a, b) = 7: GOTO 2180 2160 IF Z$ = "Q" THEN a(a, b) = 9: GOTO 2180 2170 GOTO 2120 2180 RETURN 2190 IF CL$ = "Y" THEN LOCATE 25, 61, 1: PRINT "STOP "; TIME$; 2200 LOCATE 25, 1, 1: PRINT "HIT (P) TO PLAY OR HIT (B) FOR BASIC"; 2210 a$ = INKEY$: IF a$ = "" THEN GOTO 2210 ELSE IF a$ = "B" THEN CLS : END ELSE IF a$ = "P" THEN RUN ELSE GOTO 2210 2220 CLS 2221 PRINT "1. USE LIST TO INSURE LOADED RIGHT, THE LAST LINE IS 65529 " 2230 PRINT "2. ALSE NOTE MEMORY SIZE AS A DOUBLE CHECK " 2240 PRINT "3. SPECIAL COMMANDS DURING PLAYER'S MOVE ARE:" 2250 PRINT " TYPE 'N' - TO NUMBER THE BOARD " 2260 PRINT " 'K' - TO CASTLE KING SIDE " 2270 PRINT " 'Q' - TO CASTLE QUEEN SIDE " 2280 PRINT " 'X' - TO EXCHANGE PIECES AND LET COMPUTER MOVE" 2290 PRINT " 'S' - TO LET THE COMPUTER PLAY BY ITSELF " 2300 PRINT " 'M' - TO MODIFY THE BOARD, ENTER THE SQUARE FOLLOWED BY" 2310 PRINT " C, P, OR E FOR COMPUTER, PLAYER, OR EMPTY" 2320 PRINT " AND S,P,N,B,R,Q,K FOR SQUARE,PAWN, ETC..." 2330 PRINT " 'Z' - TO ESCAPE MODIFY AND LET COMPUTER MOVE" 2340 PRINT " 'I' - TO GET INSTRUCTIONS AGAIN" 2350 PRINT " 'L' - TO LOOK AT OR CHANGE LEVEL OF PLAY" 2360 REM ******************************************************************** 2370 INPUT "HIT ENTER TO CONTINUE"; EN$: PRINT 2380 PRINT "4. TO PROMOTE TO P,N,B,R,Q ENTER THE LETTER WHEN PROMOTED" 2390 PRINT "5. TO CAPTURE 'EN PASSANT' SPECIFY THE 'FROM' - 'TO' SQUARES" 2400 PRINT "6. LEVELS OF PLAY ARE FROM 01 TO 24" 2410 PRINT "7. COMPUTER ASSUMES MATE IF KING IS LEFT IN CHECK SO BE SURE TO " 2411 PRINT " WATCH FOR CHECK MESSAGE" 2420 PRINT "8. IF A MOVE IS ILLEGAL OR AN ENTRY ERROR IS MADE SIMPLY TYPE IN" 2421 PRINT " A NEW MOVE. A MOVE MAY BE STARTED OVER BY FORCING AN ERROR. (E.G. '9')." 2430 PRINT "9. IF IS HIT DURING THE GAME, TYPE 'GOSUB 900:CONT' TO" 2435 PRINT " DRAW BOARD AND CONTINUE" 2440 PRINT "10. YOU HAVE A CHOICE OF BLACK OR WHITE, THE COMPUTER WILL ALWAYS" 2441 PRINT " BE AT THE TOP OF THE SCREEN" 2450 PRINT : PRINT : INPUT "HIT ENTER TO CONTINUE GAME"; EN$ 2460 RETURN 2480 I = -I: GOSUB 2490: GOSUB 900: RETURN 2490 L = 0: FOR J = 1 TO 8: FOR K = 1 TO 8: L = L + 1: IF a(J, K) <> 1 THEN C(L) = -a(J, K): ELSE C(L) = a(J, K) 2500 NEXT: NEXT 2510 L = 65: FOR J = 1 TO 8: FOR K = 1 TO 8: L = L - 1: a(J, K) = C(L): NEXT: NEXT 2520 RETURN 65529 END