10 REM BATSH.ECB ========= LAST MOD. 8/18/77 R.E.H. 20 REM ....SOL-20 Version 4-20-80 R.E.H. 30 LET K$="&K": LET J$="&J": PRINT K$;J$ 40 DEF FND(A,B)=INT(B*((A/B)-INT(A/B))+.05) 50 PRINT TAB(10);"=*=*=*=*=*=*=*=*=*=*=*=*=*=*=" 60 PRINT TAB(10);"=*= B A T T L E S H I P =*=" 70 PRINT TAB(10);"=*=*=*=*=*=*=*=*=*=*=*=*=*=*=" 80 PRINT : PRINT 90 PRINT " HELLO AND WELCOME TO BATTLESHIP.";J$ 100 PRINT " Do you know how to play? (Yes/No) "; 110 INPUT (1,0)"---=>",I$: LET I$=I$+"Y" 120 PRINT 130 IF I$(1,1)="Y" THEN 550 140 IF I$(1,1)="N" THEN 150 ELSE GOTO 100 150 PRINT " In this game YOU will play BATTLESHIP with the" 160 PRINT " COMPUTOR. Each player will have three ships." 170 PRINT " Two are the cruisers which are each 2 squares" 180 PRINT " long. The other is the BATTLESHIP" 190 PRINT " which is 3 squares long. The object" 200 PRINT " of the game is to find and SINK the other" 210 PRINT " players ships by firing shots. Players" 220 PRINT " Alternate firing. THE FIRST PLAYER TO SINK" 230 PRINT " ALL OF HIS OPPONENTS SHIPS IS THE WINNER." 240 GOSUB 4180 250 PRINT " Your ships positions are to be inserted into" 260 PRINT " the computor by typing the coordinates of the" 270 PRINT " squares the ship is to occupy, one square per" 280 PRINT " line. All coordinates must be typed in" 290 PRINT " this format: ," 300 PRINT " where and are each" 310 PRINT " one digit integers between 0 and 9." 320 PRINT TAB(8);"You will also use this same" 330 PRINT " format for entering your shots." 340 GOSUB 4180: PRINT K$ 350 PRINT " The GAME BOARD is a 10x10 coordinate graph" 360 PRINT " 0 1 2 3 4 5 6 7 8 9 ...laid out like this:" 370 FOR I=0 TO 9 380 PRINT %2I;I;" - - - - - - - - - -" 390 NEXT I 400 GOSUB 4190 410 PRINT " NOTE THAT THE ROW NUMBERS RUN FROM TOP TO" 420 PRINT " BOTTOM AND THE COLUMN NUMBERS RUN FROM RIGHT" 430 PRINT " TO LEFT. For example: '0,9' would be the" 440 PRINT " upper right-hand corner. If you wish to" 450 PRINT " see the game boards, type a '-1' for the FIRST" 460 PRINT " coordinate of your shot. If you wish to" 470 PRINT " FORFEIT the GAME, type a 10 for the FIRST" 480 PRINT " coordinate of your shot. " 490 GOSUB 4180 500 PRINT TAB(8);"YOUR SHIPS...." 510 PRINT " must be either HORIZONTAL or VERTICAL." 520 PRINT " They can't be on diagonals or" 530 PRINT TAB(8);"*** THE PROGRAM WILL BOMB ! ***" 540 FOR I=1 TO 5: PRINT : NEXT I 550 REM ===RANDOMIZE 560 DIM A$(100),B$(100),C$(100),A(100),B(100) 570 REM *** VARIABLE SET UP *** 580 FOR I=1 TO 10 590 LET A$=A$+"----------" 600 LET C$=C$+" " 610 NEXT I 620 LET B$=A$ 630 READ E,F,X,R,W,Y,F(1),F(2),F(3),M$,X$,S$ 640 DATA 0,0,0,0,0,0,0,0,0,"M","X","*" 650 READ Q(1),Q(2),Q(3) 660 DATA 0,0,0 670 REM *** COMPUTERS BATTLESHIP *** 680 LET J=INT(10*(RND(0))) 690 LET K=INT(10*(RND(0))) 700 LET H=10*K+J+1 710 IF RND(0)>.5 THEN 770 720 IF K<2 THEN 680 730 LET A$(H,H)=X$ 740 LET A$(H-10,H-10)=X$: LET A$(H-20,H-20)=X$ 750 LET A(H)=3: LET A(H-10)=3: LET A(H-20)=3 760 GOTO 810 770 IF J>5 THEN 680 780 LET A$(H,H)=X$: LET A$(H+1,H+1)=X$: LET A$(H+2,H+2)=X$ 790 LET A(H)=3: LET A(H+1)=3: LET A(H+2)=3 800 REM *** COMPUTERS CRUISERS *** 810 FOR I=1 TO 2 820 LET J=INT(10*(RND(0))) 830 LET K=INT(10*(RND(0))) 840 LET H=10*J+K+1 850 IF A$(H,H)=X$ THEN 820 860 IF RND(0)<.5 THEN 920 870 IF J<1 THEN 820 880 IF A$(H-10,H-10)=X$ THEN 820 890 LET A$(H,H)=X$: LET A$(H-10,H-10)=X$ 900 LET A(H)=I: LET A(H-10)=I 910 GOTO 960 920 IF K>8 THEN 820 930 IF A$(H+1,H+1)=X$ THEN 820 940 LET A$(H,H)=X$: LET A$(H+1,H+1)=X$ 950 LET A(H)=I: LET A(H+1)=I 960 NEXT I 970 REM *** PLAYERS BATTLESHIP *** 980 PRINT "Enter coordinates of your BATTLESHIP." 990 PRINT ". . . one to a line." 1000 FOR I=1 TO 3 1010 PRINT " Coordinate # ";I; 1020 INPUT " ---=>",J,K 1030 IF J<0 OR K<0 THEN 1010 1040 LET H=10*J+K+1 1050 IF H>100 THEN EXIT 980 1060 IF I=1 THEN 1140 1070 IF B$(H-1,H-1)=X$ THEN 1140 1080 IF B$(H+1,H+1)=X$ THEN 1140 1090 IF B$(H-10,H-10)=X$ THEN 1140 1100 IF B$(H+10,H+10)=X$ THEN 1140 1110 PRINT " *** COORDINATES MUST BE ADJCENT ***" 1120 PRINT TAB(8);"--------- RETYPE LAST COORDINATE." 1130 GOTO 1020 1140 LET B$(H,H)=X$: LET B(H)=3 1150 NEXT I 1160 REM *** PLAYERS CRUISERS *** 1170 FOR N=1 TO 2 1180 PRINT : PRINT "Enter coordinates of cruiser "; 1190 PRINT N;" one to a line." 1200 FOR I=1 TO 2 1210 PRINT " Coordinate # ";I; 1220 INPUT " ---=>",J,K 1230 IF J<0 OR K<0 THEN 1010 1240 LET H=10*J+K+1 1250 IF H>100 THEN EXIT 1190 1260 IF I=1 THEN 1340 1270 IF B$(H-1,H-1)=X$ THEN 1340 1280 IF B$(H+1,H+1)=X$ THEN 1340 1290 IF B$(H-10,H-10)=X$ THEN 1340 1300 IF B$(H+10,H+10)=X$ THEN 1340 1310 PRINT " COORDINATES MUST BE ADJCENT" 1320 PRINT " ---------- RETYPE LAST COORDINATE" 1330 GOTO 1220 1340 LET B$(H,H)=X$: LET B(H)=N 1350 NEXT I 1360 NEXT N 1370 REM **** DO IT **** 1380 LET J=10*(INT(10*(RND(0)))) 1390 IF J>99 THEN 1380 1400 LET K=INT(10*(RND(0))) 1410 IF K>9 THEN 1400 1420 LET C=K+J+1 1430 PRINT 1440 PRINT " Should the COMPUTER shoot first? (Y or N) "; 1450 INPUT (1,0)"---=>",Y$: LET Y$=Y$+"N" 1460 PRINT 1470 IF Y$(1,1)="N" THEN 3420 1480 IF Y$(1,1)<>"Y" THEN 1440 1490 IF Q(3)=1 THEN 1670 1500 IF Q(3)=2 THEN 2110 1510 IF Q(1)=1 THEN 2750 1520 IF Q(2)=1 THEN 2950 1530 LET C=C+7 1540 IF C<101 THEN 1560 1550 LET C=C-100 1560 IF B(C)=4 THEN 1530 1570 PRINT "COMPUTER shoots at ";INT(C/10);",";FND(C,10) 1580 IF B$(C,C)<>X$ THEN 3230 1590 IF B(C)<>3 THEN 1930 1600 REM *** COMPUTER HIT ON BATTLESHIP *** 1610 LET D=C 1620 PRINT "HIT ON BATTLESHIP!" 1630 LET B(D)=4 1640 LET B$(D,D)=S$ 1650 LET Q(3)=1 1660 GOTO 3420 1670 LET X=X+1 1680 ON X GOTO 1690,1730,1770,1810,2090 1690 LET S=D-10 1700 IF S<0 THEN 1670 1710 LET M=1 1720 GOTO 1840 1730 IF FND(D,10)=9 THEN 1670 1740 LET S=D+1 1750 LET M=2 1760 GOTO 1840 1770 LET S=D+1 1780 IF S<99 THEN 1670 1790 LET M=3 1800 GOTO 1840 1810 IF FND(D,10)=0 THEN 1670 1820 LET S=D-1 1830 LET M=4 1840 IF B(S)=4 THEN 1670 1850 PRINT " COMPUTER shoots at ";INT(S/10);",";FND(S,10) 1860 IF B$(S,S)<>X$ THEN 3320 1870 IF B(S)<>3 THEN 1940 1880 PRINT " HIT ON BATTLESHIP!" 1890 LET B$(S,S)=S$ 1900 LET B(S)=4 1910 LET Q(3)=2 1920 GOTO 3420 1930 LET S=C 1940 IF B(S)=2 THEN 2020 1950 LET U=S 1960 PRINT "HIT ON CRUISER 1" 1970 IF Q(1)=1 THEN 2620 1980 LET Q(1)=1 1990 LET B$(U,U)=S$ 2000 LET B(U)=4 2010 GOTO 3420 2020 LET V=S 2030 PRINT "HIT ON CRUISER 2" 2040 IF Q(2)=1 THEN 2690 2050 LET Q(2)=1 2060 LET B$(V,V)=S$ 2070 LET B(V)=4 2080 GOTO 3420 2090 PRINT "Improper input on BATTLESHIP." 2100 PRINT "Error on A(";P;")=";A(P): GOTO 3820 2110 LET R=R+1 2120 ON M GOTO 2130,2300,2350,2400 2130 ON R GOTO 2140,2280,2090 2140 LET T=D+10 2150 IF T>99 THEN 2110 2160 IF B(T)=4 THEN 2110 2170 PRINT "COMPUTER shoots at ";INT(T/10);",";FND(T,10) 2180 IF B$(T,T)<>X$ THEN 3350 2190 IF B(T)<>3 THEN 2450 2200 PRINT "HIT ON BATTLESHIP!" 2210 PRINT "BATTLESHIP SINKING........" 2220 PRINT "BATTLESHIP SUNKEN" 2230 LET Q(3)=0 2240 LET B(T)=4 2250 LET B$(T,T)=S$ 2260 LET E=E+1 2270 IF E=3 THEN 3390 ELSE 3420 2280 LET T=S-10 2290 IF T<0 THEN 2110 ELSE 2160 2300 ON R GOTO 2310,2330,2090 2310 IF FND(S,10)=9 THEN 2110 2320 LET T=S+1: GOTO 2160 2330 IF FND(D,10)=0 THEN 2110 2340 LET T=D-1: GOTO 2160 2350 ON R GOTO 2360,2380,2090 2360 LET T=D-10 2370 IF T<0 THEN 2110 ELSE 2160 2380 LET T=S+10 2390 IF T>90 THEN 2110 ELSE 2160 2400 ON R GOTO 2410,2430,2090 2410 IF FND(D,10)=9 THEN 2110 2420 LET T=D+1: GOTO 2160 2430 IF FND(S,10)=0 THEN 2110 2440 LET T=S-1: GOTO 2160 2450 IF B(T)=2 THEN 2530 2460 LET U=T 2470 PRINT "HIT ON CRUISER 1" 2480 IF Q(1)=1 THEN 2620 2490 LET Q(1)=1 2500 LET B$(T,T)=S$ 2510 LET B(T)=4 2520 GOTO 2610 2530 PRINT "HIT ON CRUISER 2" 2540 IF Q(2)=1 THEN 2690 2550 LET Q(2)=1 2560 LET V=T 2570 GOTO 2500 2580 REM *** COMPUTER SHOOTS CRUISERS *** 2590 IF B(C)=2 THEN 2680 2600 LET U=C 2610 GOTO 1960 2620 PRINT "CRUISER 1 HAS BEEN SUNKEN" 2630 LET B$(U,U)=S$ 2640 LET B(U)=4 2650 LET Q(1)=0 2660 LET E=E+1 2670 IF E=3 THEN 3390 ELSE 3420 2680 LET V=C: GOTO 2030 2690 PRINT "CRUISER 2 HAS BEEN SUNKEN" 2700 LET B$(V,V)=S$ 2710 LET B(V)=4 2720 LET Q(2)=0 2730 LET E=E+1 2740 IF E=3 THEN 3390 ELSE 3420 2750 LET W=W+1 2760 ON W GOTO 2770,2890,2910,2930,3220 2770 LET Z=U-10 2780 IF Z<1 THEN 2750 2790 IF B(Z)=4 THEN 2750 2800 PRINT "COMPUTER shoots at ";INT(Z/10);",";FND(Z,10) 2810 IF B$(Z,Z)<>X$ THEN 3290 2820 IF B(Z)<>1 THEN 3150 2830 PRINT "HIT ON CRUISER 1" 2840 PRINT "CRUISER 1 SUNKEN!" 2850 LET B$(Z)=S$ 2860 LET B(Z)=4 2870 LET Q(1)=0 2880 GOTO 2660 2890 IF FND(U,10)=9 THEN 2750 2900 LET Z=U+1: GOTO 2790 2910 LET Z=U+10 2920 IF Z>100 THEN 2750 ELSE 2790 2930 IF FND(U,10)=0 THEN 2750 2940 LET Z=U-1: GOTO 2790 2950 LET Y=Y+1 2960 ON Y GOTO 2970,3090,3110,3130,3220 2970 LET L=V-1 2980 IF L<0 THEN 2950 2990 IF B(L)=4 THEN 2950 3000 PRINT "COMPUTER shoots at ";INT(L/10);",";FND(L,10) 3010 IF B$(L,L)<>X$ THEN 3260 3020 IF B(L)<>2 THEN 3190 3030 PRINT "HIT ON CRUISER 2" 3040 PRINT "CRUISER 2 SUNKEN" 3050 LET B$(L,L)=S$ 3060 LET B(L)=4 3070 LET Q(2)=0 3080 GOTO 2730 3090 IF FND(V,10)=9 THEN 2950 3100 LET L=V+1: GOTO 2990 3110 LET L=V+1 3120 IF V>100 THEN 2950 ELSE 2990 3130 IF FND(V,10)=0 THEN 2950 3140 LET L=V-1 3150 IF Z=0 THEN LET Z=1: REM ...Z=0 Errors 3160 IF B(Z)=2 THEN 3180 3170 LET D=Z: GOTO 1620 3180 LET V=Z: GOTO 2030 3190 IF B(L)=1 THEN 3210 3200 LET D=L: GOTO 1620 3210 LET V=L: GOTO 1960 3220 PRINT "IMPROPER CRUISER INPUT or PROGRAM ERROR!!" 3230 LET B$(C,C)=M$ 3240 LET B(C)=4 3250 GOTO 3370 3260 LET B$(L,L)=M$ 3270 LET B(L)=4 3280 GOTO 3370 3290 LET B$(Z,Z)=M$ 3300 LET B(Z)=4 3310 GOTO 3370 3320 LET B$(S,S)=M$ 3330 LET B(S)=4 3340 GOTO 3370 3350 LET B$(T,T)=M$ 3360 LET B(T)=4 3370 PRINT " Shot missed." 3380 GOTO 3420 3390 PRINT "BETTER LUCK NEXT TIME...THE COMPUTER HAS WON" 3400 GOTO 3820 3410 REM *** PLAYER SHOT *** 3420 PRINT "Input the coordinates of your shot ---=>"; 3430 INPUT J,K 3440 IF J=10 THEN 3390 3450 IF J=-1 THEN 3970 3460 LET P=10*J+K+1 3470 IF P<1 OR P>100 THEN 4150 3480 IF A(P)=4 THEN 3540 3490 IF A$(P,P)=X$ THEN 3570 3500 PRINT "...shot missed..." 3510 LET A$(P,P)=M$ 3520 LET A(P)=4 3530 GOTO 1490 3540 PRINT "YOU HAVE ALREADY SHOT THERE" 3550 PRINT " TRY AGAIN" 3560 GOTO 3420 3570 PRINT J$;"<=- A HIT !! -=>";J$ 3580 ON A(P) GOTO 3590,3660,3730 3590 LET F(1)=F(1)+1 3600 LET A(P)=4 3610 LET A$(P,P)=S$ 3620 IF F(1)<>2 THEN 1490 3630 PRINT J$;"<*> CRUISER 1 SUNKEN <*>";J$ 3640 LET F=F+1 3650 IF F=3 THEN 3800 ELSE 1490 3660 LET F(2)=F(2)+1 3670 LET A$(P,P)=S$ 3680 LET A(P)=4 3690 IF F(2)<>2 THEN 1490 3700 PRINT J$;"<#> CRUISER 2 SUNKEN <#>";J$ 3710 LET F=F+1 3720 IF F=3 THEN 3800 ELSE 1490 3730 LET F(3)=F(3)+1 3740 LET A$(P,P)=S$ 3750 LET A(P)=4 3760 IF F(3)<>3 THEN 1490 3770 LET F=F+1 3780 PRINT J$;"<<==-- BATTLESHIP SUNKEN --==>>";J$ 3790 IF F<>3 THEN 1490 3800 PRINT " CONGRATULATIONS! YOU HAVE WON" 3810 REM ** FINAL DISPLAY ** 3820 PRINT " COMPUTER SHIPS YOUR SHIPS" 3830 PRINT " 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9" 3840 FOR I=0 TO 9 3850 PRINT %2I;I;" "; 3860 FOR O=1 TO 10 3870 PRINT A$(10*I+O,10*I+O);" "; 3880 NEXT O 3890 PRINT %2I;" ";I;" "; 3900 FOR O=1 TO 10 3910 PRINT B$(10*I+O,10*I+O);" "; 3920 NEXT O 3930 PRINT 3940 NEXT I 3950 GOTO 4160 3960 PRINT: REM ** GAME DISPLAY ** 3970 FOR I=1 TO 100 3980 IF A$(I,I)<>X$ THEN LET C$(I,I)=A$(I,I) 3990 IF A$(I,I)=X$ THEN LET C$(I,I)="-" 4000 NEXT I 4010 PRINT K$;" COMPUTER SHIPS YOUR SHIPS" 4020 PRINT " 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9" 4030 FOR I=0 TO 9 4040 PRINT %2I;I;" "; 4050 FOR O=1 TO 10 4060 PRINT C$(10*I+O,10*I+O);" "; 4070 NEXT O 4080 PRINT %2I;" ";I;" "; 4090 FOR O=1 TO 10 4100 PRINT B$(10*I+O,10*I+O);" "; 4110 NEXT O 4120 PRINT 4130 NEXT I 4140 GOTO 3420 4150 PRINT "**INPUT ERROR**": GOTO 3420 4160 PRINT "NICE SEEING YOU. BYE NOW" 4170 GOTO 4220 4180 PRINT 4190 PRINT " * Type in something to continue * "; 4200 INPUT (1,0)"---=>",I$ 4210 PRINT : RETURN 4220 END