!***************************************************************************! ! ! ! BATTLE.BAS ! ! Battleship for the Alpha Micro ! ! ! !***************************************************************************! !Copyright (C) 1986 by UltraSoft. All Rights Reserved. !FreeWare from UltraSoft. May be distributed free of charge. ! !Written by: David Pallmann ! !Edit History: !1.0 29-Mar-86 created. /DFP MAP1 CBRD(10,10),B,1 !COMPUTER BOARD MAP1 CIMG(10,10),B,1 !COMPUTER IMAGE OF PLAYER BOARD MAP1 PBRD(10,10),B,1 !PLAYER BOARD MAP1 PIMG(10,10),B,1 !PLAYER IMAGE OF COMPUTER BOARD MAP1 CSHIP(5),F !SHIP COUNTS MAP1 PSHIP(5),F !SHIP COUNTS MAP1 NAME(5),S,20 !SHIP NAMES MAP1 LENGTH(5),F !SHIP LENGTHS MAP1 CDOWN,F !COMPUTER SHIPS SANK MAP1 PDOWN,F !PLAYER SHIPS SANK MAP1 HR,F !HIT ROW MAP1 HC,F !HIT COLUMN MAP1 SR,F !SAVED HIT ROW MAP1 SC,F !SAVED HIT COLUMN MAP1 HFLAG,F !HIT FLAG MAP1 I,F !LOOP INDEX MAP1 J,F !LOOP INDEX MAP1 K,F !LOOP INDEX MAP1 R,F !ROW MAP1 C,F !COLUMN MAP1 R1,F !ROW MAP1 C1,F !COLUMN MAP1 D,F !DIRECTION MAP1 VD,F !VERTICAL DIRECTION MAP1 HD,F !HORIZONTAL DIRECTION MAP1 L,F !LENGTH OF CURRENT SHIP MAP1 TEXT,S,10 !INPUT STRING MAP1 HITS,F !PLAYER HITS MAP1 CHITS,F !COMPUTER HITS MAP1 FLAG,F !FLAG INIT: RANDOMIZE FOR I=1 TO 5 READ NAME(I),LENGTH(I) CSHIP(I)=LENGTH(I) PSHIP(I)=LENGTH(I) NEXT DATA BATTLESHIP,5 DATA DESTROYER,4 DATA CRUISER,3 DATA SUBMARINE,3 DATA PT BOAT,2 NEWGAM: PRINT TAB(-1,0); TAB(-1,11); FOR I=1 TO 10 PRINT TAB(1,I*2+2); STR(I); PRINT TAB(13,I*2+2); STR(I); PRINT TAB(I+1,1); CHR(I+64); PRINT TAB(I+13,1); CHR(I+64); FOR J=1 TO 10 CBRD(I,J)=0 : CIMG(I,J)=0 : PBRD(I,J)=0 : PIMG(I,J)=0 PRINT TAB(I+1,J*2+2); "."; PRINT TAB(I+13,J*2+2); "."; NEXT NEXT PRINT TAB(6,25); "COMPUTER"; PRINT TAB(7,25); "OPPONENT"; PRINT TAB(18,25); "PLAYER"; PRINT TAB(19,25); "FIELD"; PRINT TAB(-1,12); FOR I=1 TO 5 SELECT: R=INT(RND(0)*10)+1 C=INT(RND(0)*10)+1 D=INT(RND(0)*4)+1 IF D=1 THEN VD=1 : HD=0 IF D=2 THEN VD=-1 : HD=0 IF D=3 THEN VD=0 : HD=1 IF D=4 THEN VD=0 : HD=-1 L=LENGTH(I) IF R+(VD*(L-1))<1 OR R+(VD*(L-1))>10 THEN GOTO SELECT IF C+(HD*(L-1))<1 OR C+(HD*(L-1))>10 THEN GOTO SELECT R1=R : C1=C FLAG=0 FOR J=1 TO L IF CBRD(R1,C1)#0 THEN FLAG=-1 R1=R1+VD : C1=C1+HD NEXT IF FLAG THEN GOTO SELECT FOR J=1 TO L CBRD(R,C)=I R=R+VD C=C+HD NEXT NEXT PRINT TAB(3,50); "** BATTLESHIP **"; PRINT TAB(-1,11); PRINT TAB(5,45); "ENTER STARTING COORDINATE, COMMA,"; PRINT TAB(6,45); "ENDING COORDINATE (EXAMPLE: A1,A5)"; FOR I=1 TO 5 GETPOS: PRINT TAB(-1,11); PRINT TAB(I+7,45); NAME(I); " ("; STR(LENGTH(I)); ")? "; TAB(-1,9); PRINT TAB(-1,12); INPUT LINE TEXT CALL COORD : IF FLAG THEN GOTO GETPOS CALL CHOP R1=R : C1=C CALL COORD : IF FLAG THEN GOTO GETPOS VD=0 : HD=0 IF R>R1 THEN VD=1 IF RC1 THEN HD=1 IF C10 OR C<1 OR C>10 THEN GOTO PLAYER IF PIMG(R,C)#0 THEN GOTO PLAYER IF CBRD(R,C)=0 THEN GOTO MISS HIT: PIMG(R,C)=1 PRINT TAB(R+1,C*2+2); "*"; PRINT TAB(5,70); "HIT "; CHR(7); HITS=HITS+1 I=CBRD(R,C) CSHIP(I)=CSHIP(I)-1 IF CSHIP(I)=0 THEN CDOWN=CDOWN+1 : PRINT TAB(20,45); STR(CDOWN); " COMPUTER SHIPS SANK"; IF HITS<17 THEN GOTO COMP PRINT TAB(22,45); "CONGRATULATIONS, YOU WIN "; END MISS: PIMG(R,C)=-1 PRINT TAB(R+1,C*2+2); "."; PRINT TAB(5,70); "MISS"; COMP: ON HFLAG GOTO CH1,CH2,CH3,CH4 R=INT(RND(0)*10)+1 C=INT(RND(0)*10)+1 CMOVE: IF CIMG(R,C)#0 THEN GOTO COMP PRINT TAB(7,65); CHR(R+64); STR(C); " "; IF PBRD(R,C)#0 THEN GOTO CHIT CMISS: CIMG(R,C)=-1 PRINT TAB(R+13,C*2+2); "."; PRINT TAB(7,70); "MISS"; IF HFLAG#0 THEN HFLAG=HFLAG+1 : HR=SR : HC=SC IF HFLAG>4 THEN HFLAG=0 GOTO PLAYER CHIT: CIMG(R,C)=1 PRINT TAB(R+13,C*2+2); "*"; PRINT TAB(7,70); "HIT "; CHR(7); CHITS=CHITS+1 I=PBRD(R,C) PSHIP(I)=PSHIP(I)-1 IF PSHIP(I)=0 THEN PDOWN=PDOWN+1 : PRINT TAB(18,45); STR(PDOWN); " PLAYER SHIPS SANK"; IF HFLAG=0 THEN HFLAG=1 : HR=R : HC=C : SR=R : SC=C IF CHITS<17 THEN GOTO PLAYER PRINT TAB(22,45); "SORRY, YOU HAVE LOST "; QUIT: FOR I=1 TO 10 FOR J=1 TO 10 IF CBRD(I,J)#0 AND PIMG(I,J)=0 THEN PRINT TAB(I+1,J*2+2); CHR(96+CBRD(I,J)); NEXT NEXT PRINT TAB(22,75); END CH1: HR=HR-1 HC=HC GOTO CHECK CH2: HR=HR+1 HC=HC GOTO CHECK CH3: HR=HR HC=HC-1 GOTO CHECK CH4: HR=HR HC=HC+1 GOTO CHECK CHECK: R=HR C=HC IF R<1 OR R>10 THEN GOTO CNEXT IF C<1 OR C>10 THEN GOTO CNEXT IF CIMG(R,C)=0 THEN GOTO CMOVE CNEXT: HFLAG=HFLAG+1 IF HFLAG>4 THEN HFLAG=0 HR=SR : HC=SC GOTO COMP COORD: FLAG=0 R=ASC(LEFT(TEXT,1))-64 CALL CHOP C=LEFT(TEXT,1) CALL CHOP IF LEFT(TEXT,1)="0" THEN C=10 : CALL CHOP IF R<1 OR R>10 THEN FLAG=-1 IF C<1 OR C>10 THEN FLAG=-1 RETURN CHOP: TEXT=RIGHT(TEXT,LEN(TEXT)-1) RETURN