!***************************************************************************!
!                                                                           !
!                                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

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