10 REM -------------- programma per la battaglia navale ---------------------- 20 REM -------------- l'M20 contro lo sfidante ----------- di G.COLLINASSI --- 30 CLS:CURSOR(32,1):PRINT"* BATTAGLIA NAVALE *":CURSOR(34,3):PRINT"by G. Collinassi" 40 CURSOR(29,10):PRINT "Vuoi le istruzioni? (y/n) ":A$=INPUT$(1):IF A$="n" THEN 50 ELSE GOSUB 2180 50 GOSUB 490 60 CLS:CURSOR(32,1):PRINT"* BATTAGLIA NAVALE *";:GOSUB 820 70 GOSUB 550:'input flotta giocatore 80 FOR I=20 TO 22:CURSOR(1,I):PRINT BLANC$;:NEXT I:CURSOR(32,20):PRINT"** SET FLOTTA M20 **";:CURSOR(34,22):PRINT"Attendere prego!"; 90 GOSUB 1300:'set flotta M20 100 FOR I=20 TO 22:CURSOR(1,I):PRINT BLANC$;:NEXT I 110 LINE(35,4)-(226,61),,B:LINE(320,4)-(511,61),,B:CURSOR(10,20):PRINT"( SFIDANTE : punti )";:CURSOR(53,20):PRINT"( M20 : punti )"; 120 CURSOR(10,22):PRINT"ORDINATA ASCISSA ":CURSOR(54,22):PRINT"ORDINATA ASCISSA "; 130 GOSUB 190:'colpi sfidante 140 CURSOR(23,20):PRINT PUNTI1%;:LINE(60,6)-(206,16),,B 150 FOR I=1 TO 1000:NEXT I 160 GOSUB 300:'colpi M20 170 CURSOR(66,20):PRINT PUNTI2%;:LINE(340,6)-(486,16),,B 180 COLPI%=COLPI%+1:CURSOR(40,22):PRINT"N[COLPI ";:CURSOR(40,23):PRINT"SPARATI";:CURSOR(41,24):PRINT COLPI%;:LINE(244,10)-(301,51),,B:GOTO 130 190 REM ------------------- input colpi sfidante --------------------------- 200 CURSOR(13,23):PRINT"_";:COX$=INPUT$(1):IF ASC(COX$)=42 THEN GOSUB 1550 : GOTO 200 210 IF ASC(COX$)<65 THEN 200 ELSE IF ASC(COX$)>76 THEN 200 220 CURSOR(13,23):PRINT COX$; 230 CURSOR(29,23):PRINT"_";:COY$=INPUT$(1):IF ASC(COY$)<48 THEN 230 ELSE IF ASC(COY$)>57 THEN 230 240 CURSOR(29,23):PRINT COY$; 250 GOSUB 790:IF FLOTTA2(COX%,COY%)>1 THEN CURSOR(21,25):PRINT"RIPETERE";:GOTO 200 260 GOSUB 1700:'CHECK SE COLPITO 270 IF TESTCOLP$="Y" THEN COLP1%=COLP1%+1 ELSE RETURN 280 IF COLP1%=20 THEN 2140 ELSE RETURN 290 REM ---------------------------------------------------------------- 300 REM ---------------- colpi M20 ------------------------------------ 310 IF TEST9$="Y" THEN COY%=MEMCOY%:COX%=MEMCOX%:GOTO 340 320 GOSUB 1140:COY%=CASO%:GOSUB 1140:COX%=CASO% 330 IF FLOTTA1(COX%,COY%)>1 THEN 320:'gi{ sparato 340 ON COX% GOTO 360,370,380,390,400,410,420,430,440 350 COX$="A":GOTO 450 360 COX$="B":GOTO 450 370 COX$="C":GOTO 450 380 COX$="D":GOTO 450 390 COX$="E":GOTO 450 400 COX$="F":GOTO 450 410 COX$="G":GOTO 450 420 COX$="H":GOTO 450 430 COX$="I":GOTO 450 440 COX$="L" 450 CURSOR(57,23):PRINT COX$;:CURSOR(71,23):PRINT COY%;:GOSUB 1910 460 IF TESTCOLP$="Y" THEN COLP2%=COLP2%+1 ELSE RETURN 470 IF COLP2%=20 THEN GOSUB 2140 ELSE RETURN 480 REM --------------------------------------------------------------- 490 REM -------------- inizilizzazione matrici e vettori --------------- 500 DIM FLOTTA1(9,9),FLOTTA2(9,9),FLCK1(5) 510 FOR I=0 TO 9:FOR O=0 TO 9:FLOTTA1(I,O)=0:FLOTTA2(I,O)=0:NEXT O:NEXT I 520 FOR I=1 TO 5:FLCK1(I)=0:NEXT I 530 BLANC$=STRING$(80," ") 540 RETURN:'------------------------------------------------------------ 550 REM --------------- input coordinate caricamento flotta ------------ 560 CURSOR(25,20):PRINT"* POSIZIONAMENTO FLOTTA GIOCATORE *" 570 CURSOR(1,21):PRINT"Digita le coordinate della poppa (sempre a sinistra) della nave che vuoi posizionare e il numero di pezzi che la compongono :" 580 CURSOR(1,24):PRINT BLANC$;:IF FLCK1(1)+FLCK1(2)+FLCK1(3)+FLCK1(4)=10 THEN RANDOMIZE COY%:RETURN 590 CURSOR(1,24):PRINT"Y ( A:L ) --> ";:CURSOR(15,24):COX$=INPUT$(1) 600 IF ASC(COX$)<65 THEN 590 ELSE IF ASC(COX$)>76 THEN 590 ELSE IF COX$="J" THEN 590 ELSE IF COX$="K" THEN 590 610 CURSOR(15,24):PRINT COX$; 620 CURSOR(25,24):PRINT"X ( 0:9 ) --> ";:CURSOR(40,24):COY$=INPUT$(1):IF ASC(COY$)<48 THEN 620 ELSE IF ASC(COY$)>57 THEN 620 630 CURSOR(39,24):PRINT COY$; 640 CURSOR(50,24):PRINT"n[pezzi (1/2/3 o 4) --> ";:CURSOR(75,24):NPEZZI$=INPUT$(1):NPEZZI%=VAL(NPEZZI$):IF NPEZZI%=0 THEN 640 ELSE IF NPEZZI%>4 THEN 640 650 ON NPEZZI% GOTO 660,670,680,690 660 IF FLCK1(1)=4 THEN 580 ELSE 710 670 IF FLCK1(2)=3 THEN 580 ELSE 710 680 IF FLCK1(3)=2 THEN 580 ELSE 710 690 IF FLCK1(4)>0 THEN 580 ELSE 710 700 CURSOR(74,24):NPEZZI$; 710 GOSUB 1170:IF TEST2$="N" THEN FOR I=1 TO 800:NEXT I:GOTO 580 720 TEST1$="Y":GOSUB 1640:'display nave 730 ON NPEZZI% GOTO 740,750,760,770 740 FLCK1(1)=FLCK1(1)+1:GOTO 780 750 FLCK1(2)=FLCK1(2)+1:GOTO 780 760 FLCK1(3)=FLCK1(3)+1:GOTO 780 770 FLCK1(4)=1 780 GOTO 580:REM ------------------------------------------------------ 790 REM ---------------- decodifica valori coordinate da alfa a numero -- 800 COY%=VAL(COY$):COX%=ASC(COX$)-65:IF COX%>9 THEN COX%=9:RETURN 810 RETURN:REM ---------------------------------------------------------- 820 REM ------------------------- maschera video ---------------------------- 830 X=35:Y=70 840 FOR I=0 TO 10:LINE (X,Y)-(X+190,Y):LINE (X+285,Y)-(X+475,Y):Y=Y+15:NEXT I:Y=70 850 FOR I=0 TO 10:LINE(X,Y)-(X,Y+150):X=X+19:IF I=6 THEN X=X+1 851 NEXT I:X=35 852 FOR I=0 TO 10:LINE(X+285,Y)-(X+285,Y+150):X=X+19:IF I=7 THEN X=X+1 853 NEXT I 860 CURSOR(7,3):PRINT"0 1 2 3 4 5 6 7 8 9":CURSOR(52,3):PRINT"0 1 2 3 4 5 6 7 8 9" 870 CURSOR(4,5):PRINT"A":CURSOR(49,5):PRINT"A" 880 CURSOR(4,6):PRINT"B":CURSOR(49,6):PRINT"B" 890 CURSOR(4,8):PRINT"C":CURSOR(49,8):PRINT"C" 900 CURSOR(4,9):PRINT"D":CURSOR(49,9):PRINT"D" 910 CURSOR(4,11):PRINT"E":CURSOR(49,11):PRINT"E" 920 CURSOR(4,12):PRINT"F":CURSOR(49,12):PRINT"F" 930 CURSOR(4,14):PRINT"G":CURSOR(49,14):PRINT"G" 940 CURSOR(4,15):PRINT"H":CURSOR(49,15):PRINT"H" 950 CURSOR(4,17):PRINT"I":CURSOR(49,17):PRINT"I" 960 CURSOR(4,18):PRINT"L":CURSOR(49,18):PRINT"L" 970 RETURN:REM ----------------------------------------------------------- 980 REM -------------- visualizza nave da due pezzi ---------------------- 990 LINE (X,Y)-(X+26,Y),,,XOR:LINE STEP(+6,+6),,,XOR:LINE STEP(-7,0),,,XOR:LINE STEP(0,+5),,,XOR:LINE STEP(-2,0),,,XOR:LINE STEP(0,-2),,,XOR:LINE STEP(-3,0),,,XOR:LINE STEP(-2,-3),,,XOR:LINE STEP(-4,0),,,XOR 1000 LINE STEP(0,-3),,,XOR:LINE STEP(-14,0),,,XOR:LINE STEP(0,-3),,,XOR 1010 RETURN:REM ----------------------------------------------------------- 1020 X=X+17:REM ------------- visualizza sottomarino da 3 pezzi ------------ 1030 LINE (X,Y)-(X+30,Y),,,XOR:LINE STEP(+3,+2),,,XOR:LINE STEP(+1,+2),,,XOR:LINE STEP(-3,+2),,,XOR:LINE STEP(-9,0),,,XOR:LINE STEP(0,+4),,,XOR:LINE STEP(-3,0),,,XOR:LINE STEP(-2,-2),,,XOR:LINE STEP(-3,-2),,,XOR 1040 LINE STEP(0,-1),,,XOR:LINE STEP(-28,-2),,,XOR:LINE STEP(0,-1),,,XOR:LINE STEP(+14,-2),,,XOR 1050 RETURN:REM ------------------------------------------------------------ 1060 X=X+12:REM ------------ visualizza portaerei da 4 pezzi ----------- 1070 LINE (X,Y)-(X+40,Y),,,XOR:LINE STEP(+17,+6),,,XOR:LINE STEP(-44,0),,,XOR:LINE STEP(-1,+6),,,XOR:LINE STEP(-4,0),,,XOR 1080 LINE STEP(-1,-3),,,XOR:LINE STEP(-3,0),,,XOR:LINE STEP(-2,-2),,,XOR:LINE STEP(0,-2),,,XOR:LINE STEP(-11,0),,,XOR:LINE STEP(+10,-5),,,XOR 1090 RETURN:'----------------------------------------------------------- 1100 REM ----------- visualizza nave da un pezzo ----------------------- 1110 LINE (X,Y)-(X+10,Y),,,XOR:LINE STEP(+6,+4),,,XOR:LINE STEP(-6,0),,,XOR:LINE STEP(0,+3),,,XOR:LINE STEP(-3,0),,,XOR:LINE STEP(-3,-4),,,XOR 1120 LINE STEP(-4,0),,,XOR:LINE STEP(0,-2),,,XOR 1130 RETURN:'----------------------------------------------------------- 1140 REM ----------- routine definizione random number ----------------- 1150 CASO%=(FIX(0+1-11)*RND-C+11):IF CASO%>9 THEN CASO%=0 1160 RETURN:REM -------------------------------------------------------- 1170 REM ---------------- check se input colpo esatto ------------------ 1180 GOSUB 790:CX%=COX%:IF COY%+NPEZZI%>10 THEN 1240 ELSE CY%=COY%-1 1190 IF CY%<0 THEN CY%=0 1200 IF FLOTTA1(CX%,CY%)=1 THEN 1240 ELSE IF COY%+NPEZZI%>9 THEN 1210 ELSE CY%=COY%+NPEZZI%:IF FLOTTA1(CX%,CY%)=1 THEN 1240 1210 CY%=COY% 1220 FOR I%=1 TO NPEZZI% 1230 IF FLOTTA1(CX%,CY%)=0 THEN 1250 1240 CURSOR(1,24):PRINT BLANC$;:CURSOR(1,24):PRINT"* IMPUT ERRATO RIDIGITA !! *";:TEST2$="N":RETURN 1250 CY%=CY%+1 1260 NEXT I% 1270 CY%=COY% 1280 FOR I%=1 TO NPEZZI%:FLOTTA1(COX%,CY%)=1:CY%=CY%+1:NEXT I% 1290 TEST2$="Y":RETURN:'------------------------------------------------ 1300 REM ------------------- set flotta per M20 ------------------------ 1310 GOSUB 1140:COY%=CASO%:GOSUB 1140:COX%=CASO% 1320 GOSUB 1140:IF CASO%=0 THEN 1320 ELSE IF CASO%>4 THEN 1320 ELSE NPEZZI%=CASO% 1330 ON NPEZZI% GOTO 1340,1350,1360,1370 1340 IF FLCK2(1)=4 THEN 1320 ELSE 1380 1350 IF FLCK2(2)=3 THEN 1320 ELSE 1380 1360 IF FLCK2(3)=2 THEN 1320 ELSE 1380 1370 IF FLCK2(4)>0 THEN 1320 1380 CX%=COX%:IF COY%+NPEZZI%>10 THEN 1310 ELSE CY%=COY%-1 1390 IF CY%<0 THEN CY%=0 1400 IF FLOTTA2(CX%,CY%)=1 THEN 1310 ELSE IF COY%+NPEZZI%>9 THEN 1410 ELSE CY%=COY%+NPEZZI%:IF FLOTTA2(CX%,CY%)=1 THEN 1310 1410 CY%=COY% 1420 FOR I%=1 TO NPEZZI% 1430 IF FLOTTA2(CX%,CY%)=0 THEN 1440 ELSE 1310 1440 CY%=CY%+1 1450 NEXT I% 1460 CY%=COY% 1470 FOR I%=1 TO NPEZZI%:FLOTTA2(COX%,CY%)=1:CY%=CY%+1:NEXT I% 1480 ON NPEZZI% GOTO 1490,1500,1510,1520 1490 FLCK2(1)=FLCK2(1)+1:GOTO 1530 1500 FLCK2(2)=FLCK2(2)+1:GOTO 1530 1510 FLCK2(3)=FLCK2(3)+1:GOTO 1530 1520 FLCK2(4)=1 1530 IF FLCK2(1)+FLCK2(2)+FLCK2(3)+FLCK2(4)=10 THEN RETURN ELSE 1300 1540 REM -------------------------------------------------------------- 1550 REM ----------------------- print flotta M20 --------------------- 1560 TEST1$="N" 1570 FOR I%=0 TO 9:NPEZZI%=0 1580 FOR O%=0 TO 9:IF FLOTTA2(I%,O%)=1 THEN 1590 ELSE 1620 1590 O%=O%+1:NPEZZI%=NPEZZI%+1:IF O%>9 THEN O%=9:COY%=O%+1-NPEZZI%:GOTO 1610 1600 IF FLOTTA2(I%,O%)=1 THEN 1590 ELSE COY%=O%-NPEZZI% 1610 COX%=I%:GOSUB 1660:NPEZZI%=0 1620 NEXT O%:NEXT I% 1630 RETURN:'---------------------------------------------------------- 1640 REM --- print nave in funzione delle coordinate COY$/COX$/NPEZZI%- 1650 GOSUB 790 1660 Y=207:IF TEST1$="Y" THEN X=37 ELSE X=322 1661 IF TEST1$="Y" THEN IF COY%<7 THEN 1670 ELSE X=X+1:GOTO 1670 1662 IF COY%>7 THEN X=X+1 1670 Y=Y-(15*COX%):X=X+(19*COY%) 1680 ON NPEZZI% GOSUB 1100,980,1020,1060 1690 RETURN:'--------------------------------------------------------- 1700 REM ----------------- check se utente ha colpito ------------------ 1710 IF FLOTTA2(COX%,COY%)=0 THEN TESTCOLP$="N":FLOTTA2(COX%,COY%)=2:GOTO 1820 1720 FLOTTA2(COX%,COY%)=3:TESTCOLP$="Y":PUNTI1%=PUNTI1%+1:PX%=COX%:PY%=COY% 1730 PY%=PY%-1:IF PY%<0 THEN 1750 1740 ON FLOTTA2(PX%,PY%) GOTO 1800,1750,1730 1750 PY%=COY% 1760 PY%=PY%+1:IF PY%>9 THEN 1780 1770 ON FLOTTA2(PX%,PY%) GOTO 1800,1780,1760 1780 REM - affondata ! - 1790 CURSOR(20,25):PRINT"AFFONDATA !";:PRINT CHR$(7);:PRINT CHR$(7);:PRINT CHR$(7);:TEST1$="N":GOSUB 2100:GOTO 1850 1800 REM - colpita ! - 1810 CURSOR(20,25):PRINT " COLPITA ! ";:PRINT CHR$(7);:GOTO 1840 1820 REM - mancata ! - 1830 CURSOR(20,25):PRINT " MANCATA ! ";:PRINT CHR$(7);:GOTO 1840 1840 TEST1$="N":GOSUB 2100:GOTO 1900:'--------------------- 1850 NPEZZI%=1:PY%=COY% 1860 PY%=PY%-1:IF PY%<0 THEN 1870 ELSE IF FLOTTA2(COX%,PY%)<>3 THEN 1870 ELSE NPEZZI%=NPEZZI%+1:GOTO 1860 1870 PYINIZ%=PY%+1:PY%=COY% 1880 PY%=PY%+1:IF PY%>9 THEN 1890 ELSE IF FLOTTA2(COX%,PY%)<>3 THEN 1890 ELSE NPEZZI%=NPEZZI%+1:GOTO 1880 1890 COY%=PYINIZ%:GOSUB 1660 1900 CURSOR(12,25):PRINT COX$;" - ";COY$;:RETURN:'---------------------- 1910 REM ---------------- check se M20 ha colpito ---------------------- 1920 IF FLOTTA1(COX%,COY%)=0 THEN TESTCOLP$="N":FLOTTA1(COX%,COY%)=2:GOTO 2070 1930 FLOTTA1(COX%,COY%)=3:TESTCOLP$="Y":PUNTI2%=PUNTI2%+1:PX%=COX%:PY%=COY% 1940 PY%=PY%-1:IF PY%<0 THEN 1960 1950 ON FLOTTA1(PX%,PY%) GOTO 2050,1960,1940 1960 PY%=COY% 1970 PY%=PY%+1:IF PY%>9 THEN 1990 1980 ON FLOTTA1(PX%,PY%) GOTO 2050,1990,1970 1990 REM - affondata ! - 2000 CURSOR(64,25):PRINT"AFFONDATA!";:PRINT CHR$(7);:PRINT CHR$(7);:PRINT CHR$(7); 2010 TEST9$="N":PY%=COY%:'setta a due i quadrati a prora e poppa 2020 PY%=PY%-1:IF PY%<0 THEN 2030 ELSE IF FLOTTA1(COX%,PY%)<3 THEN FLOTTA1(COX%,PY%)=2 ELSE 2020 2030 PY%=PY%+1:IF PY%>9 THEN 2090 ELSE IF FLOTTA1(COX%,PY%)<3 THEN FLOTTA1(COX%,PY%)=2 ELSE 2030 2040 GOTO 2090 2050 REM - colpita ! - 2060 CURSOR(64,25):PRINT " COLPITA ! ";:PRINT CHR$(7);:TEST9$="Y":MEMCOX%=COX%:MEMCOY%=PY%:GOTO 2090 2070 REM - mancata ! - 2080 CURSOR(64,25):PRINT " MANCATA ! ";:PRINT CHR$(7);:TEST9$="N" 2090 CURSOR(56,25):PRINT COX$;" -";COY%;:TEST1$="Y":GOSUB 2100:RETURN:'------------------------- 2100 REM ----------------- visualizza quadratino colpito --------------- 2110 Y=206:IF TEST1$="Y" THEN X=36 ELSE X=321 2111 IF TEST1$="Y" THEN IF COY%<7 THEN 2120 ELSE X=X+1:GOTO 2120 2112 IF COY%>7 THEN X=X+1 2120 Y=Y-(15*COX%):X=X+(19*COY%):LINE (X,Y)-(X+17,Y+13),,BF,XOR 2130 RETURN:'----------------------------------------------------------- 2140 REM ------------------- fine partita --------------------------------- 2150 IF PUNTI2%=20 THEN 2170 2160 LINE (36,5)-(225,55),,BF:CURSOR(11,23):PRINT" H A I V I N T O !! ";:CURSOR(11,24):PRINT" (purtroppo) ";:A$=INPUT$(1):END 2170 LINE(320,5)-(513,55),,BF:CURSOR(55,23):PRINT" HO VINTO IOOOO !!!! ";:FOR I%=1 TO 20:PRINT CHR$(7);:NEXT I%:A$=INPUT$(1):IF A$="*" THEN GOSUB 1560 2175 END 2180 REM ------------------------ istruzioni per l'uso ----------------------- 2190 CURSOR(29,10):PRINT" "; 2200 CURSOR(1,5):PRINT"In questa battaglia navale l'operatore gioca contro l'M20.Devi cercare di affondare la flotta dell'M20 prima che essa affondi la tua." 2210 CURSOR(1,8):PRINT"La prima fase consiste nel caricare le tue navi,indicando alla macchina ascissa e ordinata della poppa della nave che vuoi posizionare,nonch] la sua lunghezza." 2220 CURSOR(1,12):PRINT"Hai a tua disposizione : 4 MOTOSILURANTI da 1 pezzo" 2230 CURSOR(1,13):PRINT" 3 FREGATE da 2 pezzi" 2240 CURSOR(1,14):PRINT" 2 SOTTOMARINI da 3 pezzi" 2250 CURSOR(1,15):PRINT" 1 PORTAEREI da 4 pezzi" 2260 CURSOR(1,17):PRINT"La macchina disegner{ nel tuo quadrato (quello di sinistra) le navi in funzione di quanto digiterai,controllando che ci sia almeno un quadratino,a livello ORIZZONTALE,fra una nave e l'altra." 2270 CURSOR(1,20):PRINT"A livello VERTICALE invece le navi si possono affiancare senza lasciare alcuno spazio fra loro." 2280 CURSOR(1,22):PRINT"NON e' possibile caricare navi in senso VERTICALE !" 2290 CURSOR(1,23):PRINT"La flotta dell' M20 ] composta dagli stessi elementi che compongono la tua,essi ti verranno visualizzati allorch] saranno AFFONDATI. 2300 CURSOR(1,25):PRINT " -----> Per cominciare a giocare premi un tasto qualunque : BUONA FORTUNA! "; 2310 WHILE A$=INPUT$(1) :WEND:RETURN