SERIE CONVERSIONES DEL VIC-20 AL SPECTRUM Programa: El juego de los barcos Version base / Basic / Juego Publicado en la página 15 de la revista Tu Micro 3/4 de julio/agosto de 1984. Abreviaciones aproximadas a los codigos en el programa Basic original del VIC: ¬ = negro s = cursor a inicio r = reverso € = blanco h = limpia pantalla (SH+S) _ = normal £ = rojo ] = cursor derecha \ = cian [ = curs. izq. m = magenta q = curs. abajo SH = SHIFT ^ = verde ç = cur. arriba CT v= CONTROL a = azul d = borrar C= = tecla Commodore ñ = amarillo i = insertar El listado original: 10 REM BARCOS 80 PRINT"hqqqqDAVID SANTAOLALLA SANTIAGO RUIZ" 90 GET A$:IF A$="" THEN 90 500 DIM AD(3):DIM AT(3) 520 FOR I=1TO3:AD(I)=0:AT(I)=0:NEXTI 560 AC=0 600 DIM AU(6):FOR I=1TO6:AU(I)=0:NEXTI 900 POKE36879,30 990 PRINT"H 1000 GOSUB7500 1010 PRINT"ç£ rJUEGO DE LOS BARCOS _¬" 1012 FOR P=1TO10:A=7747+P:B=175+P:POKEA,B:NEXTP 1015 FOR P=38466TO38742 1017 POKE P,0:NEXTP 1020 FOR M=7769TO7780:I=242+M 1040 POKE M,96+128 1050 POKE I,96+128 1060 NEXTM 1070 FOR P=7791TO8022STEP22 1080 C=P+11 1090 POKE P,96+128 1100 POKE C,96+128 1120 NEXTP 1130 FOR C=1TO10:H=7790+(C-1)*22:POKE H,VC+128 1140 NEXTC 1143 POKE38730,0:POKE34888,0 1145 POKE8010,160:POKE7768,160:POKE7758,160 1150 GOSUB2000 1170 PRINT"r¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 1175 PRINTSPC(14)"^rPUNTOS¬_ 1180 PRINT"qqqqqqqqqqqr-------------------_ 1190 PRINT"rCOORDENADAS DEL TIRO_q 1200 INPUT S$:D=ASC(S$)-48 1205 INPUT M$:E=ASC(M$)-65:PRINT"ççç":IF D<=10ANDE<=9ANDE>=0THEN1210 1208 PRINT"ç":GOTO1200 1210 POKE7792+D+(22*E),193 1220 FOR INDA=1TO12 1222 IF H(D,E)=INDA THEN GOSUB6000 1225 IF H(D,E)=0 THENPRINT"mçAGUA a 1300 NEXT INDA 1500 GOTO1200 1990 END 2000 FOR AN=1TO10 2003 FOR IN=1TO10 2005 H(AN,IN)=0 2010 NEXT IN:NEXT AN 2030 FOR I=1TO6 2040 A=INT(RND(1)*10):B=INT(RND(1)*10) 2045 FOR K=1TOI 2050 IF H(A,B)=K THEN2040 2055 NEXTK 2060 H(A,B)=I 2080 NEXTI 2090 FOR I=7TO9 2100 A=INT(RND(1)*10):B=INT(9*RND(1)) 2120 FOR K=1TOI 2130 IF H(A,B)=K OR h(A,B+1)=K THEN GOTO2100 2132 NEXT K 2150 H(A,B)=I 2155 V=B+1:H(A,V)=I 2160 NEXTI 2170 FOR I=10TO11 2210 A=INT(RND(1)*10):B=INT(RND(1)*8) 2220 FOR K=1TOI 2225 IF H(A,B)=K OR H(A,B+1)=K OR H(A,B+2)=K THEN2210 2240 NEXTK 2250 H(A,B)=I:H(A,B+1)=I:H(A,B+2)=I 2260 NEXTI 2300 A=INT(RND(1)*10):B=INT(RND(1)*7) 2310 FOR M=1TO11 2315 IF H(B,A)=M OR H(B+1,A)=M OR H(B+2,A)=M OR H(B+3,A)=M THEN2300 2320 NEXTM 2330 H(B,A)=12:H(B+1,A)=12:H(B+2,A)=12:H(B+3,A)=12 2900 RETURN 6000 FOR P=1TO6 6010 IF H(D,E)<>P THEN6030 6020 PRINT"ç£HUNDIDO DE UNO <":H(D,E)=20:AU(p)=1:GOTO6500 6030 NEXTP 6100 FOR P=1TO3 6110 IF H(D,E)<>P+6THEN6140 6115 AD(P)=AD(P)+1 6120 IF AD(P)=2THENPRINT"ç£HUNDIDO DE DOS a":H(D,E)=20:GOTO6500 6130 IF AD(P)=1THENPRINT"çñTOCADO DE DOS a":H(D,E)=20:GOTO6500 6140 NEXTP 6200 FOR P=1TO2 6210 IF H(D,E)<>P+9THEN6240 6215 AT(P)=AT(P)+1 6220 IF AT(P)=3THENPRINT"ç£HUNDIDO DE TRES a": H(D,E)=20:GOTO6500 6230 IF AT(p)<>3AND AT(P)<>0THENPRINT"çñTOCADO DE TRES a":H(D,E)=20: GOTO6500 6240 NEXTP 6300 IF H(D,E)=12THEN AC=AC+1 6310 IF AC=4 THENPRINT"ç£HUNDIDO DE CUATRO a":H(D,E)=20 6320 IF AC<>4AND AC<>0 THENPRINT"çñTOCADO DE CUATROa ":H(D,E)=20 6500 FOR J=14TO19 6510 POKE(38576+J),0 6520 POKE(38598+J),0 6530 POKE(38620+J),0 6540 POKE(38642+J),0 6550 NEXTJ 6560 POKE7916,48+AD(1) 6570 POKE7918,48+AD(2) 6580 POKE7920,48+AD(3) 6590 POKE7938,48+AT(1):POKE7960,48+AC:POKE7940,48+AT(2) 6595 POKE38512+D+(22*E),2 6600 FOR T=1TO6:POKE7892+T,48+AU(T):NEXTT 6650 FOR I=1TO6:IF AU(I)<>1THENRETURN 6670 NEXTI 6700 IF AD(1)=2AND AD(2)=2AND AD(3)=2AND AT(1)=3AND AT(2)=3AND AC=4 THEN9000 6800 RETURN 7500 PRINT"s":PRINTSPC(13)"qqqqqqq/------\":PRINTSPC(13)"ç|1000000|" 7510 PRINTSPC(13)"ç|2 0 0 0|" 7515 PRINTSPC(13)"ç|3 0 0 |" 7520 PRINTSPC(13)"ç|4 0 |" 7525 PRINTSPC(13)"ç\-------/s" 7800 RETURN 9000PRINT"SACABO":END PORTANDOLO AL SPECTRUM La estructura del listado Basic es la sigte.: 10-90 Cabecera de presentación 500-600 inicializa a cero los los marcadores de aciertos 1010-1190 Dibujo del tablero 1200-1205 introducción del tiro 1210 situación del lanzamiento en el tablero 1220-1500 comprobación del lanzamiento 2000-2010 inicializa la matriz que representa el mar en el que transcurre el juego 2030-2900 situación de los barcos 6000-6320 generación de mensajes tras un acierto 6500-6700 actualización del recuadro de puntos 7500-7800 dibujo del recuadro de puntos Lista de variables: D y E almacenan los valores efectivos del disparo H(10,10) matriz que representa la zona de mar AU, AD y AT almacenan los blancos realizados a los navios enemigos Las demas vbaiables tienen asigaciones auxliares o valores intermedios como son el posicionado de pantalla, colores y sonido. Sabiendo ya esto, podemos entonces empezar la conversion del modo sigte.: h(11,11) - ya que el Spectrum no tiene subindice 0 u, d y t - pues el Spectrum no acepta matrices de nombre largo s$ - variable esclusiva dimensionada para almacenar 15 espacios Aplicando todo lo que ya sabemos del VIC20, los POKEs y caracteres de coloreado son reemplazados por su equivalente Sinclair y los POKEs de sonido y posicionado de pantalla lo mismo. A continuación, el listado del programa convertido usando BASINC: 10 BORDER 3: PAPER 6: INK 9 20 CLS 30 DIM s$(15) 35 PRINT AT 3,5;"DEL" 40 PRINT INK 1;AT 5,5;"\: \ : \':\' \ :\''\. \''\: \:'\':"'TAB 5; "\ :\ \: \ \ : \ : \. \:' \: \ :"'TAB 6;"\'' \''\' \ '\'' \''\' \''\''" 50 PRINT INK 1;TAB 5;"\''\''\''\''\''\''\''\''\''\''\''\''\''\''" 55 PRINT TAB 5;"AL ZX SPECTRUM 48K" 60 PRINT FLASH 1;AT 15,5;"EL JUEGO DE LOS BARCOS." 70 PRINT #0;TAB 5;"\{vi}PULSE CUALQUIER TECLA\{vn}" 80 PAUSE 0 90 RANDOMIZE 100 DIM h(11,11) 110 POKE 23658,8 500 DIM d(3): DIM t(3) 560 LET ac=0 600 DIM u(6) 900 BEEP .3,0 990 CLS 1000 GO SUB 7500 1010 PRINT AT 0,0; INK 2;"\{vivnvi} JUEGO DE LOS BARCOS\{vn} \::\::\::\::\::\::\::\::\::\::\::" 1015 PRINT "\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\.. \..\..\..\..\..\..\..\..\..\..\..\..\..\..\.." 1020 PRINT PAPER 0;s$'s$ 1030 PRINT AT 2,2;"\{vi}0123456789\{vn}" 1040 FOR m=4 TO 13: PRINT INVERSE 1;AT m,0;CHR$ (61+m); INVERSE 0;"\::";TAB 12; "\::\::\::": NEXT m 1050 PRINT PAPER 0;S$ 1060 PRINT PAPER 4;AT 3,18;"\{vi}PUNTOS:\{vn}" 1150 GO SUB 2000 1180 PRINT AT 15,0;"\{vi}________________________________\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{vn}" 1190 PRINT AT 20,0;"\{vi}COORDENADAS DE TIRO:\{vn}" 1200 INPUT "0-9: ";z$: LET d= CODE z$-47 1205 INPUT "A-J: ";m$: LET e= CODE m$-64: IF d<=10 AND e<=10 AND e>=0 THEN GO TO 1210 1208 GO TO 1200 1210 PRINT INK 4;AT e+3,d+1;"*\{vn}" 1220 FOR i=1 TO 12 1222 IF h(D,E)=i THEN GO SUB 6000 1225 IF h(D,E)=0 THEN PRINT AT 18,0; INK 3;"AGUA " 1300 NEXT i 1500 GO TO 1200 2000 FOR a=1 TO 10 2003 FOR i=1 TO 10 2005 LET h(A,I)=0 2010 NEXT i: NEXT a 2030 FOR i=1 TO 6 2040 LET a=INT (RND*10)+1: LET b=INT (RND*10)+1 2045 FOR k=1 TO i 2050 IF h(A,B)=k THEN GO TO 2040 2055 NEXT k 2060 LET h(A,B)=i 2080 NEXT i 2090 FOR i=7 TO 9 2100 LET a=INT (RND*10)+1: LET b=INT (RND*9)+1 2120 FOR k=1 TO i 2130 IF h(A,B)=k OR h(A,B+1)=k THEN GO TO 2100 2132 NEXT k 2150 LET h(A,B)=i 2155 LET v=b+1: LET h(A,V)=i 2160 NEXT i 2170 FOR i=10 TO 11 2210 LET a=INT (RND*10)+1: LET b=INT (RND*8)+1 2220 FOR k=1 TO i 2225 IF h(A,B)=k OR h(A,B+1)=k OR h(A,B+2)=k THEN GO TO 2210 2240 NEXT k 2250 LET h(A,B)=i: LET h(A,B+1)=i: LET h(A,B+2)=i 2260 NEXT i 2300 LET a=INT (RND*10)+1: LET b=INT (RND*7)+1 2310 FOR m=1 TO 11 2315 IF h(b,a)=m OR h(b+1,a)=m OR h(b+2,a)=m OR h(b+3,a)=m THEN GO TO 2300 2320 NEXT m 2330 LET h(b,a)=12: LET h(b+1,a)=12: LET h(b+2,a)=12: LET h(b+3,a)=12 2900 RETURN 6000 FOR p=1 TO 6 6010 IF h(D,E)<>p THEN GO TO 6030 6020 PRINT AT 18,0; INK 2;"HUNDIDO DE UNO ": LET h(D,E)=20: LET u(p)=1: GO TO 6500 6030 NEXT p 6100 FOR p=1 TO 3 6110 IF h(D,E)<>p+6 THEN GO TO 6140 6115 LET d(p)=d(p)+1 6120 IF d(p)=2 THEN PRINT AT 18,0; INK 2;"HUNDIDO DE DOS ": LET h(D,E)=20 : GO TO 6500 6130 IF d(p)=1 THEN PRINT AT 18,0; INK 1;"TOCADO DE DOS ": LET h(D,E)=20 : GO TO 6500 6140 NEXT p 6200 FOR p=1 TO 2 6210 IF h(D,E)<>p+9 THEN GO TO 6240 6215 LET t(p)=t(p)+1 6220 IF t(p)=3 THEN PRINT AT 18,0; INK 2;"HUNDIDO DE TRES ": LET h(D,E)=20: GO TO 6500 6230 IF t(p)<>3 AND t(p)<>0 THEN PRINT AT 18,0; INK 1;"TOCADO DE TRES ": LET h(D,E)=20: GO TO 6500 6240 NEXT p 6300 IF h(D,E)=12 THEN LET ac=ac+1 6310 IF ac=4 THEN PRINT AT 18,0; INK 2;"HUNDIDO DE CUATRO ": LET h(D,E)=20 6320 IF ac<>4 AND ac<>0 THEN PRINT AT 18,0; INK 1;"TOCADO DE CUATRO ": LET h(D,E)=20 6560 PRINT AT 7,20;d(1) 6570 PRINT AT 7,22;d(2) 6580 PRINT AT 7,24;d(3) 6590 PRINT AT 8,20;t(1);AT 8,22;t(2) 6595 PRINT AT 9,20;ac 6600 FOR t=1 TO 6: PRINT AT 6,18+t;u(t): NEXT t 6650 FOR i=1 TO 6: IF u(i)<>1 THEN GO TO 1225 6670 NEXT i 6700 IF d(1)=2 AND d(2)=2 AND d(3)=2 AND t(1)=3 AND t(2)=3 AND ac=4 THEN GO TO 9000 6800 RETURN 7500 PRINT AT 5,17;"\.'\''\''\''\''\''\''\''\'."'TAB 17;"\: 1000000\ :" 7510 PRINT TAB 17;"\: 2 0 0 0\ :" 7515 PRINT TAB 17;"\: 3 0 0 \ :" 7520 PRINT TAB 17;"\: 4 0 \ :" 7525 PRINT TAB 17;"\'.\..\..\..\..\..\..\..\.'" 7800 RETURN 9000 PRINT , FLASH 1;"SE ACABO" (c)2021-23 zx_if1@hotmail.com