mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-23 07:29:02 -08:00
224 lines
7.2 KiB
QBasic
224 lines
7.2 KiB
QBasic
5 PRINT TAB(33);"BATTLE"
|
|
7 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
|
|
10 REM -- BATTLE WRITTEN BY RAY WESTERGARD 10/70
|
|
20 REM COPYRIGHT 1971 BY THE REGENTS OF THE UNIV. OF CALIF.
|
|
30 REM PRODUCED AT THE LAWRENCE HALL OF SCIENCE, BERKELEY
|
|
40 DIM PLAYFIELD(6,6),HITS(6,6),ROW(4),COLUMN(4),SHIP_HITS(6),LOSSES(3)
|
|
|
|
50 FOR X=1 TO 6
|
|
51 FOR Y=1 TO 6
|
|
52 PLAYFIELD(X,Y)=0
|
|
53 NEXT Y
|
|
54 NEXT X
|
|
|
|
60 FOR I=1 TO 3
|
|
70 N=4-I
|
|
80 FOR J=1 TO 2
|
|
|
|
90 A=INT(6*RND(1)+1)
|
|
100 B=INT(6*RND(1)+1)
|
|
110 D=INT(4*RND(1)+1)
|
|
|
|
120 IF PLAYFIELD(A,B)>0 THEN 90
|
|
130 M=0
|
|
140 ON D GOTO 150,340,550,740
|
|
|
|
150 COLUMN(1)=B
|
|
160 COLUMN(2)=7:COLUMN(3)=7
|
|
170 FOR K=1 TO N
|
|
180 IF M>1 THEN 240
|
|
190 IF COLUMN(K)=6 THEN 230
|
|
200 IF PLAYFIELD(A,COLUMN(K)+1)>0 THEN 230
|
|
210 COLUMN(K+1)=COLUMN(K)+1
|
|
220 GOTO 280
|
|
230 M=2
|
|
240 IF COLUMN(1)<COLUMN(2) AND COLUMN(1)<COLUMN(3) THEN Z=COLUMN(1)
|
|
242 IF COLUMN(2)<COLUMN(1) AND COLUMN(2)<COLUMN(3) THEN Z=COLUMN(2)
|
|
244 IF COLUMN(3)<COLUMN(1) AND COLUMN(3)<COLUMN(2) THEN Z=COLUMN(3)
|
|
250 IF Z=1 THEN 90
|
|
260 IF PLAYFIELD(A,Z-1)>0 THEN 90
|
|
270 COLUMN(K+1)=Z-1
|
|
280 NEXT K
|
|
290 PLAYFIELD(A,B)=9-2*I-J
|
|
300 FOR K=1 TO N
|
|
310 PLAYFIELD(A,COLUMN(K+1))=PLAYFIELD(A,B)
|
|
320 NEXT K
|
|
330 GOTO 990
|
|
|
|
340 ROW(1)=A
|
|
350 COLUMN(1)=B
|
|
360 ROW(2)=0:ROW(3)=0:COLUMN(2)=0:COLUMN(3)=0
|
|
370 FOR K=1 TO N
|
|
380 IF M>1 THEN 460
|
|
390 IF ROW(K)=1 OR COLUMN(K)=1 THEN 450
|
|
400 IF PLAYFIELD(ROW(K)-1,COLUMN(K)-1)>0 THEN 450
|
|
410 IF PLAYFIELD(ROW(K)-1,COLUMN(K))>0 AND PLAYFIELD(ROW(K)-1,COLUMN(K))=PLAYFIELD(ROW(K),COLUMN(K)-1) THEN 450
|
|
420 ROW(K+1)=ROW(K)-1
|
|
430 COLUMN(K+1)=COLUMN(K)-1
|
|
440 GOTO 530
|
|
450 M=2
|
|
460 IF ROW(1)>ROW(2) AND ROW(1)>ROW(3) THEN Z1=ROW(1)
|
|
462 IF ROW(2)>ROW(1) AND ROW(2)>ROW(3) THEN Z1=ROW(2)
|
|
464 IF ROW(3)>ROW(1) AND ROW(3)>ROW(2) THEN Z1=ROW(3)
|
|
470 IF COLUMN(1)>COLUMN(2) AND COLUMN(1)>COLUMN(3) THEN Z2=COLUMN(1)
|
|
474 IF COLUMN(2)>COLUMN(1) AND COLUMN(2)>COLUMN(3) THEN Z2=COLUMN(2)
|
|
476 IF COLUMN(3)>COLUMN(1) AND COLUMN(3)>COLUMN(2) THEN Z2=COLUMN(3)
|
|
|
|
480 IF Z1=6 OR Z2=6 THEN 90
|
|
490 IF PLAYFIELD(Z1+1,Z2+1)>0 THEN 90
|
|
500 IF PLAYFIELD(Z1,Z2+1)>0 AND PLAYFIELD(Z1,Z2+1)=PLAYFIELD(Z1+1,Z2) THEN 90
|
|
|
|
510 ROW(K+1)=Z1+1
|
|
520 COLUMN(K+1)=Z2+1
|
|
530 NEXT K
|
|
540 GOTO 950
|
|
|
|
550 ROW(1)=A
|
|
560 ROW(2)=7:ROW(3)=7
|
|
570 FOR K=1 TO N
|
|
580 IF M>1 THEN 640
|
|
590 IF ROW(K)=6 THEN 630
|
|
600 IF PLAYFIELD(ROW(K)+1,B)>0 THEN 630
|
|
610 ROW(K+1)=ROW(K)+1
|
|
620 GOTO 680
|
|
630 M=2
|
|
640 IF ROW(1)<ROW(2) AND ROW(1)<ROW(3) THEN Z=ROW(1)
|
|
642 IF ROW(2)<ROW(1) AND ROW(2)<ROW(3) THEN Z=ROW(2)
|
|
644 IF ROW(3)<ROW(1) AND ROW(3)<ROW(2) THEN Z=ROW(3)
|
|
|
|
650 IF Z=1 THEN 90
|
|
660 IF PLAYFIELD(Z-1,B)>0 THEN 90
|
|
|
|
670 ROW(K+1)=Z-1
|
|
680 NEXT K
|
|
690 PLAYFIELD(A,B)=9-2*I-J
|
|
700 FOR K=1 TO N
|
|
710 PLAYFIELD(ROW(K+1),B)=PLAYFIELD(A,B)
|
|
720 NEXT K
|
|
730 GOTO 990
|
|
|
|
740 ROW(1)=A
|
|
750 COLUMN(1)=B
|
|
760 ROW(2)=7:ROW(3)=7
|
|
770 COLUMN(2)=0:COLUMN(3)=0
|
|
780 FOR K=1 TO N
|
|
790 IF M>1 THEN 870
|
|
800 IF ROW(K)=6 OR COLUMN(K)=1 THEN 860
|
|
810 IF PLAYFIELD(ROW(K)+1,COLUMN(K)-1)>0 THEN 860
|
|
820 IF PLAYFIELD(ROW(K)+1,COLUMN(K))>0 AND PLAYFIELD(ROW(K)+1,COLUMN(K))=PLAYFIELD(ROW(K),COLUMN(K)-1) THEN 860
|
|
830 ROW(K+1)=ROW(K)+1
|
|
840 COLUMN(K+1)=COLUMN(K)-1
|
|
850 GOTO 940
|
|
860 M=2
|
|
870 IF ROW(1)<ROW(2) AND ROW(1)<ROW(3) THEN Z1=ROW(1)
|
|
872 IF ROW(2)<ROW(1) AND ROW(2)<ROW(3) THEN Z1=ROW(2)
|
|
874 IF ROW(3)<ROW(1) AND ROW(3)<ROW(2) THEN Z1=ROW(3)
|
|
880 IF COLUMN(1)>COLUMN(2) AND COLUMN(1)>COLUMN(3) THEN Z2=COLUMN(1)
|
|
882 IF COLUMN(2)>COLUMN(1) AND COLUMN(2)>COLUMN(3) THEN Z2=COLUMN(2)
|
|
884 IF COLUMN(3)>COLUMN(1) AND COLUMN(3)>COLUMN(2) THEN Z2=COLUMN(3)
|
|
|
|
890 IF Z1=1 OR Z2=6 THEN 90
|
|
900 IF PLAYFIELD(Z1-1,Z2+1)>0 THEN 90
|
|
910 IF PLAYFIELD(Z1,Z2+1)>0 AND PLAYFIELD(Z1,Z2+1)=PLAYFIELD(Z1-1,Z2) THEN 90
|
|
|
|
920 ROW(K+1)=Z1-1
|
|
930 COLUMN(K+1)=Z2+1
|
|
940 NEXT K
|
|
|
|
950 PLAYFIELD(A,B)=9-2*I-J
|
|
960 FOR K=1 TO N
|
|
970 PLAYFIELD(ROW(K+1),COLUMN(K+1))=PLAYFIELD(A,B)
|
|
980 NEXT K
|
|
|
|
990 NEXT J
|
|
1000 NEXT I
|
|
|
|
1010 PRINT
|
|
1020 PRINT "THE FOLLOWING CODE OF THE BAD GUYS' FLEET DISPOSITION"
|
|
1030 PRINT "HAS BEEN CAPTURED BUT NOT DECODED:"
|
|
1040 PRINT
|
|
1050 FOR I=1 TO 6
|
|
1051 FOR J=1 TO 6
|
|
1052 HITS(I,J)=PLAYFIELD(J,I)
|
|
1053 NEXT J
|
|
1054 NEXT I
|
|
1060 FOR I=1 TO 6
|
|
1061 FOR J=1 TO 6
|
|
1062 PRINT HITS(I,J);
|
|
1063 NEXT J
|
|
1064 PRINT
|
|
1065 NEXT I
|
|
1070 PRINT
|
|
1080 PRINT "DE-CODE IT AND USE IT IF YOU CAN"
|
|
1090 PRINT "BUT KEEP THE DE-CODING METHOD A SECRET."
|
|
1100 PRINT
|
|
1110 FOR I=1 TO 6
|
|
1111 FOR J=1 TO 6
|
|
1112 HITS(I,J)=0
|
|
1113 NEXT J
|
|
1114 NEXT I
|
|
1120 FOR I=1 TO 3
|
|
1121 LOSSES(I)=0
|
|
1122 NEXT I
|
|
|
|
1130 SHIP_HITS(1)=2:SHIP_HITS(2)=2
|
|
1140 SHIP_HITS(3)=1:SHIP_HITS(4)=1
|
|
1150 SHIP_HITS(5)=0:SHIP_HITS(6)=0
|
|
1160 S=0:HITS=0
|
|
|
|
1170 PRINT "START GAME"
|
|
|
|
1180 INPUT X,Y
|
|
1190 IF X<1 OR X>6 OR INT(X)<>ABS(X) THEN 1210
|
|
1200 IF Y>0 AND Y<7 AND INT(Y)=ABS(Y) THEN 1230
|
|
1210 PRINT "INVALID INPUT. TRY AGAIN."
|
|
1220 GOTO 1180
|
|
|
|
1230 R=7-Y
|
|
1240 C=X
|
|
1250 IF PLAYFIELD(R,C)>0 THEN 1290
|
|
1260 S=S+1
|
|
1270 PRINT "SPLASH! TRY AGAIN."
|
|
1280 GOTO 1180
|
|
|
|
1290 IF SHIP_HITS(PLAYFIELD(R,C))<4 THEN 1340
|
|
1300 PRINT "THERE USED TO BE A SHIP AT THAT POINT, BUT YOU SUNK IT."
|
|
1310 PRINT "SPLASH! TRY AGAIN."
|
|
1320 S=S+1
|
|
1330 GOTO 1180
|
|
|
|
1340 IF HITS(R,C)>0 THEN 1420
|
|
1350 HITS=HITS+1
|
|
1360 HITS(R,C)=PLAYFIELD(R,C)
|
|
1370 PRINT "A DIRECT HIT ON SHIP NUMBER";PLAYFIELD(R,C)
|
|
1380 SHIP_HITS(PLAYFIELD(R,C))=SHIP_HITS(PLAYFIELD(R,C))+1
|
|
1390 IF SHIP_HITS(PLAYFIELD(R,C))>=4 THEN 1470
|
|
1400 PRINT "TRY AGAIN."
|
|
1410 GOTO 1180
|
|
|
|
1420 PRINT "YOU ALREADY PUT A HOLE IN SHIP NUMBER";PLAYFIELD(R,C);
|
|
1430 PRINT "AT THAT POINT."
|
|
1440 PRINT "SPLASH! TRY AGAIN."
|
|
1450 S=S+1
|
|
1460 GOTO 1180
|
|
|
|
1470 LOSSES((INT(PLAYFIELD(R,C)-1)/2)+1)=LOSSES((INT(PLAYFIELD(R,C)-1)/2)+1)+1
|
|
|
|
1480 PRINT "AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS."
|
|
1490 PRINT "SO FAR, THE BAD GUYS HAVE LOST"
|
|
1500 PRINT LOSSES(1);"DESTROYER(S),";LOSSES(2);"CRUISER(S), AND";
|
|
1510 PRINT LOSSES(3);"AIRCRAFT CARRIER(S)."
|
|
1520 PRINT "YOUR CURRENT SPLASH/HIT RATIO IS";S/HITS
|
|
1530 IF (LOSSES(1)+LOSSES(2)+LOSSES(3))<6 THEN 1180
|
|
|
|
1540 PRINT
|
|
1550 PRINT "YOU HAVE TOTALLY WIPED OUT THE BAD GUYS' FLEET"
|
|
1560 PRINT "WITH A FINAL SPLASH/HIT RATIO OF";S/HITS
|
|
1570 IF S/HITS>0 THEN 1590
|
|
1580 PRINT "CONGRATULATIONS -- A DIRECT HIT EVERY TIME."
|
|
1590 PRINT
|
|
1600 PRINT "****************************"
|
|
1610 PRINT
|
|
1620 GOTO 50
|
|
1630 END
|