mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-01-27 23:36:18 -08:00
Removed spaces from top-level directory names.
Spaces tend to cause annoyances in a Unix-style shell environment. This change fixes that.
This commit is contained in:
7
09_Battle/README.md
Normal file
7
09_Battle/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
### Battle
|
||||
|
||||
As published in Basic Computer Games (1978)
|
||||
https://www.atariarchives.org/basicgames/showpage.php?page=15
|
||||
|
||||
Downloaded from Vintage Basic at
|
||||
http://www.vintage-basic.net/games.html
|
||||
196
09_Battle/battle.bas
Normal file
196
09_Battle/battle.bas
Normal file
@@ -0,0 +1,196 @@
|
||||
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 F(6,6),H(6,6),A(4),B(4),C(6),L(3)
|
||||
50 FOR X=1 TO 6
|
||||
51 FOR Y=1 TO 6
|
||||
52 F(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 F(A,B)>0 THEN 90
|
||||
130 M=0
|
||||
140 ON D GOTO 150,340,550,740
|
||||
150 B(1)=B
|
||||
160 B(2)=7:B(3)=7
|
||||
170 FOR K=1 TO N
|
||||
180 IF M>1 THEN 240
|
||||
190 IF B(K)=6 THEN 230
|
||||
200 IF F(A,B(K)+1)>0 THEN 230
|
||||
210 B(K+1)=B(K)+1
|
||||
220 GOTO 280
|
||||
230 M=2
|
||||
240 IF B(1)<B(2) AND B(1)<B(3) THEN Z=B(1)
|
||||
242 IF B(2)<B(1) AND B(2)<B(3) THEN Z=B(2)
|
||||
244 IF B(3)<B(1) AND B(3)<B(2) THEN Z=B(3)
|
||||
250 IF Z=1 THEN 90
|
||||
260 IF F(A,Z-1)>0 THEN 90
|
||||
270 B(K+1)=Z-1
|
||||
280 NEXT K
|
||||
290 F(A,B)=9-2*I-J
|
||||
300 FOR K=1 TO N
|
||||
310 F(A,B(K+1))=F(A,B)
|
||||
320 NEXT K
|
||||
330 GOTO 990
|
||||
340 A(1)=A
|
||||
350 B(1)=B
|
||||
360 A(2)=0:A(3)=0:B(2)=0:B(3)=0
|
||||
370 FOR K=1 TO N
|
||||
380 IF M>1 THEN 460
|
||||
390 IF A(K)=1 OR B(K)=1 THEN 450
|
||||
400 IF F(A(K)-1,B(K)-1)>0 THEN 450
|
||||
410 IF F(A(K)-1,B(K))>0 AND F(A(K)-1,B(K))=F(A(K),B(K)-1) THEN 450
|
||||
420 A(K+1)=A(K)-1
|
||||
430 B(K+1)=B(K)-1
|
||||
440 GOTO 530
|
||||
450 M=2
|
||||
460 IF A(1)>A(2) AND A(1)>A(3) THEN Z1=A(1)
|
||||
462 IF A(2)>A(1) AND A(2)>A(3) THEN Z1=A(2)
|
||||
464 IF A(3)>A(1) AND A(3)>A(2) THEN Z1=A(3)
|
||||
470 IF B(1)>B(2) AND B(1)>B(3) THEN Z2=B(1)
|
||||
474 IF B(2)>B(1) AND B(2)>B(3) THEN Z2=B(2)
|
||||
476 IF B(3)>B(1) AND B(3)>B(2) THEN Z2=B(3)
|
||||
480 IF Z1=6 OR Z2=6 THEN 90
|
||||
490 IF F(Z1+1,Z2+1)>0 THEN 90
|
||||
500 IF F(Z1,Z2+1)>0 AND F(Z1,Z2+1)=F(Z1+1,Z2) THEN 90
|
||||
510 A(K+1)=Z1+1
|
||||
520 B(K+1)=Z2+1
|
||||
530 NEXT K
|
||||
540 GOTO 950
|
||||
550 A(1)=A
|
||||
560 A(2)=7:A(3)=7
|
||||
570 FOR K=1 TO N
|
||||
580 IF M>1 THEN 640
|
||||
590 IF A(K)=6 THEN 630
|
||||
600 IF F(A(K)+1,B)>0 THEN 630
|
||||
610 A(K+1)=A(K)+1
|
||||
620 GOTO 680
|
||||
630 M=2
|
||||
640 IF A(1)<A(2) AND A(1)<A(3) THEN Z=A(1)
|
||||
642 IF A(2)<A(1) AND A(2)<A(3) THEN Z=A(2)
|
||||
644 IF A(3)<A(1) AND A(3)<A(2) THEN Z=A(3)
|
||||
650 IF Z=1 THEN 90
|
||||
660 IF F(Z-1,B)>0 THEN 90
|
||||
670 A(K+1)=Z-1
|
||||
680 NEXT K
|
||||
690 F(A,B)=9-2*I-J
|
||||
700 FOR K=1 TO N
|
||||
710 F(A(K+1),B)=F(A,B)
|
||||
720 NEXT K
|
||||
730 GOTO 990
|
||||
740 A(1)=A
|
||||
750 B(1)=B
|
||||
760 A(2)=7:A(3)=7
|
||||
770 B(2)=0:B(3)=0
|
||||
780 FOR K=1 TO N
|
||||
790 IF M>1 THEN 870
|
||||
800 IF A(K)=6 OR B(K)=1 THEN 860
|
||||
810 IF F(A(K)+1,B(K)-1)>0 THEN 860
|
||||
820 IF F(A(K)+1,B(K))>0 AND F(A(K)+1,B(K))=F(A(K),B(K)-1) THEN 860
|
||||
830 A(K+1)=A(K)+1
|
||||
840 B(K+1)=B(K)-1
|
||||
850 GOTO 940
|
||||
860 M=2
|
||||
870 IF A(1)<A(2) AND A(1)<A(3) THEN Z1=A(1)
|
||||
872 IF A(2)<A(1) AND A(2)<A(3) THEN Z1=A(2)
|
||||
874 IF A(3)<A(1) AND A(3)<A(2) THEN Z1=A(3)
|
||||
880 IF B(1)>B(2) AND B(1)>B(3) THEN Z2=B(1)
|
||||
882 IF B(2)>B(1) AND B(2)>B(3) THEN Z2=B(2)
|
||||
884 IF B(3)>B(1) AND B(3)>B(2) THEN Z2=B(3)
|
||||
890 IF Z1=1 OR Z2=6 THEN 90
|
||||
900 IF F(Z1-1,Z2+1)>0 THEN 90
|
||||
910 IF F(Z1,Z2+1)>0 AND F(Z1,Z2+1)=F(Z1-1,Z2) THEN 90
|
||||
920 A(K+1)=Z1-1
|
||||
930 B(K+1)=Z2+1
|
||||
940 NEXT K
|
||||
950 F(A,B)=9-2*I-J
|
||||
960 FOR K=1 TO N
|
||||
970 F(A(K+1),B(K+1))=F(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 H(I,J)=F(J,I)
|
||||
1053 NEXT J
|
||||
1054 NEXT I
|
||||
1060 FOR I=1 TO 6
|
||||
1061 FOR J=1 TO 6
|
||||
1062 PRINT H(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 H(I,J)=0
|
||||
1113 NEXT J
|
||||
1114 NEXT I
|
||||
1120 FOR I=1 TO 3
|
||||
1121 L(I)=0
|
||||
1122 NEXT I
|
||||
1130 C(1)=2:C(2)=2
|
||||
1140 C(3)=1:C(4)=1
|
||||
1150 C(5)=0:C(6)=0
|
||||
1160 S=0:H=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 F(R,C)>0 THEN 1290
|
||||
1260 S=S+1
|
||||
1270 PRINT "SPLASH! TRY AGAIN."
|
||||
1280 GOTO 1180
|
||||
1290 IF C(F(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 H(R,C)>0 THEN 1420
|
||||
1350 H=H+1
|
||||
1360 H(R,C)=F(R,C)
|
||||
1370 PRINT "A DIRECT HIT ON SHIP NUMBER";F(R,C)
|
||||
1380 C(F(R,C))=C(F(R,C))+1
|
||||
1390 IF C(F(R,C))>=4 THEN 1470
|
||||
1400 PRINT "TRY AGAIN."
|
||||
1410 GOTO 1180
|
||||
1420 PRINT "YOU ALREADY PUT A HOLE IN SHIP NUMBER";F(R,C);
|
||||
1430 PRINT "AT THAT POINT."
|
||||
1440 PRINT "SPLASH! TRY AGAIN."
|
||||
1450 S=S+1
|
||||
1460 GOTO 1180
|
||||
1470 L((INT(F(R,C)-1)/2)+1)=L((INT(F(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 L(1);"DESTROYER(S),";L(2);"CRUISER(S), AND";
|
||||
1510 PRINT L(3);"AIRCRAFT CARRIER(S)."
|
||||
1520 PRINT "YOUR CURRENT SPLASH/HIT RATIO IS";S/H
|
||||
1530 IF (L(1)+L(2)+L(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/H
|
||||
1570 IF S/H>0 THEN 1590
|
||||
1580 PRINT "CONGRATULATIONS -- A DIRECT HIT EVERY TIME."
|
||||
1590 PRINT
|
||||
1600 PRINT "****************************"
|
||||
1610 PRINT
|
||||
1620 GOTO 50
|
||||
1630 END
|
||||
8
09_Battle/csharp/Battle.csproj
Normal file
8
09_Battle/csharp/Battle.csproj
Normal file
@@ -0,0 +1,8 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
25
09_Battle/csharp/Battle.sln
Normal file
25
09_Battle/csharp/Battle.sln
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.31005.135
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Battle", "Battle.csproj", "{154E5E43-053B-4FB1-88D0-ED7166464257}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{154E5E43-053B-4FB1-88D0-ED7166464257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{154E5E43-053B-4FB1-88D0-ED7166464257}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{154E5E43-053B-4FB1-88D0-ED7166464257}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{154E5E43-053B-4FB1-88D0-ED7166464257}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {5CC3AC8C-6CEC-4FD6-B5A0-B2376B37C42F}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
347
09_Battle/csharp/Game.cs
Normal file
347
09_Battle/csharp/Game.cs
Normal file
@@ -0,0 +1,347 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace Battle
|
||||
{
|
||||
public class Game
|
||||
{
|
||||
private int[,] field = new int[7, 7];
|
||||
|
||||
private Random random = new Random();
|
||||
|
||||
public void Run()
|
||||
{
|
||||
DisplayIntro();
|
||||
|
||||
while (true)
|
||||
{
|
||||
field = new int[7, 7];
|
||||
|
||||
foreach (var shipType in new []{ 1, 2, 3})
|
||||
{
|
||||
foreach (var ship in new int[] { 1, 2 })
|
||||
{
|
||||
while (!SetShip(shipType, ship)) { }
|
||||
}
|
||||
}
|
||||
|
||||
UserInteraction();
|
||||
}
|
||||
}
|
||||
|
||||
private bool SetShip(int shipType, int shipNum)
|
||||
{
|
||||
var shipSize = 4 - shipType;
|
||||
int direction;
|
||||
int[] A = new int[5];
|
||||
int[] B = new int[5];
|
||||
int row, col;
|
||||
|
||||
do
|
||||
{
|
||||
row = Rnd(6) + 1;
|
||||
col = Rnd(6) + 1;
|
||||
direction = Rnd(4) + 1;
|
||||
} while (field[row, col] > 0);
|
||||
|
||||
var M = 0;
|
||||
|
||||
switch (direction)
|
||||
{
|
||||
case 1:
|
||||
B[1] = col;
|
||||
B[2] = 7;
|
||||
B[3] = 7;
|
||||
|
||||
for (var K = 1; K <= shipSize; K++)
|
||||
{
|
||||
if (!(M > 1 || B[K] == 6 || field[row, B[K] + 1] > 0))
|
||||
{
|
||||
B[K + 1] = B[K] + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
M = 2;
|
||||
var Z = 1;
|
||||
|
||||
if (B[1] < B[2] && B[1] < B[3]) Z = B[1];
|
||||
if (B[2] < B[1] && B[2] < B[3]) Z = B[2];
|
||||
if (B[3] < B[1] && B[3] < B[2]) Z = B[3];
|
||||
|
||||
if (Z == 1 || field[row, Z - 1] > 0) return false;
|
||||
|
||||
B[K + 1] = Z - 1;
|
||||
}
|
||||
|
||||
field[row, col] = 9 - 2 * shipType - shipNum;
|
||||
|
||||
for (var K = 1; K <= shipSize; K++)
|
||||
{
|
||||
field[row, B[K + 1]] = field[row, col];
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
A[1] = row;
|
||||
B[1] = col;
|
||||
A[2] = 0;
|
||||
A[3] = 0;
|
||||
B[2] = 0;
|
||||
B[3] = 0;
|
||||
|
||||
for (var K = 1; K <= shipSize; K++)
|
||||
{
|
||||
if (!(M > 1
|
||||
|| A[K] == 1 || B[K] == 1
|
||||
|| field[A[K] - 1, B[K] - 1] > 0
|
||||
|| (field[A[K] - 1, B[K]] > 0 && field[A[K] - 1, B[K]] == field[A[K], B[K] - 1])))
|
||||
{
|
||||
A[K + 1] = A[K] - 1;
|
||||
B[K + 1] = B[K] - 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
M = 2;
|
||||
var Z1 = 1;
|
||||
var Z2 = 1;
|
||||
|
||||
if (A[1] > A[2] && A[1] > A[3]) Z1 = A[1];
|
||||
if (A[2] > A[1] && A[2] > A[3]) Z1 = A[2];
|
||||
if (A[3] > A[1] && A[3] > A[2]) Z1 = A[3];
|
||||
if (B[1] > B[2] && B[1] > B[3]) Z2 = B[1];
|
||||
if (B[2] > B[1] && B[2] > B[3]) Z2 = B[2];
|
||||
if (B[3] > B[1] && B[3] > B[2]) Z2 = B[3];
|
||||
|
||||
if (Z1 == 6 || Z2 == 6
|
||||
|| field[Z1 + 1, Z2 + 1] > 0
|
||||
|| (field[Z1, Z2 + 1] > 0 && field[Z1, Z2 + 1] == field[Z1 + 1, Z2])) return false;
|
||||
|
||||
A[K + 1] = Z1 + 1;
|
||||
B[K + 1] = Z2 + 1;
|
||||
}
|
||||
|
||||
field[row, col] = 9 - 2 * shipType - shipNum;
|
||||
|
||||
for (var K = 1; K <= shipSize; K++)
|
||||
{
|
||||
field[A[K + 1], B[K + 1]] = field[row, col];
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
A[1] = row;
|
||||
A[2] = 7;
|
||||
A[3] = 7;
|
||||
|
||||
for (var K = 1; K <= shipSize; K++)
|
||||
{
|
||||
if (!(M > 1 || A[K] == 6
|
||||
|| field[A[K] + 1, col] > 0))
|
||||
{
|
||||
A[K + 1] = A[K] + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
M = 2;
|
||||
var Z = 1;
|
||||
|
||||
if (A[1] < A[2] && A[1] < A[3]) Z = A[1];
|
||||
if (A[2] < A[1] && A[2] < A[3]) Z = A[2];
|
||||
if (A[3] < A[1] && A[3] < A[2]) Z = A[3];
|
||||
|
||||
if (Z == 1 || field[Z - 1, col] > 0) return false;
|
||||
|
||||
A[K + 1] = Z - 1;
|
||||
}
|
||||
|
||||
field[row, col] = 9 - 2 * shipType - shipNum;
|
||||
|
||||
for (var K = 1; K <= shipSize; K++)
|
||||
{
|
||||
field[A[K + 1], col] = field[row, col];
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
default:
|
||||
A[1] = row;
|
||||
B[1] = col;
|
||||
A[2] = 7;
|
||||
A[3] = 7;
|
||||
B[2] = 0;
|
||||
B[3] = 0;
|
||||
|
||||
for (var K = 1; K <= shipSize; K++)
|
||||
{
|
||||
if (!(M > 1 || A[K] == 6 || B[K] == 1
|
||||
|| field[A[K] + 1, B[K] - 1] > 0
|
||||
|| (field[A[K] + 1, B[K]] > 0 && field[A[K] + 1, B[K]] == field[A[K], B[K] - 1])))
|
||||
{
|
||||
A[K + 1] = A[K] + 1;
|
||||
B[K + 1] = B[K] - 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
M = 2;
|
||||
var Z1 = 1;
|
||||
var Z2 = 1;
|
||||
|
||||
if (A[1] < A[2] && A[1] < A[3]) Z1 = A[1];
|
||||
if (A[2] < A[1] && A[2] < A[3]) Z1 = A[2];
|
||||
if (A[3] < A[1] && A[3] < A[2]) Z1 = A[3];
|
||||
if (B[1] > B[2] && B[1] > B[3]) Z2 = B[1];
|
||||
if (B[2] > B[1] && B[2] > B[3]) Z2 = B[2];
|
||||
if (B[3] > B[1] && B[3] > B[2]) Z2 = B[3];
|
||||
|
||||
if (Z1 == 1 || Z2 == 6
|
||||
|| field[Z1 - 1, Z2 + 1] > 0
|
||||
|| (field[Z1, Z2 + 1] > 0 && field[Z1, Z2 + 1] == field[Z1 - 1, Z2])) return false;
|
||||
|
||||
A[K + 1] = Z1 - 1;
|
||||
B[K + 1] = Z2 + 1;
|
||||
}
|
||||
|
||||
field[row, col] = 9 - 2 * shipType - shipNum;
|
||||
|
||||
for (var K = 1; K <= shipSize; K++)
|
||||
{
|
||||
field[A[K + 1], B[K + 1]] = field[row, col];
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void DisplayIntro()
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
Print(Tab(33) + "BATTLE");
|
||||
Print(Tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
||||
//-- BATTLE WRITTEN BY RAY WESTERGARD 10 / 70
|
||||
// COPYRIGHT 1971 BY THE REGENTS OF THE UNIV.OF CALIF.
|
||||
// PRODUCED AT THE LAWRENCE HALL OF SCIENCE, BERKELEY
|
||||
}
|
||||
|
||||
public void UserInteraction()
|
||||
{
|
||||
Print();
|
||||
Print("THE FOLLOWING CODE OF THE BAD GUYS' FLEET DISPOSITION");
|
||||
Print("HAS BEEN CAPTURED BUT NOT DECODED:");
|
||||
Print();
|
||||
|
||||
for (var row = 1; row <= 6; row++)
|
||||
{
|
||||
for (var col = 1; col <= 6; col++)
|
||||
{
|
||||
Write(field[col, row].ToString());
|
||||
}
|
||||
|
||||
Print();
|
||||
}
|
||||
|
||||
Print();
|
||||
Print("DE-CODE IT AND USE IT IF YOU CAN");
|
||||
Print("BUT KEEP THE DE-CODING METHOD A SECRET.");
|
||||
Print();
|
||||
|
||||
var hit = new int[7, 7];
|
||||
var lost = new int[4];
|
||||
var shipHits = new[] { 0, 2, 2, 1, 1, 0, 0 };
|
||||
var splashes = 0;
|
||||
var hits = 0;
|
||||
|
||||
Print("START GAME");
|
||||
|
||||
do
|
||||
{
|
||||
var input = Console.ReadLine().Split(',').Select(x => int.TryParse(x, out var num) ? num : 0).ToArray();
|
||||
|
||||
if (!IsValid(input))
|
||||
{
|
||||
Print("INVALID INPUT. TRY AGAIN.");
|
||||
continue;
|
||||
}
|
||||
|
||||
var col = input[0];
|
||||
var row = 7 - input[1];
|
||||
var shipNum = field[row, col];
|
||||
|
||||
if (shipNum == 0)
|
||||
{
|
||||
splashes = splashes + 1;
|
||||
Print("SPLASH! TRY AGAIN.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (shipHits[shipNum] > 3)
|
||||
{
|
||||
Print("THERE USED TO BE A SHIP AT THAT POINT, BUT YOU SUNK IT.");
|
||||
Print("SPLASH! TRY AGAIN.");
|
||||
splashes = splashes + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (hit[row, col] > 0)
|
||||
{
|
||||
Print($"YOU ALREADY PUT A HOLE IN SHIP NUMBER {shipNum} AT THAT POINT.");
|
||||
Print("SPLASH! TRY AGAIN.");
|
||||
splashes = splashes + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
hits = hits + 1;
|
||||
hit[row, col] = shipNum;
|
||||
|
||||
Print($"A DIRECT HIT ON SHIP NUMBER {shipNum}");
|
||||
shipHits[shipNum] = shipHits[shipNum] + 1;
|
||||
|
||||
if (shipHits[shipNum] < 4)
|
||||
{
|
||||
Print("TRY AGAIN.");
|
||||
continue;
|
||||
}
|
||||
|
||||
var shipType = (shipNum - 1) / 2 + 1;
|
||||
lost[shipType] = lost[shipType] + 1;
|
||||
|
||||
Print("AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS.");
|
||||
Print("SO FAR, THE BAD GUYS HAVE LOST");
|
||||
Write($"{lost[1]} DESTROYER(S), {lost[2]} CRUISER(S), AND ");
|
||||
Print($"{lost[3]} AIRCRAFT CARRIER(S).");
|
||||
Print($"YOUR CURRENT SPLASH/HIT RATIO IS {splashes / hits}");
|
||||
|
||||
if ((lost[1] + lost[2] + lost[3]) < 6) continue;
|
||||
|
||||
Print();
|
||||
Print("YOU HAVE TOTALLY WIPED OUT THE BAD GUYS' FLEET");
|
||||
Print($"WITH A FINAL SPLASH/HIT RATIO OF {splashes / hits}");
|
||||
|
||||
if ((splashes / hits) == 0)
|
||||
{
|
||||
Print("CONGRATULATIONS -- A DIRECT HIT EVERY TIME.");
|
||||
}
|
||||
|
||||
Print();
|
||||
Print("****************************");
|
||||
Print();
|
||||
|
||||
return;
|
||||
|
||||
} while (true);
|
||||
}
|
||||
|
||||
public bool IsValid(int[] input) => input.Length == 2 && input.All(Valid);
|
||||
|
||||
public bool Valid(int value) => value > 0 && value < 7;
|
||||
|
||||
public void Print(string str = "") => Console.WriteLine(str);
|
||||
|
||||
public void Write(string value) => Console.Write(value);
|
||||
|
||||
public string Tab(int pos) => new String(' ', pos);
|
||||
|
||||
public int Rnd(int seed) => random.Next(seed);
|
||||
}
|
||||
}
|
||||
12
09_Battle/csharp/Program.cs
Normal file
12
09_Battle/csharp/Program.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
|
||||
namespace Battle
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
new Game().Run();
|
||||
}
|
||||
}
|
||||
}
|
||||
3
09_Battle/csharp/README.md
Normal file
3
09_Battle/csharp/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Microsoft C#](https://docs.microsoft.com/en-us/dotnet/csharp/)
|
||||
3
09_Battle/java/README.md
Normal file
3
09_Battle/java/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Oracle Java](https://openjdk.java.net/)
|
||||
3
09_Battle/javascript/README.md
Normal file
3
09_Battle/javascript/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Shells)
|
||||
9
09_Battle/javascript/battle.html
Normal file
9
09_Battle/javascript/battle.html
Normal file
@@ -0,0 +1,9 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>BATTLE</title>
|
||||
</head>
|
||||
<body>
|
||||
<pre id="output" style="font-size: 12pt;"></pre>
|
||||
<script src="battle.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
316
09_Battle/javascript/battle.js
Normal file
316
09_Battle/javascript/battle.js
Normal file
@@ -0,0 +1,316 @@
|
||||
// BATTLE
|
||||
//
|
||||
// Converted from BASIC to Javascript by Oscar Toledo G. (nanochess)
|
||||
//
|
||||
|
||||
function print(str)
|
||||
{
|
||||
document.getElementById("output").appendChild(document.createTextNode(str));
|
||||
}
|
||||
|
||||
function input()
|
||||
{
|
||||
var input_element;
|
||||
var input_str;
|
||||
|
||||
return new Promise(function (resolve) {
|
||||
input_element = document.createElement("INPUT");
|
||||
|
||||
print("? ");
|
||||
input_element.setAttribute("type", "text");
|
||||
input_element.setAttribute("length", "50");
|
||||
document.getElementById("output").appendChild(input_element);
|
||||
input_element.focus();
|
||||
input_str = undefined;
|
||||
input_element.addEventListener("keydown", function (event) {
|
||||
if (event.keyCode == 13) {
|
||||
input_str = input_element.value;
|
||||
document.getElementById("output").removeChild(input_element);
|
||||
print(input_str);
|
||||
print("\n");
|
||||
resolve(input_str);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function tab(space)
|
||||
{
|
||||
var str = "";
|
||||
while (space-- > 0)
|
||||
str += " ";
|
||||
return str;
|
||||
}
|
||||
|
||||
var fa = [];
|
||||
var ha = [];
|
||||
var aa = [];
|
||||
var ba = [];
|
||||
var ca = [];
|
||||
var la = [];
|
||||
|
||||
// Main program
|
||||
async function main()
|
||||
{
|
||||
print(tab(33) + "BATTLE\n");
|
||||
print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
|
||||
// -- BATTLE WRITTEN BY RAY WESTERGARD 10/70
|
||||
// COPYRIGHT 1971 BY THE REGENTS OF THE UNIV. OF CALIF.
|
||||
// PRODUCED AT THE LAWRENCE HALL OF SCIENCE, BERKELEY
|
||||
while (1) {
|
||||
for (x = 1; x <= 6; x++) {
|
||||
fa[x] = [];
|
||||
ha[x] = [];
|
||||
for (y = 1; y <= 6; y++) {
|
||||
fa[x][y] = 0;
|
||||
ha[x][y] = 0;
|
||||
}
|
||||
}
|
||||
for (i = 1; i <= 3; i++) {
|
||||
n = 4 - i;
|
||||
for (j = 1; j <= 2; j++) {
|
||||
while (1) {
|
||||
a = Math.floor(6 * Math.random() + 1);
|
||||
b = Math.floor(6 * Math.random() + 1);
|
||||
d = Math.floor(4 * Math.random() + 1);
|
||||
if (fa[a][b] > 0)
|
||||
continue;
|
||||
m = 0;
|
||||
switch (d) {
|
||||
case 1:
|
||||
ba[1] = b;
|
||||
ba[2] = 7;
|
||||
ba[3] = 7;
|
||||
for (k = 1; k <= n; k++) {
|
||||
if (m <= 1 && ba[k] != 6 && fa[a][ba[k] + 1] <= 0) {
|
||||
ba[k + 1] = ba[k] + 1;
|
||||
} else {
|
||||
m = 2;
|
||||
if (ba[1] < ba[2] && ba[1] < ba[3])
|
||||
z = ba[1];
|
||||
if (ba[2] < ba[1] && ba[2] < ba[3])
|
||||
z = ba[2];
|
||||
if (ba[3] < ba[1] && ba[3] < ba[2])
|
||||
z = ba[3];
|
||||
if (z == 1)
|
||||
break;
|
||||
if (fa[a][z - 1] > 0)
|
||||
break;
|
||||
ba[k + 1] = z - 1;
|
||||
}
|
||||
}
|
||||
if (k <= n)
|
||||
continue;
|
||||
fa[a][b] = 9 - 2 * i - j;
|
||||
for (k = 1; k <= n; k++)
|
||||
fa[a][ba[k + 1]] = fa[a][b];
|
||||
break;
|
||||
case 2:
|
||||
aa[1] = a;
|
||||
ba[1] = b;
|
||||
aa[2] = 0;
|
||||
aa[3] = 0;
|
||||
ba[2] = 0;
|
||||
ba[3] = 0;
|
||||
for (k = 1; k <= n; k++) {
|
||||
if (m <= 1 && aa[k] != 1 && ba[k] != 1 && fa[aa[k] - 1][ba[k] - 1] <= 0 && (fa[aa[k] - 1][ba[k]] <= 0 || fa[aa[k] - 1][ba[k]] != fa[aa[k]][ba[k] - 1])) {
|
||||
aa[k + 1] = aa[k] - 1;
|
||||
ba[k + 1] = ba[k] - 1;
|
||||
} else {
|
||||
m = 2;
|
||||
if (aa[1] > aa[2] && aa[1] > aa[3])
|
||||
z1 = aa[1];
|
||||
if (aa[2] > aa[1] && aa[2] > aa[3])
|
||||
z1 = aa[2];
|
||||
if (aa[3] > aa[1] && aa[3] > aa[2])
|
||||
z1 = aa[3];
|
||||
if (ba[1] > ba[2] && ba[1] > ba[3])
|
||||
z2 = ba[1];
|
||||
if (ba[2] > ba[1] && ba[2] > ba[3])
|
||||
z2 = ba[2];
|
||||
if (ba[3] > ba[1] && ba[3] > ba[2])
|
||||
z2 = ba[3];
|
||||
if (z1 == 6 || z2 == 6)
|
||||
break;
|
||||
if (fa[z1 + 1][z2 + 1] > 0)
|
||||
break;
|
||||
if (fa[z1][z2 + 1] > 0 && fa[z1][z2 + 1] == fa[z1 + 1][z2])
|
||||
break;
|
||||
aa[k + 1] = z1 + 1;
|
||||
ba[k + 1] = z2 + 1;
|
||||
}
|
||||
}
|
||||
if (k <= n)
|
||||
continue;
|
||||
fa[a][b] = 9 - 2 * i - j;
|
||||
for (k = 1; k <= n; k++)
|
||||
fa[aa[k + 1]][ba[k + 1]] = fa[a][b];
|
||||
break;
|
||||
case 3:
|
||||
aa[1] = a;
|
||||
aa[2] = 7;
|
||||
aa[3] = 7;
|
||||
for (k = 1; k <= n; k++) {
|
||||
if (m <= 1 && aa[k] != 6 && fa[aa[k] + 1][b] <= 0) {
|
||||
aa[k + 1] = aa[k] + 1;
|
||||
} else {
|
||||
m = 2;
|
||||
if (aa[1] < aa[2] && aa[1] < aa[3])
|
||||
z = aa[1];
|
||||
if (aa[2] < aa[1] && aa[2] < aa[3])
|
||||
z = aa[2];
|
||||
if (aa[3] < aa[1] && aa[3] < aa[2])
|
||||
z = aa[3];
|
||||
if (z == 1)
|
||||
break;
|
||||
if (fa[z - 1][b] > 0)
|
||||
break;
|
||||
aa[k + 1] = z - 1;
|
||||
}
|
||||
}
|
||||
if (k <= n)
|
||||
continue;
|
||||
fa[a][b] = 9 - 2 * i - j;
|
||||
for (k = 1; k <= n; k++)
|
||||
fa[aa[k + 1]][b] = fa[a][b];
|
||||
break;
|
||||
case 4:
|
||||
aa[1] = a;
|
||||
ba[1] = b;
|
||||
aa[2] = 7;
|
||||
aa[3] = 7;
|
||||
ba[2] = 0;
|
||||
ba[3] = 0;
|
||||
for (k = 1; k <= n; k++) {
|
||||
if (m <= 1 && aa[k] != 6 && ba[k] != 1 && fa[aa[k] + 1][ba[k] - 1] <= 0 && (fa[aa[k] + 1][ba[k]] <= 0 || fa[aa[k] + 1][ba[k]] != fa[aa[k]][ba[k] - 1])) {
|
||||
aa[k + 1] = aa[k] + 1;
|
||||
ba[k + 1] = ba[k] - 1;
|
||||
} else {
|
||||
m = 2;
|
||||
if (aa[1] < aa[2] && aa[1] < aa[3])
|
||||
z1 = aa[1];
|
||||
if (aa[2] < aa[1] && aa[2] < aa[3])
|
||||
z1 = aa[2];
|
||||
if (aa[3] < aa[1] && aa[3] < aa[2])
|
||||
z1 = aa[3];
|
||||
if (ba[1] > ba[2] && ba[1] > ba[3])
|
||||
z2 = ba[1];
|
||||
if (ba[2] > ba[1] && ba[2] > ba[3])
|
||||
z2 = ba[2];
|
||||
if (ba[3] > ba[1] && ba[3] > ba[2])
|
||||
z2 = ba[3];
|
||||
if (z1 == 1 || z2 == 6)
|
||||
break;
|
||||
if (fa[z1 - 1][z2 + 1] > 0)
|
||||
break;
|
||||
if (fa[z1][z2 + 1] > 0 && fa[z1][z2 + 1] == fa[z1 - 1][z2])
|
||||
break;
|
||||
aa[k + 1] = z1 - 1;
|
||||
ba[k + 1] = z2 + 1;
|
||||
}
|
||||
}
|
||||
if (k <= n)
|
||||
continue;
|
||||
fa[a][b] = 9 - 2 * i - j;
|
||||
for (k = 1; k <= n; k++)
|
||||
fa[aa[k + 1]][ba[k + 1]] = fa[a][b];
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
print("\n");
|
||||
print("THE FOLLOWING CODE OF THE BAD GUYS' FLEET DISPOSITION\n");
|
||||
print("HAS BEEN CAPTURED BUT NOT DECODED:\n");
|
||||
print("\n");
|
||||
for (i = 1; i <= 6; i++) {
|
||||
for (j = 1; j <= 6; j++) {
|
||||
ha[i][j] = fa[j][i];
|
||||
}
|
||||
}
|
||||
for (i = 1; i <= 6; i++) {
|
||||
str = "";
|
||||
for (j = 1; j <= 6; j++) {
|
||||
str += " " + ha[i][j] + " ";
|
||||
}
|
||||
print(str + "\n");
|
||||
}
|
||||
print("\n");
|
||||
print("DE-CODE IT AND USE IT IF YOU CAN\n");
|
||||
print("BUT KEEP THE DE-CODING METHOD A SECRET.\n");
|
||||
print("\n");
|
||||
for (i = 1; i <= 6; i++) {
|
||||
for (j = 1; j <= 6; j++) {
|
||||
ha[i][j] = 0;
|
||||
}
|
||||
}
|
||||
for (i = 1; i <= 3; i++)
|
||||
la[i] = 0;
|
||||
ca[1] = 2;
|
||||
ca[2] = 2;
|
||||
ca[3] = 1;
|
||||
ca[4] = 1;
|
||||
ca[5] = 0;
|
||||
ca[6] = 0;
|
||||
s = 0;
|
||||
h = 0;
|
||||
print("START GAME\n");
|
||||
while (1) {
|
||||
str = await input();
|
||||
x = parseInt(str);
|
||||
y = parseInt(str.substr(str.indexOf(",") + 1));
|
||||
if (x < 1 || x > 6 || y < 1 || y > 6) {
|
||||
print("INVALID INPUT. TRY AGAIN.\n");
|
||||
continue;
|
||||
}
|
||||
r = 7 - y;
|
||||
c = x;
|
||||
if (fa[r][c] <= 0) {
|
||||
s++;
|
||||
print("SPLASH! TRY AGAIN.\n");
|
||||
continue;
|
||||
}
|
||||
if (ca[fa[r][c]] >= 4) {
|
||||
print("THERE USED TO BE A SHIP AT THAT POINT, BUT YOU SUNK IT.\n");
|
||||
print("SPLASH! TRY AGAIN.\n");
|
||||
s++;
|
||||
continue;
|
||||
}
|
||||
if (ha[r][c] > 0) {
|
||||
print("YOU ALREADY PUT A HOLE IN SHIP NUMBER " + fa[r][c] + " AT THAT POINT.\n");
|
||||
print("SPLASH! TRY AGAIN.\n");
|
||||
s++;
|
||||
continue;
|
||||
}
|
||||
h++;
|
||||
ha[r][c] = fa[r][c];
|
||||
print("A DIRECT HIT ON SHIP NUMBER " + fa[r][c] + "\n");
|
||||
ca[fa[r][c]]++;
|
||||
if (ca[fa[r][c]] < 4) {
|
||||
print("TRY AGAIN.\n");
|
||||
continue;
|
||||
}
|
||||
la[Math.floor((fa[r][c] - 1) / 2) + 1]++;
|
||||
print("AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS.\n");
|
||||
print("SO FAR, THE BAD GUYS HAVE LOST\n");
|
||||
print(" " + la[1] + " DESTROYER(S), " + la[2] + " CRUISER(S), AND");
|
||||
print(" " + la[3] + " AIRCRAFT CARRIER(S).\n");
|
||||
print("YOUR CURRENT SPLASH/HIT RATIO IS " + s / h + "\n");
|
||||
if (la[1] + la[2] + la[3] < 6)
|
||||
continue;
|
||||
print("\n");
|
||||
print("YOU HAVE TOTALLY WIPED OUT THE BAD GUYS' FLEET\n");
|
||||
print("WITH A FINAL SPLASH/HIT RATIO OF " + s / h + "\n");
|
||||
if (s / h <= 0) {
|
||||
print("CONGRATULATIONS -- A DIRECT HIT EVERY TIME.\n");
|
||||
}
|
||||
print("\n");
|
||||
print("****************************\n");
|
||||
print("\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
3
09_Battle/pascal/README.md
Normal file
3
09_Battle/pascal/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Pascal](https://en.wikipedia.org/wiki/Pascal_(programming_language))
|
||||
3
09_Battle/perl/README.md
Normal file
3
09_Battle/perl/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Perl](https://www.perl.org/)
|
||||
3
09_Battle/python/README.md
Normal file
3
09_Battle/python/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Python](https://www.python.org/about/)
|
||||
3
09_Battle/ruby/README.md
Normal file
3
09_Battle/ruby/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Ruby](https://www.ruby-lang.org/en/)
|
||||
3
09_Battle/vbnet/README.md
Normal file
3
09_Battle/vbnet/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original BASIC source [downloaded from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Visual Basic .NET](https://en.wikipedia.org/wiki/Visual_Basic_.NET)
|
||||
Reference in New Issue
Block a user