mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-29 06:05:36 -08:00
82 lines
2.5 KiB
Perl
Executable File
82 lines
2.5 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
# Gunner program in Perl
|
|
# Required extensive restructuring to remove all of the GOTO's.
|
|
# Translated by Kevin Brannen (kbrannen)
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
# globals
|
|
my $Max_range = int(40000*rand(1)+20000);
|
|
my $Total_shots = 0;
|
|
my $Games = 0;
|
|
|
|
print "\n";
|
|
print " " x 30, "GUNNER\n";
|
|
print " " x 15, "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n";
|
|
|
|
print "YOU ARE THE OFFICER-IN-CHARGE, GIVING ORDERS TO A GUN\n";
|
|
print "CREW, TELLING THEM THE DEGREES OF ELEVATION YOU ESTIMATE\n";
|
|
print "WILL PLACE A PROJECTILE ON TARGET. A HIT WITHIN 100 YARDS\n";
|
|
print "OF THE TARGET WILL DESTROY IT.\n\n";
|
|
print "MAXIMUM RANGE OF YOUR GUN IS $Max_range YARDS.\n\n";
|
|
|
|
GAME: while (1)
|
|
{
|
|
my $target_dist = int($Max_range * (.1 + .8 * rand(1)));
|
|
my $shots = 0;
|
|
print "DISTANCE TO THE TARGET IS $target_dist YARDS.\n\n";
|
|
while (1)
|
|
{
|
|
my $elevation = get_elevation(); # in degrees
|
|
$shots++;
|
|
my $dist = int($target_dist - ($Max_range * sin(2 * $elevation / 57.3)));
|
|
if (abs($dist) < 100)
|
|
{
|
|
print "*** TARGET DESTROYED *** $shots ROUNDS OF AMMUNITION EXPENDED.\n";
|
|
$Total_shots += $shots;
|
|
if ($Games++ == 4)
|
|
{
|
|
print "\n\nTOTAL ROUNDS EXPENDED WERE: $Total_shots\n";
|
|
if ($Total_shots > 18) { print "BETTER GO BACK TO FORT SILL FOR REFRESHER TRAINING!\n"; }
|
|
else { print "NICE SHOOTING !!\n"; }
|
|
last;
|
|
}
|
|
print "\nTHE FORWARD OBSERVER HAS SIGHTED MORE ENEMY ACTIVITY...\n";
|
|
next GAME;
|
|
}
|
|
if ($dist > 100) { print "SHORT OF TARGET BY ", abs($dist)," YARDS.\n"; }
|
|
else { print "OVER TARGET BY ", abs($dist), " YARDS.\n"; }
|
|
|
|
if ($shots >= 5)
|
|
{
|
|
print "\nBOOM !!!! YOU HAVE JUST BEEN DESTROYED BY THE ENEMY.\n\n\n\n";
|
|
print "BETTER GO BACK TO FORT SILL FOR REFRESHER TRAINING!\n";
|
|
last;
|
|
}
|
|
}
|
|
|
|
print "\nTRY AGAIN (Y OR N): ";
|
|
chomp(my $ans=uc(<>));
|
|
if ($ans ne "Y") { last; }
|
|
else { $Games = 0; $Total_shots = 0; }
|
|
}
|
|
|
|
print "\nOK. RETURN TO BASE CAMP.\n";
|
|
|
|
####################################
|
|
|
|
sub get_elevation
|
|
{
|
|
my $elevation;
|
|
while (1)
|
|
{
|
|
print "\nELEVATION: ";
|
|
chomp($elevation = <>);
|
|
if ($elevation > 89) { print "MAXIMUM ELEVATION IS 89 DEGREES.\n"; }
|
|
elsif ($elevation < 1) { print "MINIMUM ELEVATION IS ONE DEGREE.\n"; }
|
|
else { return $elevation; }
|
|
}
|
|
}
|