!***************************************************************************!
! !
! BATTL2.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
!2.0 01-May-86 Two-user version of BATTLE.BAS /RPW (CENTAURI) (512) 631-9141
?TAB(-1,0);" *+*+*+*+BATTLESHIP*+*+*+*+*+"
?TAB(10,1);"1. PLAY AGAINST THE COMPUTER."
?TAB(11,1);"2. PLAY AGAINST ANOTHER USER."
WHICH:
?TAB(15,1);"_ <-- Enter your choice.";TAB(15,1);
INPUT "",WHICH
IF WHICH=1 CHAIN "BATTLE"
IF WHICH<>2 GOTO WHICH
?TAB(20,1);"______ <-- Enter name of job to play against.";TAB(20,1);
INPUT "",CNAM
XCALL STRIP,CNAM
IF LEN(CNAM)<1 GOTO WHICH
SND'MSG:
?TAB(21,1);"_ <-- Send message to "+CNAM+"? (Y/N)";TAB(21,1);
INPUT "",ANSWER
IF UCS(ANSWER)<>"Y" GOTO INIT1
?TAB(22,1);
XCALL SYSTEM,"SEND "+CNAM+" <HOW ABOUT A GAME OF BATTLESHIP?>"
GOTO SND'MSG
INIT1:
LOOKUP "MEM:GINDTA.SV",ABF
IF ABF THEN &
XCALL DB,14,USR'BUF : &
PNAM=UB'UID
IF ABF=0 THEN XCALL JOBNAM,PNAM
XCALL STRIP,PNAM
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 : PBRD(I,J)=0 : PIMG(I,J)=0
PRINT TAB(I+1,J*2+2); CCHAR;
PRINT TAB(I+13,J*2+2); CCHAR;
NEXT
NEXT
PRINT TAB(6,25); "OPPONENT'S";
PRINT TAB(7,25); "FIELD";
PRINT TAB(17,25);"YOUR";
PRINT TAB(18,25);"FIELD";
PRINT TAB(-1,12);
IF ABF=0 PROMPT="YOUR NAME? " : CALL INPUT : UB'NAME=ENTRY
PRINT TAB(19,25);PNAM;" (";UB'NAME;")";
PRINT TAB(3,50); "** BATTLESHIP **";
LOOKUP PNAM+".BAT",FOUND
IF FOUND CALL LOAD'OLD'BOARD : GOTO START'PLAY
PRINT TAB(-1,11);
PRINT TAB(5,40); "ENTER STARTING COORDINATE, COMMA,";
PRINT TAB(6,40); "ENDING COORDINATE (EXAMPLE: A1,A5)";
FOR I=1 TO 5
GETPOS: PRINT TAB(-1,11);
PRINT TAB(I+7,40); NAME(I); " ("; STR(LENGTH(I)); ")? "; TAB(-1,9);
PRINT TAB(-1,12);
PROMPT=""
CALL INPUT
TEXT=ENTRY
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)
R=R1+(VD*(J-1))
C=C1+(HD*(J-1))
IF R>10 OR C>10 GOTO GETPOS !Watch for subscript out of range.
IF PBRD(R,C)#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,40); TAB(-1,9);
NEXT
CALL SAVE'BOARD
START'PLAY:
CALL LOAD'BOARD
LOOKUP PNAM+".MOV",FOUND
IF FOUND KILL PNAM+".MOV"
PLAYER: PRINT TAB(5,65); TAB(-1,9);
PROMPT=""
CALL INPUT
TEXT=ENTRY
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
CALL SAVE'MOVE
IF CBRD(R,C)=0 THEN GOTO MISS
HIT: PIMG(R,C)=1
PRINT TAB(R+1,C*2+2); HCHAR;
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); " OF "+CNAM+"'S SHIPS SANK";
IF HITS<17 THEN GOTO COMP
PRINT TAB(22,45); "CONGRATULATIONS, YOU WIN ";
CALL DELAY : CALL DELAY
CALL LOAD'MOVE
GOTO QUIT
COMP:
CALL LOAD'MOVE
PRINT TAB(7,65); CHR(R+64); STR(C); " ";
IF PBRD(R,C)#0 THEN GOTO CHIT
CMISS:
PRINT TAB(R+13,C*2+2); MCHAR;
PRINT TAB(7,70); "MISS";
GOTO PLAYER
CHIT:
PRINT TAB(R+13,C*2+2); HCHAR;
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); " OF YOUR SHIPS SANK";
IF CHITS<17 THEN GOTO PLAYER
PRINT TAB(22,45); "SORRY, YOU HAVE LOST. ";
QUIT:
IF HITS<17 PRINT TAB(22,68); "WIMP!";
PRINT TAB(23,45); "EFFICIENCY RATING = ";(HITS/TRIES)*100 USING "###";"%";
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);
CALL DELAY : CALL DELAY
END
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
LOAD'MOVE:
LOOKUP CNAM+".MOV",FOUND
IF FOUND=0 ?TAB(23,40);TAB(-1,9); : CALL DELAY : &
?"Waiting for "+CNAM+" to move..."; :&
CALL DELAY : CALL DELAY : GOTO LOAD'MOVE
?TAB(23,40);TAB(-1,9);
OPEN #1,CNAM+".MOV",INPUT
INPUT #1,R,C
CLOSE #1
KILL CNAM+".MOV"
RETURN
SAVE'MOVE:
LOOKUP PNAM+".MOV",FOUND
IF FOUND ?TAB(23,40);TAB(-1,9); : CALL DELAY : &
?"Waiting for "+CNAM+" to get your move..."; :&
CALL DELAY : CALL DELAY : GOTO SAVE'MOVE
?TAB(23,40);TAB(-1,9);
OPEN #1,PNAM+".MOV",OUTPUT
PRINT #1,STR(R);",";STR(C)
CLOSE #1
TRIES=TRIES+1
RETURN
LOAD'BOARD:
IF ABF PROMPT="OPPONENT'S ID " : CALL INPUT : CNAM=ENTRY
LOOKUP CNAM+".BAT",FOUND
IF FOUND=0 ?TAB(23,40);TAB(-1,9); : CALL DELAY : &
?"Waiting for "+CNAM+" to set up board..."; :&
CALL DELAY : CALL DELAY : GOTO LOAD'BOARD
?TAB(23,40);TAB(-1,9);
OPEN #1,CNAM+".BAT",INPUT
INPUT LINE #1,CNAME
FOR X = 1 TO 10
FOR Y = 1 TO 10
INPUT #1,CBRD(X,Y)
NEXT
NEXT
CLOSE #1
KILL CNAM+".BAT"
PRINT TAB(5,40);TAB(-1,9);
PRINT TAB(8,25);CNAM;" (";CNAME;")";
RETURN
SAVE'BOARD:
OPEN #1,PNAM+".BAT",OUTPUT
PRINT #1,UB'NAME
FOR X = 1 TO 10
FOR Y = 1 TO 10
PRINT #1,STR(PBRD(X,Y))
NEXT
NEXT
CLOSE #1
RETURN
LOAD'OLD'BOARD:
OPEN #1,PNAM+".BAT",INPUT
INPUT LINE #1,TEXT
TEXT=""
FOR X = 1 TO 10
FOR Y = 1 TO 10
INPUT #1,PBRD(X,Y)
IF PBRD(X,Y)<>0 &
PRINT TAB(X+13,Y*2+2); CHR(PBRD(X,Y)+96);
NEXT
NEXT
CLOSE #1
RETURN
INPUT:
IF LEN(PROMPT)>0 &
PRINT TAB(-1,11);TAB(5,40);TAB(-1,9);PROMPT;TAB(-1,12);
INPUT LINE ENTRY
XCALL STRIP,ENTRY
ENTRY=UCS(ENTRY)
IF ENTRY[1,1]="Q" OR ENTRY="END" OR ENTRY="BYE" GOTO QUIT
RETURN