!*! Updated on 03-Jan-94 at 3:50 PM by Tim; edit time: 0:01:00
!*************************** AMUS Program Label ******************************
! Filename: BATTL3.BAS Date: 1/3/94
! Category: GAME Hash Code: Version: 3.0(1)
! Initials: TRON/AM Name: Tim Shoemaker
! Company: Datatronics Telephone #: 9099287704
! Related Files: NONE
! Min. Op. Sys.: DBASIC Expertise Level:
! Special: must have DBASIC or DRUN to execute this. may be modified for other
! Description: a Multi terminal battleship game based on BATTL2.BAS. This one
! allows for easier placement of pieces, and faster game play.
!
!***************************************************************************!
! !
! BATTL3.BAS !
! Battleship for the Alpha Micro !
! WITH "GRAPHIC" INTERFACE AND MODS FOR DBASIC
! !
!***************************************************************************!
!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
!3.0 03-Jan 94 changed to a graphic screen by Tim Shoemaker (714) 455-3493
?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
CNAM = RTRIM(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);
RUNDOS "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
PNAM = .JOBNAME
LOOKUP PNAM+".OPP",B
WHEN B = 0
ALLOCATE PNAM+".OPP",1
WEND
OPEN #34,PNAM+".OPP",RANDOM,12,OPP'RECNO
OPP'RECNO = 0
OPP'ROW = 1
OPP'COL = 1
WRITE #34,OPP'RECORD
CLOSE #34
OPEN #34,PNAM+".OPP",RANDOM,12,OPP'RECNO
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
PRINT TAB(1,50); "** BATTLESHIP **";
LOOKUP PNAM+".BAT",FOUND
IF FOUND CALL LOAD'OLD'BOARD : GOTO START'PLAY
PRINT TAB(-1,11);
PRINT TAB(2,40); "POSITION PIECE USING NUMBER PAD... HIT '5' TO PLACE PIECE, HIT '0' TO ROTATE"
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
PIECE'LENGTH = LENGTH(I)
CALL PLACE'THE'PIECES
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);
THIS'ROW = R1 :THIS'COL = C1
PIECE'MARKER = CHR(I+96)+CHR(I+96)+CHR(I+96)+CHR(I+96)+CHR(I+96)
CALL PLACE'PIECE
R1=R1+VD : C1=C1+HD
NEXT
NEXT
PRINT TAB(2,1);TAB(-1,9);
! 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
CALL PLACE'YOUR'TORPEDO
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
CALL WAIT'FOR'MOVE
IF CBRD(R,C)=0 THEN GOTO MISS
HIT: PIMG(R,C)=1
! PRINT TAB(R+1,C*2+2); HCHAR;
BOARD = 1
THIS'ROW = R :THIS'COL = C
PIECE'MARKER = HCHAR+HCHAR+HCHAR+HCHAR+HCHAR
PRINT TAB(-1,23);
CALL PLACE'PIECE
PRINT TAB(-1,24);
PRINT TAB(1,20); "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(3,20); STR(CDOWN); " OF "+CNAME+"'S SHIPS SANK";
IF HITS<17 THEN GOTO COMP
PRINT TAB(2,45); "CONGRATULATIONS, YOU WIN ";
CALL DELAY : CALL DELAY
CALL LOAD'MOVE
GOTO QUIT
CHITS=CHITS+1
I=PBRD(R,C)
PSHIP(I)=PSHIP(I)-1
IF PSHIP(I)=0 THEN PDOWN=PDOWN+1 : &
PRINT TAB(3,90); STR(PDOWN); " OF YOUR SHIPS SANK";
IF CHITS<17 THEN GOTO PLAYER
PRINT TAB(2,45); "SORRY, YOU HAVE LOST. ";
QUIT:
IF HITS<17 PRINT TAB(2,68); "WIMP!";
PRINT TAB(3,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));
WHEN CBRD(I,J) <> 0 AND PIMG(I,J)=0
BOARD = 1
THIS'ROW = I :THIS'COL = J
X=CBRD(I,J)
PIECE'MARKER = CHR(X+96)+CHR(X+96)+CHR(X+96)+CHR(X+96)+CHR(X+96)
CALL PLACE'PIECE
WEND
NEXT
NEXT
PRINT TAB(2,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(2,40);TAB(-1,9); : CALL DELAY : &
?"Waiting for "+CNAME+" to move..."; :&
CALL DELAY : CALL DELAY : GOTO LOAD'MOVE
?TAB(3,40);TAB(-1,9);
OPEN #1,CNAM+".MOV",INPUT
INPUT #1,R,C
CLOSE #1
KILL CNAM+".MOV"
RETURN
WAIT'FOR'MOVE:
CALL UPDATE'OPPONENT
LOOKUP CNAM+".MOV",FOUND
IF FOUND=0 ?TAB(3,40);TAB(-1,9); : CALL DELAY : &
?"Waiting for "+CNAME+" to move..."; :&
CALL DELAY : CALL DELAY : GOTO WAIT'FOR'MOVE
RETURN
SAVE'MOVE:
LOOKUP PNAM+".MOV",FOUND
IF FOUND ?TAB(3,40);TAB(-1,9); : CALL DELAY : &
?"Waiting for "+CNAME+" to get your move..."; :&
CALL DELAY : CALL DELAY : GOTO SAVE'MOVE
?TAB(3,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(3,40);TAB(-1,9); : CALL DELAY : &
?"Waiting for "+CNAM+" to set up board..."; :&
CALL DELAY : CALL DELAY : GOTO LOAD'BOARD
?TAB(3,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;")";
OPEN #35,CNAM+".OPP",RANDOM,12,OPP'RECNO
OPP'RECNO = 0
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);
WHEN PBRD(X,Y) <> 0
THIS'ROW = X :THIS'COL = Y
I=PBRD(X,Y)
PIECE'MARKER = CHR(I+96)+CHR(I+96)+CHR(I+96)+CHR(I+96)+CHR(I+96)
CALL PLACE'PIECE
WEND
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
ENTRY = UCS(RTRIM(ENTRY))
!XCALL STRIP,ENTRY
!ENTRY=UCS(ENTRY)
IF ENTRY[1,1]="Q" OR ENTRY="END" OR ENTRY="BYE" GOTO QUIT
RETURN
DELAY: SLEEP 500
RETURN
!@@@@
PRINT TAB(-1,0);TAB(-1,80);
CALL PLACE'SQUARES
PRINT TAB(1,1);"HIT 'Q' TO QUIT, OR NUMBER PAD TO MOVE... "5" TO PLACE PIECE"
BOARD = 1
PRINT TAB(1,1);
THIS'ROW = 1 :THIS'COL = 1
PLACE'THE'PIECES:
THIS'PIECE'COL = 1
THIS'PIECE'ROW = 1
PIECE'HORZ = 1
! PIECE'LENGTH = 3
BOARD = 2
PLACE'PIECE'LOOP:
ROW'MIN = 1 :ROW'MAX = 10 :COL'MIN = 1 :COL'MAX = 10
IF PIECE'HORZ = 1 OR PIECE'HORZ = 2 ROW'MAX = 11- PIECE'LENGTH
IF PIECE'HORZ = 2 OR PIECE'HORZ = 3 OR PIECE'HORZ = 4 COL'MAX = 11-PIECE'LENGTH
IF PIECE'HORZ = 4 ROW'MIN = 0 + PIECE'LENGTH
THIS'PIECE'COL = (THIS'PIECE'COL MIN COL'MAX) MAX COL'MIN
THIS'PIECE'ROW = (THIS'PIECE'ROW MIN ROW'MAX) MAX ROW'MIN
FOR ADJUSTER=0 TO PIECE'LENGTH - 1
CALL ADJUST'POSITION
CALL PLACE'BIG'CURSOR
NEXT ADJUSTER
X=GETKEY(-1)
IF CHR(X) = "Q" PRINT TAB(-1,0); :END
XXX = CHR(X)
FOR ADJUSTER=0 TO PIECE'LENGTH - 1
CALL ADJUST'POSITION
CALL UNPLACE'BIG'CURSOR
NEXT ADJUSTER
THIS'COL = THIS'PIECE'COL :THIS'ROW = THIS'PIECE'ROW
CALL FIGURE'NEW'LOCATION
THIS'PIECE'COL = THIS'COL
THIS'PIECE'ROW = THIS'ROW
WHEN XXX = 5
ENTRY = ""
ENTRY = "ABCDEFGHIJ"[THIS'ROW;1]+THIS'COL+","
ADJUSTER = 1
CALL ADJUST'POSITION
ENTRY += "ABCDEFGHIJ"[THIS'ROW;1]+THIS'COL
RETURN
WEND
WHEN XXX = "R" OR XXX = "." OR XXX = "0"
PIECE'HORZ += 1
IF PIECE'HORZ > 4 PIECE'HORZ = 1
WEND
goto PLACE'PIECE'LOOP
ADJUST'POSITION:
THIS'COL = THIS'PIECE'COL :THIS'ROW = THIS'PIECE'ROW
IF PIECE'HORZ = 1 OR PIECE'HORZ = 2 THIS'ROW = THIS'ROW + ADJUSTER
IF PIECE'HORZ = 4 THIS'ROW = THIS'ROW - ADJUSTER
IF PIECE'HORZ = 2 OR PIECE'HORZ = 3 OR PIECE'HORZ = 4 THIS'COL = THIS'COL + ADJUSTER
RETURN
PLACE'YOUR'TORPEDO:
BOARD = 1
THIS'ROW = (YOUR'ROW MIN 10) MAX 1
THIS'COL = (YOUR'COL MIN 10) MAX 1
CALL PLACE'BIG'CURSOR
PYT1:
CALL UPDATE'OPPONENT
X=GETKEY(0)
WHEN X = -1
SLEEP 500
GOTO PYT1
WEND
IF CHR(X) = "Q" PRINT TAB(-1,0); :END
XXX = CHR(X)
CALL UNPLACE'BIG'CURSOR
CALL FIGURE'NEW'LOCATION
YOUR'ROW = THIS'ROW :YOUR'COL = THIS'COL
WHEN XXX = 5
ENTRY = ""
ENTRY = "ABCDEFGHIJ"[THIS'ROW;1]+THIS'COL
RETURN
WEND
WHEN XXX = "B"
IF BOARD = 1 BOARD = 2 ELSE BOARD = 1
WEND
goto PLACE'YOUR'TORPEDO
UPDATE'OPPONENT:
! WHEN OLD'THIS'ROW <> THIS'ROW OR OLD'THIS'COL <> THIS'COL
OPP'ROW = THIS'ROW :OPP'COL = THIS'COL
WRITE #34,OPP'RECORD
CLOSE #34
OPEN #34,PNAM+".OPP",RANDOM,12,OPP'RECNO
! PRINT TAB(1,1);"WRITING: ";OPP'ROW;OPP'COL;
! WEND
UO2:
CLOSE #35
OPEN #35,CNAM+".OPP",RANDOM,12,OPP'RECNO
READ #35,OPP'RECORD
! PRINT TAB(2,1);"READING: ";OPP'ROW;OPP'COL;
IF OPP'ROW = OLD'OPP'ROW AND OPP'COL = OLD'OPP'COL RETURN
SAVE'THIS'ROW = THIS'ROW :SAVE'THIS'COL = THIS'COL :SAVE'BOARD = BOARD
FIGURE'NEW'LOCATION:
IF XXX = 3 OR XXX = 6 OR XXX = 9 THIS'COL = (THIS'COL + 1) MIN 10
IF XXX = 1 OR XXX = 4 OR XXX = 7 THIS'COL = (THIS'COL - 1) MAX 1
IF XXX = 7 OR XXX = 8 OR XXX = 9 THIS'ROW = (THIS'ROW - 1) MAX 1
IF XXX = 1 OR XXX = 2 OR XXX = 3 THIS'ROW = (THIS'ROW + 1) MIN 10
RETURN
PLACE'SQUARES:
PRINT TAB(-1,80);TAB(-1,0);
FOR BOARD = 1 TO 2
FOR THIS'ROW = 1 TO 10
FOR THIS'COL = 1 TO 10
CALL UNPLACE'BIG'CURSOR
NEXT THIS'COL
NEXT THIS'ROW
NEXT BOARD
PRINT TAB(1,1);
RETURN