mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-12 15:50:20 -08:00
added 96-Target for perl
This commit is contained in:
107
86_Target/perl/target.pl
Normal file
107
86_Target/perl/target.pl
Normal file
@@ -0,0 +1,107 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# Target program in Perl
|
||||
# Modified so that if the user enters "quit" or "stop" for the input, the program will exit.
|
||||
# Values can be space and/or comma separated.
|
||||
# Translated by Kevin Brannen (kbrannen)
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
# globals
|
||||
my $R = 1;
|
||||
my $R1 = 57.296;
|
||||
my $Pi = 3.14159;
|
||||
|
||||
print "\n";
|
||||
print " " x 33, "TARGET\n";
|
||||
print " " x 15, "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n";
|
||||
|
||||
print "YOU ARE THE WEAPONS OFFICER ON THE STARSHIP ENTERPRISE\n";
|
||||
print "AND THIS IS A TEST TO SEE HOW ACCURATE A SHOT YOU\n";
|
||||
print "ARE IN A THREE-DIMENSIONAL RANGE. YOU WILL BE TOLD\n";
|
||||
print "THE RADIAN OFFSET FOR THE X AND Z AXES, THE LOCATION\n";
|
||||
print "OF THE TARGET IN THREE DIMENSIONAL RECTANGULAR COORDINATES,\n";
|
||||
print "THE APPROXIMATE NUMBER OF DEGREES FROM THE X AND Z\n";
|
||||
print "AXES, AND THE APPROXIMATE DISTANCE TO THE TARGET.\n";
|
||||
print "YOU WILL THEN PROCEEED TO SHOOT AT THE TARGET UNTIL IT IS\n";
|
||||
print "DESTROYED!\n\n";
|
||||
print "GOOD LUCK!!\n\n";
|
||||
|
||||
while (1)
|
||||
{
|
||||
my $A = rand(1) * 2 * $Pi;
|
||||
my $B = rand(1) * 2 * $Pi;
|
||||
my $P1 = 100000 * rand(1) + rand(1);
|
||||
my $X = sin($B) * cos($A) * $P1;
|
||||
my $Y = sin($B) * sin($A) * $P1;
|
||||
my $Z = cos($B) * $P1;
|
||||
print "RADIANS FROM X AXIS = $A FROM Z AXIS = $B\n";
|
||||
print "TARGET SIGHTED: APPROXIMATE COORDINATES: X=$X Y=$Y Z=$Z\n";
|
||||
|
||||
while (1)
|
||||
{
|
||||
my $P3;
|
||||
$R++;
|
||||
|
||||
if ($R == 1) { $P3 = int($P1 * .05) * 20; }
|
||||
elsif ($R == 2) { $P3 = int($P1 * .1) * 10; }
|
||||
elsif ($R == 3) { $P3 = int($P1 * .5) * 2; }
|
||||
elsif ($R == 4) { $P3 = int($P1); }
|
||||
else { $P3 = $P1; }
|
||||
|
||||
print " ESTIMATED DISTANCE: $P3\n\n";
|
||||
print "INPUT ANGLE DEVIATION FROM X, DEVIATION FROM Z, DISTANCE: ";
|
||||
chomp(my $ans = lc(<>));
|
||||
exit(0) if ($ans eq "quit" || $ans eq "stop");
|
||||
|
||||
my ($A1, $B1, $P2) = split(/[,\s]+/, $ans);
|
||||
print "\n";
|
||||
|
||||
if ($P2 >= 20)
|
||||
{
|
||||
$A1 /= $R1;
|
||||
$B1 /= $R1;
|
||||
print "RADIANS FROM X AXIS = $A1 FROM Z AXIS = $B1\n";
|
||||
my $X1 = $P2 * sin($B1) * cos($A1);
|
||||
my $Y1 = $P2 * sin($B1) * sin($A1);
|
||||
my $Z1 = $P2 * cos($B1);
|
||||
my $D = (($X1 - $X) ** 2 + ($Y1 - $Y) ** 2 + ($Z1 - $Z) ** 2) ** (0.5);
|
||||
|
||||
if ($D <= 20)
|
||||
{
|
||||
print "\n * * * HIT * * * TARGET IS NON-FUNCTIONAL\n";
|
||||
print "\nDISTANCE OF EXPLOSION FROM TARGET WAS $D KILOMETERS.\n";
|
||||
print "\nMISSION ACCOMPLISHED IN $R SHOTS.\n";
|
||||
last;
|
||||
}
|
||||
else
|
||||
{
|
||||
my $X2 = $X1 - $X;
|
||||
my $Y2 = $Y1 - $Y;
|
||||
my $Z2 = $Z1 - $Z;
|
||||
|
||||
if ($X2 < 0) { print "SHOT BEHIND TARGET ", -$X2, " KILOMETERS.\n"; }
|
||||
else { print "SHOT IN FRONT OF TARGET $X2 KILOMETERS.\n"; }
|
||||
|
||||
if ($Y2 < 0) { print "SHOT TO RIGHT OF TARGET ", -$Y2, " KILOMETERS.\n"; }
|
||||
else { print "SHOT TO LEFT OF TARGET $Y2 KILOMETERS.\n"; }
|
||||
|
||||
if ($Z2 < 0) { print "SHOT BELOW TARGET ", -$Z2, " KILOMETERS.\n"; }
|
||||
else { print "SHOT ABOVE TARGET $Z2 KILOMETERS.\n"; }
|
||||
|
||||
print "APPROX POSITION OF EXPLOSION: X=$X1 Y=$Y1 Z=$Z1\n";
|
||||
print " DISTANCE FROM TARGET = $D\n\n\n";
|
||||
next;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
print "YOU BLEW YOURSELF UP!!\n";
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
$R = 0;
|
||||
print "\n\n\n\n\nNEXT TARGET...\n\n";
|
||||
}
|
||||
Reference in New Issue
Block a user