mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-14 00:20:54 -08:00
125 lines
4.7 KiB
C#
125 lines
4.7 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|