120 OPEN1,2,3,CHR$(6):REM OPEN RS-232 CHANNEL 130 DIM B%(10,10): REM SHIP GRID MATRIX 140 POKE53280,0:POKE53281,0:POKE54272+24,8 150 BT$="" 160 M$=LEFT$(BT$,16) 170 ME$="":FOR Q=1TO39:ME$=ME$+" ":NEXT 180 BL$=ME$:MY$=ME$:S6=54272 190 CR$=CHR$(13):F1$=CHR$(133):DS$="$" 200 C$(0)="[158]":C$(1)="" 210 PRINTCHR$(147)CHR$(142)CHR$(8) 220 S$(1)=CHR$(28)+CHR$(42) 230 FOR X=2TO5:READS$(X):NEXT 240 DATA SUBMARINE,DESTROYER,CRUISER,BATTLESHIP 250 TS=14:HS=14:BP=1:GOTO1460 260 GOSUB 2230:REM BOTH PLAYERS READY? 270 IFN$<>""THEN330 280 N$="C64":INPUT"[147]YOUR NAME";N$ 290 IFN$=""THEN280 300 PRINT"WAIT..." 310 GOSUB1950:REM SEND NAME TO OTHER COMPUTER, WAIT FOR HIS 330 REM INPUT SHIP COORDINATES 340 PRINT"[147]":P=0:GOSUB680:REM PRINT GRID 350 FOR X=2TO5:GOSUB1370 360 FOR J=1TO10 370 : FOR K=1TO10 380 : IFB%(J,K)=XTHENB%(J,K)=0 390 NEXTK,J 400 GOSUB890:REM ERASE DIRECTION AID 410 PRINTM$"ENTER "S$(X)" " 420 GOSUB1140:REM GET COORDINATES 430 IFB%(V,H)<>0THENGOSUB1060:GOTO360:REM SHIP THERE ALREADY 440 GOSUB840:REM PRINT DIRECTION AID 450 POKE198,0:WAIT198,1:GETD$ 460 CK=0:FOR Y=1TO8 470 IFMID$("TYUGJBNM",Y,1)=D$THEN490 480 NEXTY:GOSUB1060:GOTO450 490 ONYGOTO500,510,520,530,540,550,560,570 500 XD=-1:YD=-1:GOTO580 510 XD= 0:YD=-1:GOTO580 520 XD= 1:YD=-1:GOTO580 530 XD=-1:YD= 0:GOTO580 540 XD= 1:YD= 0:GOTO580 550 XD=-1:YD= 1:GOTO580 560 XD= 0:YD= 1:GOTO580 570 XD= 1:YD= 1:GOTO580 580 L=1:B%(V,H)=X 590 X1=H+XD:Y1=V+YD:L=L+1 600 IFX1>10ORY1>10THENGOSUB1060:GOTO360 610 IFX1<1ORY1<1THENGOSUB1060:GOTO360 620 IFB%(Y1,X1)<>0THENGOSUB1060:GOTO360 630 B%(Y1,X1)=X 640 IFL57THENGOSUB1060:GOTO1170 1190 PRINTM$""V$"-"; 1200 POKE198,0:WAIT198,1:GETH$ 1210 IFASC(H$)<65ORASC(H$)>74THENGOSUB1060:GOTO1200 1220 PRINTM$""H$ 1230 H=ASC(H$)-64:V=ASC(V$)-47 1240 RETURN 1250 REM HIT NOISE SUBROUTINE 1260 FOR Q=0TO24:POKES6+Q,0:NEXT:POKES6+24,8 1270 POKES6+5,192:POKES6+6,250 1280 FOR Q=120TO80STEP-1 1290 POKES6+1,Q:POKES6+4,17:FOR DE=1TO8:NEXTDE,Q 1300 POKE 53280,2:POKE53281,2 1310 POKES6+24,15:POKES6+1,15:POKES6+4,128 1320 FOR VO=15TO0STEP-1:FOR DE=1TO10:NEXTDE:POKES6+24,VO:NEXT 1330 POKE 53280,0:POKE53281,0: RETURN 1340 POKE S6+24,9:POKES6+5,9:POKES6+1,20 1350 POKE S6+4,128:FOR D=1TO10:NEXT:POKES6+4,129:GOTO1310 1360 REM CLEAR MESSAGE SCREEN SUBROUTINE 1370 PRINTM$BL$:FOR Q=1TO3:PRINTBL$:NEXT:RETURN 1380 REM 1390 REM READY FOR GAME 1400 GOSUB1370 : REM CLEAR MESSAGE AREA 1410 P=0 1420 GOSUB680 : REM DRAW GRID 1430 P=1:GOSUB680 1440 PRINT"[158] "N$TAB(18)" "N1$ 1450 GOSUB940:REM DRAW ON GRID 1460 GV=0:PRINTLEFT$(BT$,21); 1470 PRINT"[192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192]";CHR$(19) 1480 IFBP=0THENGOSUB 2140:REM OTHER PLAYER READY? 1490 REM MAIN PLAYING LOOP 1500 REM ***** INPUT FROM OTHER COMPUTER 1510 GET#1,A$:IFA$=""ORST<>0THEN1600 1520 IFA$=F1$THEN1790:REM COORDS COMING 1530 IFA$=CHR$(134)THEN1870:REM REPORT OF HIT & VALUE 1540 IFA$=CHR$(135)THEN1910:REM REPORT OF MISS 1550 IFA$<" "ORA$>"Z"THEN1600 1560 IFA$=CHR$(136)THEN250 1570 ME$=RIGHT$(ME$+A$,39) 1580 PRINT"[159]"LEFT$(BT$,20)ME$:POKE212,0 1590 REM ***** FROM YOU TO HIM 1600 IFMF=1ANDGV=0ANDBP=0THENGOSUB1370:PRINTM$"YOUR TURN (F1)" 1610 IFMF=0ANDGV=0ANDBP=0THENGOSUB1370 1620 IFBPTHENPRINTM$"PRESS F1 TO PLAY" 1630 GETA$:IFGV=1THEN1660 1640 IFA$=F1$ANDMF=1ANDBP=0THEN1760:REM GET COORDINATES 1650 IFA$=F1$ANDBP=1THENBP=0:GOTO260:REM END INITIAL CHAT MODE 1660 IFHS=0THENGV=1:GOSUB1370:PRINTM$N$" WINS!":GOSUB2220:GOTO250 1670 IFTS=0THENGV=1:GOSUB1370:PRINTM$N1$" WINS!":GOSUB2220:GOTO250 1680 IFA$>="[193]"ANDA$<="[218]"THENA$=CHR$(ASC(A$)-128) 1690 IFA$=CHR$(160)THENA$=" " 1700 IFA$<" "ORA$>"Z"THEN1510 1710 A1$=A$:IFA$=CHR$(34)THENA1$="'" 1720 MY$=RIGHT$(MY$+A1$,39) 1730 PRINT"[158]"LEFT$(BT$,22)MY$CHR$(19) 1740 PRINT#1,A$;:GOTO1510 1750 REM GET COORDINATES 1760 GOSUB1370:GOSUB1140:GOSUB1370 1770 PRINT#1,F1$CHR$(H)CHR$(V); 1780 MF=0:GOTO1490 1790 REM GET OTHER COMPUTERS COORDINATES 1800 GET#1,H$:IFH$=""THEN1800 1810 GET#1,V$:IFV$=""THEN1810 1820 H=ASC(H$):V=ASC(V$):MF=1:B=B%(V,H) 1830 IFB=0ORB=1THENPRINT#1,CHR$(135);:PRINTM$""N1$" MISSED" 1835 IFB=0ORB=1THENGOSUB2210:GOTO1600 1840 PRINT#1,CHR$(134)CHR$(B); 1850 GOSUB1250:PRINTM$""N1$" GETS A HIT!":TS=TS-1:GOSUB2210 1860 B%(V,H)=1:GOSUB940:GOTO1600 1870 GET#1,B$:IFB$=""THEN1870 1880 B=ASC(B$):HS=HS-1 1890 B$=""+LEFT$(S$(B),1)+"[146]":GOSUB1340 1900 GOTO 1920 1910 B$="*" 1920 PRINT"":FOR Q=1TOV:PRINT:NEXT 1930 PRINTTAB(1+18+H)"[158]"B$ 1940 GOTO1600 1950 REM SEND NAME TO OTHER COMPUTER 1960 REM FORQ=1TO100:PRINT#1,CHR$(0);:NEXT 1970 PRINT#1,F1$; 1980 GET#1,A$:IFA$<>F1$THEN1970 1990 FOR Q=1TOLEN(N$):PRINT#1,MID$(N$,Q,1);:NEXT:PRINT#1,CR$; 2000 N1$="" 2010 GET#1,A$:IFA$>=" "ANDA$<="Z"THENN1$=N1$+A$ 2020 IFA$<>CHR$(13)THEN2010 2030 REM WHO GOES FIRST? 2040 FOR X=1TO100:PRINT#1,CHR$(0);:NEXT 2050 WF$=CHR$(INT(RND(0)*100)+150) 2060 PRINT#1,WF$; 2070 GET#1,A$:IFA$=""THEN2060 2080 IFASC(A$)<150ORASC(A$)>249THEN2070 2090 IFWF$=A$THEN2040 2100 MF=0:MF$="SECOND":IFWF$>A$THENMF=1:MF$="FIRST" 2110 GOSUB1370:PRINTM$"WE GO "MF$ 2120 FOR X=1TO100:PRINT#1,CHR$(0);:NEXT 2130 RETURN 2140 REM OTHER PLAYER READY? ******* 2150 PRINT#1,DS$ 2160 GET#1,A$:IFA$=DS$THEN2180 2170 PRINTM$"PLEASE WAIT...":GOTO2150 2180 PRINT#1,CHR$(255); 2190 GET#1,A$:IFA$<>CHR$(255)THEN2190 2200 RETURN 2210 FOR DELAY=1TO1000:NEXT:RETURN 2220 PRINT#1,CHR$(136);:GOSUB2210:RETURN 2230 REM SIGNAL OTHER COMPUTER YOU ARE 2240 REM READY, WAIT FOR HIS SIGNAL. 2250 PRINT"[147]WAITING FOR OTHER PLAYER..." 2260 PRINT#1," PUSH THE F1 KEY. (I HAVE!) " 2270 PRINT#1,CHR$(7); 2280 GET#1,A$:IFA$<>CHR$(7)THEN2270 2290 FOR X=1TO10:PRINT#1,CHR$(7);:NEXT:RETURN