mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-21 23:00:43 -08:00
Spaces tend to cause annoyances in a Unix-style shell environment. This change fixes that.
109 lines
4.0 KiB
Java
109 lines
4.0 KiB
Java
import java.util.Random;
|
|
import java.util.Scanner;
|
|
|
|
public class Gunner {
|
|
|
|
public static final int MAX_ROUNDS = 6;
|
|
public static final int MAX_ENEMIES = 4;
|
|
public static final int ERROR_DISTANCE = 100;
|
|
|
|
private static Scanner scanner = new Scanner(System.in);
|
|
private static Random random = new Random();
|
|
|
|
public static void main(String[] args) {
|
|
println(" GUNNER");
|
|
println(" CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
|
println();
|
|
println();
|
|
println();
|
|
println("YOU ARE THE OFFICER-IN-CHARGE, GIVING ORDERS TO A GUN");
|
|
println("CREW, TELLING THEM THE DEGREES OF ELEVATION YOU ESTIMATE");
|
|
println("WILL PLACE A PROJECTILE ON TARGET. A HIT WITHIN " + ERROR_DISTANCE + " YARDS");
|
|
println("OF THE TARGET WILL DESTROY IT.");
|
|
println();
|
|
while (true) {
|
|
int maxRange = random.nextInt(40000) + 20000;
|
|
int enemyCount = 0;
|
|
int totalRounds = 0;
|
|
println("MAXIMUM RANGE OF YOUR GUN IS " + maxRange + " YARDS.\n");
|
|
|
|
while (true) {
|
|
int rounds = fightEnemy(maxRange);
|
|
totalRounds += rounds;
|
|
|
|
if (enemyCount == MAX_ENEMIES || rounds >= MAX_ROUNDS) {
|
|
if (rounds < MAX_ROUNDS) {
|
|
println("\n\n\nTOTAL ROUNDS EXPENDED WERE:" + totalRounds);
|
|
}
|
|
if (totalRounds > 18 || rounds >= MAX_ROUNDS) {
|
|
println("BETTER GO BACK TO FORT SILL FOR REFRESHER TRAINING!");
|
|
} else {
|
|
println("NICE SHOOTING !!");
|
|
}
|
|
println("\nTRY AGAIN (Y OR N)");
|
|
String tryAgainResponse = scanner.nextLine();
|
|
if ("Y".equals(tryAgainResponse) || "y".equals(tryAgainResponse)) {
|
|
break;
|
|
}
|
|
println("\nOK. RETURN TO BASE CAMP.");
|
|
return;
|
|
}
|
|
enemyCount++;
|
|
println("\nTHE FORWARD OBSERVER HAS SIGHTED MORE ENEMY ACTIVITY...");
|
|
}
|
|
}
|
|
}
|
|
|
|
private static int fightEnemy(int maxRange) {
|
|
int rounds = 0;
|
|
long target = Math.round(maxRange * (random.nextDouble() * 0.8 + 0.1));
|
|
println(" DISTANCE TO THE TARGET IS " + target + " YARDS.");
|
|
|
|
while (true) {
|
|
println("\nELEVATION?");
|
|
double elevation = Double.parseDouble(scanner.nextLine());
|
|
if (elevation > 89.0) {
|
|
println("MAXIMUM ELEVATION IS 89 DEGREES.");
|
|
continue;
|
|
}
|
|
if (elevation < 1.0) {
|
|
println("MINIMUM ELEVATION IS ONE DEGREE.");
|
|
continue;
|
|
}
|
|
rounds++;
|
|
if (rounds >= MAX_ROUNDS) {
|
|
println("\nBOOM !!!! YOU HAVE JUST BEEN DESTROYED ");
|
|
println("BY THE ENEMY.\n\n\n");
|
|
break;
|
|
}
|
|
|
|
long error = calculateError(maxRange, target, elevation);
|
|
if (Math.abs(error) < ERROR_DISTANCE) {
|
|
println("*** TARGET DESTROYED *** " + rounds + " ROUNDS OF AMMUNITION EXPENDED.");
|
|
break;
|
|
} else if (error > ERROR_DISTANCE) {
|
|
println("SHORT OF TARGET BY " + Math.abs(error) + " YARDS.");
|
|
} else {
|
|
println("OVER TARGET BY " + Math.abs(error) + " YARDS.");
|
|
}
|
|
|
|
}
|
|
return rounds;
|
|
}
|
|
|
|
private static long calculateError(int maxRange, long target, double elevationInDegrees) {
|
|
double elevationInRadians = Math.PI * elevationInDegrees / 90.0; //convert degrees to radians
|
|
double impact = maxRange * Math.sin(elevationInRadians);
|
|
double error = target - impact;
|
|
return Math.round(error);
|
|
}
|
|
|
|
private static void println(String s) {
|
|
System.out.println(s);
|
|
}
|
|
|
|
private static void println() {
|
|
System.out.println();
|
|
}
|
|
}
|