Merge pull request #379 from marijnz0r/main

Add csharp version of 40_Gunner
This commit is contained in:
Jeff Atwood
2022-01-03 07:20:51 -08:00
committed by GitHub
2 changed files with 134 additions and 0 deletions

124
42_Gunner/csharp/Program.cs Normal file
View File

@@ -0,0 +1,124 @@
namespace Gunner
{
class Program
{
static void Main(string[] args)
{
PrintIntro();
string keepPlaying = "Y";
while (keepPlaying == "Y") {
PlayGame();
Console.WriteLine("TRY AGAIN (Y OR N)");
keepPlaying = Console.ReadLine();
}
}
static void PlayGame()
{
int totalAttempts = 0;
int amountOfGames = 0;
while (amountOfGames < 4) {
int maximumRange = new Random().Next(0, 40000) + 20000;
Console.WriteLine($"MAXIMUM RANGE OF YOUR GUN IS {maximumRange} YARDS." + Environment.NewLine + Environment.NewLine + Environment.NewLine);
int distanceToTarget = (int) (maximumRange * (0.1 + 0.8 * new Random().NextDouble()));
Console.WriteLine($"DISTANCE TO THE TARGET IS {distanceToTarget} YARDS.");
(bool gameWon, int attempts) = HitTheTarget(maximumRange, distanceToTarget);
if(!gameWon) {
Console.WriteLine(Environment.NewLine + "BOOM !!!! YOU HAVE JUST BEEN DESTROYED" + Environment.NewLine +
"BY THE ENEMY." + Environment.NewLine + Environment.NewLine + Environment.NewLine
);
PrintReturnToBase();
break;
} else {
amountOfGames += 1;
totalAttempts += attempts;
Console.WriteLine($"TOTAL ROUNDS EXPENDED WERE:{totalAttempts}");
if (amountOfGames < 4) {
Console.WriteLine("THE FORWARD OBSERVER HAS SIGHTED MORE ENEMY ACTIVITY...");
} else {
if (totalAttempts > 18) {
PrintReturnToBase();
} else {
Console.WriteLine($"NICE SHOOTING !!");
}
}
}
}
}
static (bool, int) HitTheTarget(int maximumRange, int distanceToTarget)
{
int attempts = 0;
while (attempts < 6)
{
int elevation = GetElevation();
int differenceBetweenTargetAndImpact = CalculateDifferenceBetweenTargetAndImpact(maximumRange, distanceToTarget, elevation);
if (Math.Abs(differenceBetweenTargetAndImpact) < 100)
{
Console.WriteLine($"*** TARGET DESTROYED *** {attempts} ROUNDS OF AMMUNITION EXPENDED.");
return (true, attempts);
}
else if (differenceBetweenTargetAndImpact > 100)
{
Console.WriteLine($"OVER TARGET BY {Math.Abs(differenceBetweenTargetAndImpact)} YARDS.");
}
else
{
Console.WriteLine($"SHORT OF TARGET BY {Math.Abs(differenceBetweenTargetAndImpact)} YARDS.");
}
attempts += 1;
}
return (false, attempts);
}
static int CalculateDifferenceBetweenTargetAndImpact(int maximumRange, int distanceToTarget, int elevation)
{
double weirdNumber = 2 * elevation / 57.3;
double distanceShot = maximumRange * Math.Sin(weirdNumber);
return (int)distanceShot - distanceToTarget;
}
static void PrintReturnToBase()
{
Console.WriteLine("BETTER GO BACK TO FORT SILL FOR REFRESHER TRAINING!");
}
static int GetElevation()
{
Console.WriteLine("ELEVATION");
int elevation = int.Parse(Console.ReadLine());
if (elevation > 89) {
Console.WriteLine("MAXIMUM ELEVATION IS 89 DEGREES");
return GetElevation();
}
if (elevation < 1) {
Console.WriteLine("MINIMUM ELEVATION IS 1 DEGREE");
return GetElevation();
}
return elevation;
}
static void PrintIntro()
{
Console.WriteLine(new String(' ', 30) + "GUNNER");
Console.WriteLine(new String(' ', 15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" + Environment.NewLine + Environment.NewLine + Environment.NewLine);
Console.WriteLine("YOU ARE THE OFFICER-IN-CHARGE, GIVING ORDERS TO A GUN");
Console.WriteLine("CREW, TELLING THEM THE DEGREES OF ELEVATION YOU ESTIMATE");
Console.WriteLine("WILL PLACE A PROJECTILE ON TARGET. A HIT WITHIN 100 YARDS");
Console.WriteLine("OF THE TARGET WILL DESTROY IT." + Environment.NewLine);
}
}
}

View File

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>