Ajedrez invencible

Descripción del contenido de la página

Juego de ajedrez (inacabado) escrito en Sinclair BASIC.

Etiquetas:

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:

Inicio

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:

MovimientoPrimer movimiento

El programa tiene un mensaje de advertencia para cada posible movimiento ilegal, como muestran los siguientes ejemplos:

ErrorErrorErrorErrorError

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

Descargas