Ajedrez invencible
Descripción del contenido de la página
Juego de ajedrez (inacabado) escrito en Sinclair BASIC.
Este programa, rescatado del baúl de los recuerdos de setiembre de 1984, fue un proyecto interesante. Lo llamé «Ajedrez invencible» porque efectivamente pretendía ser invencible... el juego del jugador humano, no el de la computadora. Recuerdo que la programación de los algoritmos para comprobar la legalidad de los movimientos fue un buen desafío.
Abandoné el proyecto antes de programar la parte más interesante, la del juego de la computadora, lo cual facilitó el objetivo: el jugador humano podía practicar un «ajedrez invencible», moverse a su antojo y aniquilar todas las inmóviles e indefensas fichas enemigas.
Pantallazos
Las fichas rojas y verdes simplifican el aspecto gráfico:
La entrada de movimientos es cómoda y rápida. Sólo se requieren cuatro pulsaciones (dos por coordenada), y algunas comprobaciones se hacen sobre la marcha para ahorrarlas posteriormente:
El programa tiene un mensaje de advertencia para cada posible movimiento ilegal, como muestran los siguientes ejemplos:
Código fuente
En el siguiente listado, los caracteres gráficos están recuadrados, así como los comandos incluidos en cadenas de texto. La notación \{pX} que aparece en algunas cadenas de texto representa los dos caracteres de control que cambian el papel al color X (es el formato del entorno de desarrollo BASin).
10 REM AJEDREZ INVENCIBLE (e inacabado)
20 REM Copyright (C) 1984 Marcos Cruz (http://programandala.net)
30 REM Licencia/Permesilo/License: http://programandala.net/lp
40 REM 1984-09
50 REM
60 GO TO 1130
70 REM RECORRIDO**************
80 LET Y0=YI: LET X0=XI: LET IX=SGN (XF-XI)*2: LET IY=SGN (YF-YI)*2
90 LET X0=X0+IX: LET Y0=Y0+IY
100 IF (X0=XF) AND (Y0=YF) THEN GO TO 140
110 IF SCREEN$ (Y0,X0)<>" " THEN LET T$="NO PUEDE MOVERSE"+CHR$ 13+"HAY UNA FICHA EN EL CAMINO": GO TO 180
120 GO TO 90
130 REM BORRAR FICHA***********
140 PAPER 8: PRINT AT YI,XI;" ";AT YI+1,XI;" ": RETURN
150 REM TIRADA ORDENADOR*******
160 REM
170 REM ERROR******************
180 LET T$=N$+T$: GO SUB 850: PAUSE VAL "40"
190 REM TIRADA HUMANO**********
200 LET N$="": LET T$="MOVIMIENTO:": GO SUB 850: PAUSE NOT PI: LET I$=INKEY$: PRINT I$;
210 IF I$="S" THEN PRINT AT 20,0;B$: SAVE "TABLERO"SCREEN$ : GO TO 200
220 IF I$="J" THEN INK VAL "7": PAPER VAL "7": CLS : LOAD ""SCREEN$ : INK NOT PI: GO TO 830
230 IF I$="<>" THEN SAVE "AJEDREZ_IN": GO TO 200
240 IF I$>"H" OR I$<"A" THEN GO TO 200
250 BEEP .1,NOT PI: LET XI=8+2*(CODE I$-65)
260 PAUSE NOT PI: LET I$=INKEY$: PRINT I$;;"-";: IF I$>"8" OR I$<"1" THEN GO TO 200
270 BEEP .1,NOT PI: LET YI=16-2*(VAL I$-1)
280 PAUSE NOT PI: LET I$=INKEY$: PRINT I$;: IF I$>"H" OR I$<"A" THEN GO TO 200
290 BEEP .1,NOT PI: LET XF=8+2*(CODE I$-65)
300 PAUSE NOT PI: LET I$=INKEY$: PRINT I$: IF I$>"8" OR I$<"1" THEN GO TO 200
310 BEEP .1,NOT PI: LET YF=16-2*(VAL I$-1)
320 IF YI=YF AND XI=XF THEN LET T$="ES CACHONDEO?": GO TO 180
330 REM COMPROBACIONES*********
340 POKE 23606,PEEK 23675: POKE 23607,PEEK 23676-1: LET I$=CHR$ (CODE SCREEN$ (YI,XI)+112): LET F$=SCREEN$ (YF,XF): LET AI=ATTR (YI,XI): LET AF=ATTR (YF,XF): POKE 23606,0: POKE 23607,60
350 IF I$="p" THEN LET T$="NO TIENES FICHA AHI": GO TO 180
360 IF AI=EB OR AI=EN THEN LET T$="ESA FICHA ES MIA": GO TO 180
370 IF AF=PB OR AF=PN THEN LET T$="AHI HAY UNA FICHA TUYA": GO TO 180
380 IF I$=P$(1) THEN GO SUB 460:
390 IF I$=P$(2) THEN GO SUB 580
400 IF I$=P$(3) THEN GO SUB 650
410 IF I$=P$(4) THEN GO SUB 680
420 IF I$=P$(5) THEN GO SUB 710
430 IF I$=P$(6) THEN GO SUB 740
440 GO SUB 880: GO TO 200
450 REM PEON?******************
460 LET N$="EL PEON ": IF YF>=YI THEN LET T$="SOLO PUEDE AVANZAR": GO TO 180
470 IF YF<(YI-4) THEN LET T$="NO AVANZA TANTO HACIA ADELANTE": GO TO 180
480 IF (XF<XI-2) OR (XF>XI+2) THEN LET T$="NO AVANZA TANTO DE LADO": GO TO 180
490 IF (YF=YI-4) AND (YI<>14) THEN LET T$="SOLO AVANZA DOS CASILLASLA PRIMERA VEZ": GO TO 180
500 IF ((XF=XI-2) OR (XF=XI+2)) AND (YF<>(YI-2)) THEN LET T$="NO MUEVE DE LADO": GO TO 180
510 IF ((XF=XI-2) OR (XF=XI+2)) AND (YF=YI-2) AND (AF<>EB AND AF<>EN) THEN LET T$="SOLO MUEVE EN DIAGONAL PARA COMER": GO TO 180
520 IF XF=XI AND ((AF=EB) OR (AF=EN)) THEN LET T$="NO COME DE FRENTE": GO TO 180
530 IF YF=YI-4 THEN GO SUB 80: GO TO 560
540 GO SUB 140
550 IF YF=2 THEN PRINT AT YF,XF; INK PN;G$(15 TO 16);AT YF+1,XF;G$(17 TO 18): RETURN
560 PRINT AT YF,XF; INK PN;G$(19 TO 20);AT YF+1,XF;G$(3 TO 4): RETURN
570 REM CABALLO?***************
580 LET N$="EL CABALLO ": LET T$="NO SALTA ASI": IF ABS (XI-XF)<>4 AND ABS (YI-YF)<>2 AND ABS (XI-XF)<>2 AND ABS (YI-YF)<>4 THEN GO TO 180
590 IF ABS (XI-XF)=4 AND ABS (YI-YF)<>2 THEN GO TO 180
600 IF ABS (XI-XF)=2 AND ABS (YI-YF)<>4 THEN GO TO 180
610 IF ABS (YI-YF)=4 AND ABS (XI-XF)<>2 THEN GO TO 180
620 IF ABS (YI-YF)=2 AND ABS (XI-XF)<>4 THEN GO TO 180
630 GO SUB 140: PRINT AT YF,XF; INK PN;G$(11 TO 12);AT YF+1,XF;G$(13 TO 14): RETURN
640 REM ALFIL?*****************
650 LET N$="EL ALFIL ": IF ABS (XF-XI)<>ABS (YF-YI) THEN LET T$="SOLO MUEVE EN DIAGONAL": GO TO 180
660 GO SUB 80: PRINT AT YF,XF; INK PN;G$(5 TO 6);AT YF+1,XF;G$(17 TO 18): RETURN
670 REM TORRE?*****************
680 LET N$="LA TORRE ": IF (XI<>XF) AND (YI<>YF) THEN LET T$="SOLO MUEVE EN VERTICAL O EN HORIZONTAL": GO TO 180
690 GO SUB 80: PRINT AT YF,XF; INK PN;G$( TO 2);AT YF+1,XF;G$(17 TO 18): RETURN
700 REM DAMA?******************
710 LET N$="LA DAMA ": IF (ABS (XF-XI)<>ABS (YF-YI)) AND ((XI<>XF) AND (YI<>YF)) THEN LET T$="NO SE MUEVE ASI": GO TO 180
720 GO SUB 80: PRINT AT YF,XF; INK PN;G$(15 TO 16);AT YF+1,XF;G$(17 TO 18): RETURN
730 REM REY?*******************
740 LET N$="EL REY ": IF (ABS (XF-XI)>2) OR (ABS (YF-YI)>2) THEN LET T$="SOLO MUEVE UN ESPACIO": GO TO 180
750 GO SUB 140: PRINT AT YF,XF; INK PN;G$(7 TO 8);AT YF+1,XF;G$(9 TO 10): RETURN
760 REM TABLERO****************
770 LET G$="ABCDEFGHIJKLMNOPQRST": LET P$="SKEAOG"
780 FOR N=2 TO 17 STEP 4: PRINT AT N,8;" \{p0} \{p7} \{p0} \{p7} \{p0} \{b0p7} \{p0} \{p7}"'TAB 8;" \{p0} \{p7} \{p0} \{p7} \{p0} \{p7} \{p0} \{p7}": NEXT N
790 FOR N=4 TO 19 STEP 4: PRINT AT N,8;"\{p0} \{p7} \{p0} \{p7} \{p0} \{p7} \{p0} \{p7} ";TAB 8;"\{p0}0 \{p7} \{p0} \{p7} \{p0} \{p7} \{p0} \{p7} ": NEXT N
800 PRINT AT 2,8; PAPER 8; INK 4;"ABKLEFOPGHEFKLAB";TAB 8;"QRMNQRQRIJQRMNQR";TAB 8;"STSTSTSTSTSTSTST";TAB 8;"CDCDCDCDCDCDCDCD"
810 PRINT AT 14,8; INK 2;; PAPER 8;"STSTSTSTSTSTSTST";TAB 8;"CDCDCDCDCDCDCDCD";TAB 8;"ABKLEFOPGHEFKLAB";TAB 8;"QRMNQRQRIJQRMNQR"
820 PRINT AT 18,8;: FOR N=65 TO 72: PRINT ;CHR$ N;" ";: NEXT N: PRINT AT 1,8;: FOR N=8 TO 1 STEP -1: PRINT 'TAB 7;N: NEXT N
830 LET T$="EMPIEZAS TU": GO SUB 850: PAUSE VAL "40": GO TO 200
840 REM MENSAJES***************
850 PRINT AT 20,0;B$'B$;AT 20,0;: FOR N=1 TO LEN T$: PRINT INVERSE 1;" ";CHR$ 8;: BEEP .05,N: IF CODE T$(N)=13 THEN PRINT " ";
860 PRINT T$(N);: NEXT N: RETURN
870 REM MENSAJES***************
880 IF RND>.3 THEN RETURN
890 LET N=INT (RND*NM+1): IF CODE M$(N)=255 THEN RETURN
900 LET N$="": LET T$=M$(N,2 TO CODE M$(N)-29): LET M$(N,1)=CHR$ 255: GO SUB 850: RETURN
910 REM
920 RESTORE 930: READ NM: DIM M$(NM,CODE "@"): FOR N=SGN PI TO NM: READ M$(N): NEXT N: RETURN
930 DATA VAL "19","5YO NO HUBIERA HECHO ESO"
940 DATA "BME PARECE QUE NO TIENES MUCHA IDEA"
950 DATA "=ESTA VA A SER UNA BUENA PARTIDA"
960 DATA "$UMM..."
970 DATA "CHAS PERDIDO UNA OPORTUNIDAD MUY CLARA"
980 DATA "DDONDE APRENDISTE A JUGAR DE ESA FORMA?"
990 DATA ":EL AJEDREZ INVENCIBLE GANARA"
1000 DATA "<NO TIENES UNA SOLA POSIBILIDAD"
1010 DATA "*COMO MUEVAS ASI DE NUEVO ME DESCONECTO"
1020 DATA ")JE,JE,JE..."
1030 DATA ">POR QUE NO TE VAS A VER LA TELE?"
1040 DATA ">MUY INTELIGENTE PERO POCO EFICAZ"
1050 DATA "1A VECES ME DAS PENA"
1060 DATA "8UNA PARTIDA INSTRUCTIVA..."
1070 DATA "+QUE VERANO JUGASTE A ESTO POR ULTIMA VEZ?"
1080 DATA "XMI GENIAL PROGRAMADOR YA ME PREVINO CONTRA ESTAS COSAS"
1090 DATA ":TIENE PROBLEMAS SICOLOGICOS?"
1100 DATA "CESA JUGADA MERECE VERSE A CAMARALENTA"
1110 DATA "8QUE NO SE REPITA,POR FAVOR"
1120 REM VARIABLES**************
1130 PAPER VAL "7": INK NOT PI: BORDER VAL "7": CLS : PAPER VAL "8": PRINT INVERSE SGN PI;"AJEDREZ INVENCIBLE © 1984 M.Cruz"
1140 RESTORE 1190: FOR N=USR "A" TO USR "T"+7: READ A: POKE N,A: BEEP .03,INT (A/4): NEXT N
1150 LET EN=4: LET EB=60: LET PN=2: LET PB=58: POKE 23658,8
1160 DIM T(8,8,2): FOR Y=1 TO 8: FOR X=1 TO 8: READ T(X,Y,1),T(X,Y,2): NEXT X: NEXT Y
1170 LET B$=" "
1180 GO SUB 920
1190 DATA 0,0,0,25,25,31,15,7,0,0,0,152,152,248,240,224
1200 DATA 3,3,3,7,7,15,31,0,192,192,192,224,224,240,248,0
1210 DATA 0,1,3,7,15,31,15,7,0,128,192,128,48,248,240,224
1220 DATA 1,1,7,7,1,1,31,15,128,128,224,224,128,128,248,240
1230 DATA 15,15,15,15,15,63,127,0,240,240,240,240,240,252,254,0
1240 DATA 0,1,1,1,5,14,31,28,0,32,192,192,240,240,240,240
1250 DATA 0,1,3,3,3,7,15,0,240,240,224,224,224,240,248,0
1260 DATA 1,35,33,63,63,7,15,7,128,196,132,252,252,224,240,224
1270 DATA 7,7,7,7,31,63,63,0,224,224,224,224,248,252,252,0
1280 DATA 0,0,0,1,3,1,0,1,0,0,128,192,224,192,128,192
1290 DATA 5,0,3,0,4,0,10,0,20,0,4,0,3,0,5,0
1300 DATA 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0
1310 DATA 0,0,0,1,0,3,0,3,0,3,0,3,0,1,0,0
1320 DATA 0,0,0,1,0,3,0,5,0,5,0,3,0,1,0,0
1330 DATA 0,0,0,1,0,3,0,5,0,5,0,3,0,1,0,0
1340 DATA 0,0,0,1,0,3,0,3,0,3,0,3,0,1,0,0
1350 DATA 101,0,101,1,101,1,101,1,101,1,101,1,101,1,101,0
1360 DATA 105,0,103,0,104,0,110,0,120,0,104,0,103,0,105,0
1370 GO TO 770
1380 CLEAR : SAVE "AJEDREZ_IN" LINE 10