Juego de barcos entre QL y ZX Spectrum

Descripción del contenido de la página

Juego de barcos para Sinclair QL y ZX Spectrum, que se comunican mediante un cable serial.

Etiquetas:

Este juego de barcos probablemente es una adaptación que hice de alguno de los muchos similares que circulaban para la ZX Spectrum. La novedad que aporta esta versión es que la batalla naval se libra entre una QL y una ZX Spectrum conectadas mediante un cable serial.

La ZX Spectrum usa la interfaz de disco Beta Disk y el puerto serie de la interfaz de Indescomp.

Tres años después escribí una versión modificada de este mismo juego de barcos, para jugar con dos QL en red.

Código fuente

Para QL

10 REMark Juego de barcos entre QL y Spectrum
15 REMark mediante RS232C (SER1)
20 :
25 REMark Copyright (C) 1987, 1988 Marcos Cruz (http://programandala.net)
30 REMark Licencia/Permesilo/License: http://programandala.net/licencia
35 :
40 REMark 1987-04
45 REMark 1988-01-22 Ajustado
50 :
55 REMark Inicializacion RS232C:
60 :
70 OPEN#3,ser2c
75 BAUD 4800
80 :
92 REMark Preparacion:
93 :
100 nb=8
105 RESTORE
110 DIM p(10,10)
120 DIM b(nb)
130 DIM b$(nb,12)
140 FOR i=1 TO nb
150 READ b(i),b$(i)
160 NEXT i
170 DATA 1,"LANCHA"
180 DATA 1,"LANCHA"
190 DATA 2,"CRUCERO"
200 DATA 2,"CRUCERO"
210 DATA 3,"ACORAZADO"
220 DATA 3,"ACORAZADO"
230 DATA 4,"DESTRUCTOR"
240 DATA 5,"PORTAAVIONES"
250 :
260 REMark Decidir quien es quien:
270 :
300 INPUT#3;j$:j$=j$(1)
320 :
330 REMark Preparar pantalla:
340 :
345 CLS#0:CLS#1
350 col=0
360 IF j$="2" THEN col=7
380 PAPER 7
390 INK 0
400 CLS
410 PRINT "BATALLA DE BARCOS VIA RS232C"
420 PRINT
430 PRINT "JUGADOR ";j$
440 PRINT
450 PRINT "BARCOS TUYOS      ";
460 PRINT "BARCOS ENEMIGOS"
465 PRINT
470 PRINT " 0123456789        ";
480 PRINT "0123456789"
490 FOR i=1 TO 10
500 PRINT CHR$(i+64);"..........       ";
510 PRINT CHR$(i+64);".........."
520 NEXT i
530 :
540 REMark Colocar barcos:
550 :
560 FOR i=1 TO nb
570 m$=i&". "&b$(i)&" "&b(i)&" CUADROS":GO SUB 8000
580 GO SUB 9000
585 IF p(le,nu) THEN GO TO 580
586 IF b(i)=1 THEN ili=0:ico=0:GO TO 671
590 INPUT#0;"A, B, D o I ? ";a$
600 IF a$>="a" THEN a$=CHR$(CODE(a$)-32)
610 IF a$<>"A" AND a$<>"B" AND a$<>"D" AND a$<>"I" THEN GO TO 590
620 IF a$="A" THEN ili=-1:ico=0
630 IF a$="B" THEN ili=1:ico=0
640 IF a$="D" THEN ili=0:ico=1
650 IF a$="I" THEN ili=0:ico=-1
660 IF le+ili*b(i)<1 OR le+ili*b(i)>10 THEN GO TO 590
670 IF nu+ico*b(i)<1 OR nu+ico*b(i)>10 THEN GO TO 590
671 le2=le:nu2=nu
672 FOR j=1 TO b(i)
673 IF p(le2,nu2) THEN GO TO 580
674 le2=le2+ili:nu2=nu2+ico
675 NEXT j
680 INK b(i)
690 FOR j=1 TO b(i)
700 AT li,co:PRINT "χ"
710 li=li+ili
720 co=co+ico
730 p(le,nu)=b(i)
740 le=le+ili
750 nu=nu+ico
760 NEXT j
770 INK 0
780 NEXT i
790 m$="LISTOS PARA ENTRAR EN COMBATE":GO SUB 8000
800 :
810 REMark Seleccion:
820 :
830 IF j$="2" THEN GO TO 5000
840 :
850 REMark Disparar al Spectrum:
860 :
870 m$="DISPARA AL SPECTRUM:":GO SUB 8000
880 GO SUB 9000
885 AT li,co+18:PRINT "*"
890 PRINT#3;a$:REMark disparo
900 m$="ESPERANDO RESULTADOS":GO SUB 8000
910 INPUT#3,a$:a$=a$(LEN(a$)-1 TO)
920 a=a$(1)
925 x=a$(2)
930 IF a=1 THEN AT li,co+18:PRINT "O":m$="¡AGUA!"
940 IF a>1 THEN AT li,co+18:PRINT "X":m$="¡BARCO TOCADO!"
950 IF a>2 THEN m$="¡"&b$(x)&" ENEMIGO HUNDIDO!"
955 GO SUB 8000
960 IF a=4 THEN m$="¡HAS GANADO LA PARTIDA!":GO SUB 8000:GO TO 9900
4990 :
5000 REMark Esperar disparo del Spectrum:
5010 :
5020 m$="ESPERANDO DISPARO DEL SPECTRUM":GO SUB 8000
5030 INPUT#3,a$:a$=a$(LEN(a$)-1 TO)
5040 GO SUB 9062
5050 m$="SPECTRUM DISPARA A "&a$:GO SUB 8000
5060 x=p(le,nu)
5070 p(le,nu)=0
5080 IF x=0 THEN a=1:GO TO 5500
5090 a=2
5100 b(x)=b(x)-1
5110 IF b(x)=0 THEN a=3:nb=nb-1
5120 IF nb=0 THEN a=4
5500 a$=a&x
5510 PRINT#3;a$
5520 IF a=1 THEN AT li,co:PRINT "O":m$="¡AGUA!"
5530 IF a>1 THEN AT li,co:PRINT "X":m$=b$(x)&" TOCADO"
5540 IF a>2 THEN m$="¡"&m$&" Y HUNDIDO!"
5550 GO SUB 8000
5560 IF a=4 THEN m$="HAS PERDIDO LA PARTIDA...":GO SUB 8000:GO TO 9900
5570 GO TO 850
7990 :
8000 REMark Subrutina mensaje m$:
8010 :
8015 CLS#0
8020 AT 18,0:PRINT "                                "
8030 AT 18,0:PRINT m$
8040 PAUSE 75
8050 RETurn
8990 :
9000 REMark Subrutina coordenadas:
9010 :
9020 INPUT#0;"Coordenadas? ";a$
9030 IF LEN(a$)<>2 THEN GO TO 9020
9040 c=CODE(a$):IF c>=97 THEN a$(1)=CHR$(c-32)
9050 IF a$(1)<"A" OR a$(1)>"J" THEN GO TO 9020
9060 IF a$(2)<"0" OR a$(2)>"9" THEN GO TO 9020
9061 :
9062 REMark Descifrar coordenadas:
9063 :
9070 le=CODE(a$)-64
9080 nu=a$(2)+1
9090 li=le+6
9100 co=nu
9110 RETurn
9890 :
9900 REMark Final de la partida:
9910 :
9920 STOP

Para ZX Spectrum

  10 REM Juego de barcos entre QL y Spectrum
  15 REM mediante RS232C
  20:
  25 REM Copyright (C) 1987, 1988 Marcos Cruz (http://programandala.net)
  30 REM Licencia/Permesilo/License: http://programandala.net/licencia
  35:
  40 REM 1987-04
  45 REM 1988-01-22 Ajustado
  50:
  55 REM Inicializacion RS232C:
  60:
  70 CLEAR 64348
  80 RANDOMIZE USR 15363: REM : RUN "PRINTER"CODE 
  85 POKE 64517,1
  90 POKE 64520,7
  91 POKE 64521,1
  92 REM Preparacion:
  93:
 100 LET nb=8: REM no. barcos
 110 DIM p(10,10): REM papel
 120 DIM b(nb): REM long. barcos
 130 DIM b$(nb,12): REM barcos
 140 FOR i=1 TO nb
 150 READ b(i),b$(i)
 160 NEXT i
 170 DATA 1,"LANCHA"
 180 DATA 1,"LANCHA"
 190 DATA 2,"CRUCERO"
 200 DATA 2,"CRUCERO"
 210 DATA 3,"ACORAZADO"
 220 DATA 3,"ACORAZADO"
 230 DATA 4,"DESTRUCTOR"
 240 DATA 5,"PORTAAVIONES"
 250:
 260 REM Decidir quien es quien:
 270:
 280 LET a$=STR$ INT (RND*2+1)
 290 PRINT #3;a$;CHR$ 10;
 310 LET j$="1": IF a$="1" THEN LET j$="2"
 320:
 330 REM Preparar pantalla:
 340:
 370 BORDER 7
 380 PAPER 7
 390 INK 0
 400 CLS
 410 PRINT "  BATALLA DE BARCOS VIA RS232C"
 420 PRINT
 430 PRINT "JUGADOR ";j$
 440 PRINT
 450 PRINT "BARCOS TUYOS     ";
 460 PRINT "BARCOS ENEMIGOS"
 465 PRINT
 470 PRINT " 0123456789        ";
 480 PRINT "0123456789"
 490 FOR i=1 TO 10
 500 PRINT CHR$ (i+64);"..........       ";
 510 PRINT CHR$ (i+64);".........."
 520 NEXT i
 530:
 540 REM Colocar barcos:
 550:
 560 FOR i=1 TO nb
 570 LET m$=STR$ i+". "+b$(i)+" "+STR$ b(i)+" CUADROS": GO SUB 8000
 580 GO SUB 9000
 585 IF p(le,nu) THEN GO TO 580
 586 IF b(i)=1 THEN LET ili=0: LET ico=0: GO TO 671
 590 INPUT "A, B, D o I ? "; LINE a$
 600 IF a$>="a" THEN LET a$=CHR$ (CODE a$-32)
 610 IF a$<>"A" AND a$<>"B" AND a$<>"D" AND a$<>"I" THEN GO TO 590
 620 IF a$="A" THEN LET ili=-1: LET ico=0
 630 IF a$="B" THEN LET ili=1: LET ico=0
 640 IF a$="D" THEN LET ili=0: LET ico=1
 650 IF a$="I" THEN LET ili=0: LET ico=-1
 660 IF le+ili*b(i)<1 OR le+ili*b(i)>10 THEN GO TO 580
 670 IF nu+ico*b(i)<1 OR nu+ico*b(i)>10 THEN GO TO 580
 671 LET le2=le: LET nu2=nu
 672 FOR j=1 TO b(i)
 673 IF p(le2,nu2) THEN GO TO 580
 674 LET le2=le2+ili: LET nu2=nu2+ico
 675 NEXT j
 680 INK b(i)
 690 FOR j=1 TO b(i)
 700 PRINT AT li,co;CHR$ 143
 710 LET li=li+ili
 720 LET co=co+ico
 730 LET p(le,nu)=b(i)
 740 LET le=le+ili
 750 LET nu=nu+ico
 760 NEXT j
 770 INK 0
 780 NEXT i
 790 LET m$="LISTOS PARA ENTRAR EN COMBATE!": GO SUB 8000
 800:
 810 REM Seleccion:
 820:
 830 IF j$="2" THEN GO TO 5000
 840:
 850 REM Disparar al QL:
 860:
 870 LET m$="DISPARA AL QL": GO SUB 8000
 880 GO SUB 9000
 885 PRINT AT li,co+18;"*"
 890 PRINT #3;a$;CHR$ 10;: REM disparo
 900 LET m$="ESPERANDO RESULTADOS": GO SUB 8000
 910 INPUT #3;a$: REM respuesta
 920 LET a=VAL a$(1)
 925 LET x=VAL a$(2)
 930 IF a=1 THEN PRINT AT li,co+18;"O": LET m$="AGUA!": GO SUB 8000
 940 IF a>1 THEN PRINT AT li,co+18;"X": LET m$="BARCO TOCADO!"
 950 IF a>2 THEN LET m$=b$(x)+"  ENEMIGO HUNDIDO!"
 955 GO SUB 8000
 960 IF a=4 THEN LET m$="HAS GANADO LA PARTIDA": GO SUB 8000: GO TO 9900
4990:
5000 REM Esperar disparo del QL
5010:
5020 LET m$="ESPERANDO EL DISPARO DEL QL": GO SUB 8000
5030 INPUT #3;a$
5040 GO SUB 9062
5050 LET m$="QL DISPARA A "+a$: GO SUB 8000
5060 LET x=p(le,nu)
5070 LET p(le,nu)=0
5080 IF x=0 THEN LET a=1: GO TO 5500
5090 LET a=2
5100 LET b(x)=b(x)-1
5110 IF b(x)=0 THEN LET a=3: LET nb=nb-1
5120 IF nb=0 THEN LET a=4
5500 LET a$=STR$ a+STR$ x
5510 PRINT #3;a$;CHR$ 10;
5520 IF a=1 THEN PRINT AT li,co;"O": LET m$="AGUA!"
5530 IF a>1 THEN PRINT AT li,co;"X": LET m$=b$(x)+" TOCADO"
5540 IF a>2 THEN LET m$=m$+" Y HUNDIDO!"
5550 GO SUB 8000
5560 IF a=4 THEN LET m$="HAS PERDIDO LA PARTIDA": GO SUB 8000: GO TO 9900
5570 GO TO 850
7990:
8000 REM Subrutina mensaje m$
8010:
8020 PRINT AT 20,0;"                                "
8030 PRINT AT 20,0;m$
8040 PAUSE 75
8050 RETURN
8990:
9000 REM Subrutina coordenadas
9010:
9020 INPUT ;"Coordenadas? "; LINE a$
9030 IF LEN a$<>2 THEN GO TO 9020
9040 LET c=CODE a$: IF c>=97 THEN LET a$(1)=CHR$ (c-32)
9050 IF a$(1)<"A" OR a$(1)>"J" THEN GO TO 9020
9060 IF a$(2)<"0" OR a$(2)>"9" THEN GO TO 9020
9061:
9062 REM Descifrar coordenadas:
9063:
9070 LET le=CODE a$-64
9080 LET nu=VAL a$(2)+1
9090 LET li=le+6
9100 LET co=nu
9110 RETURN
9890:
9900 REM Final de la partida:
9910:
9920 PRINT #0;"PULSA UNA TECLA PARA PARTIDA"
9930 IF INKEY$="" THEN GO TO 9930
9940 RUN 92

Descargas