!***************************************************************************!
! !
! 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 R<R1 THEN VD=-1
IF C>C1 THEN HD=1
IF C<C1 THEN HD=-1
IF VD#0 AND HD#0 THEN GOTO GETPOS
IF VD=0 AND HD=0 THEN GOTO GETPOS
IF R1+(LENGTH(I)-1)*VD#R AND C1+(LENGTH(I)-1)*HD#C THEN GOTO GETPOS
FLAG=0
FOR J=1 TO LENGTH(I)
IF PBRD(R1+(VD*(J-1)),C1+(HD*(J-1)))#0 THEN FLAG=-1
NEXT J
IF FLAG THEN GOTO GETPOS
FOR J=1 TO LENGTH(I)
PBRD(R1,C1)=I
PRINT TAB(R1+13,C1*2+2); CHR(I+96);
R1=R1+VD : C1=C1+HD
NEXT
NEXT
FOR I=5 TO 12
PRINT TAB(I,45); TAB(-1,9);
NEXT
PRINT TAB(-1,11);
PRINT TAB(5,45); "PLAYER GUESS";
PRINT TAB(7,45); "COMPUTER GUESS";
PRINT TAB(-1,12);
PLAYER: PRINT TAB(5,65); TAB(-1,9);
INPUT LINE TEXT
TEXT=UCS(TEXT)
IF TEXT="Q" OR TEXT="QUIT" OR TEXT+"B" OR TEXT="BYE" OR TEXT="E" OR TEXT="END" THEN PRINT TAB(22,45); "WIMP!"; : GOTO QUIT
CALL COORD : IF FLAG THEN GOTO PLAYER
IF R<1 OR R>10 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
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