mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 15:16:33 -08:00
Merge pull request #458 from manminusone/51_Hurkle
Implementation of Hurkle in perl
This commit is contained in:
84
51_Hurkle/perl/hurkle.pl
Executable file
84
51_Hurkle/perl/hurkle.pl
Executable file
@@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
# global variables
|
||||||
|
|
||||||
|
my($GRID) = 10;
|
||||||
|
my($TRIES) = 5;
|
||||||
|
|
||||||
|
|
||||||
|
# main program starts here
|
||||||
|
|
||||||
|
# print instructions
|
||||||
|
print <<HERE;
|
||||||
|
Hurkle
|
||||||
|
Creative Computing Morristown, New Jersey
|
||||||
|
|
||||||
|
A Hurkle is hiding on a ${GRID} by ${GRID} grid. Homebase
|
||||||
|
on the grid is point 0,0 in the southwest corner,
|
||||||
|
and any point on the grid is designated by a
|
||||||
|
pair of whole numbers seperated by a comma. The first
|
||||||
|
number is the horizontal position and the second number
|
||||||
|
is the vertical position. You must try to
|
||||||
|
guess the Hurkle's gridpoint. You get ${TRIES} tries.
|
||||||
|
After each try, I will tell you the approximate
|
||||||
|
direction to go to look for the Hurkle.
|
||||||
|
|
||||||
|
HERE
|
||||||
|
|
||||||
|
# The PLAY block is a complete game from start
|
||||||
|
# to finish. The continue block prints the
|
||||||
|
# "let's play again" message and then a new
|
||||||
|
# game is started.
|
||||||
|
PLAY: while (1) {
|
||||||
|
my($H1) = int(rand $GRID);
|
||||||
|
my($H2) = int(rand $GRID);
|
||||||
|
|
||||||
|
for my $i (1 .. $TRIES) {
|
||||||
|
printf(" Guess # %D ? ", $i);
|
||||||
|
|
||||||
|
my($G1,$G2);
|
||||||
|
# The CHECK loop will execute while we
|
||||||
|
# attempt to collect valid input from
|
||||||
|
# the player
|
||||||
|
CHECK: while (1) {
|
||||||
|
|
||||||
|
chomp(my $in = <STDIN>);
|
||||||
|
# Use a regex to attempt to parse out
|
||||||
|
# two integers separated by a comma.
|
||||||
|
if ($in =~ m{(\d+)\s*,\s*(\d+)}) {
|
||||||
|
$G1 = $1; $G2 = $2;
|
||||||
|
last CHECK;
|
||||||
|
}
|
||||||
|
# Input not accepted, please try again
|
||||||
|
print "Please enter two numbers separated by a comma ? ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abs($H1 - $G1) + abs($H2 - $G2) != 0) {
|
||||||
|
|
||||||
|
# print directional info
|
||||||
|
printf("Go %s%s\n\n",
|
||||||
|
($G2 == $H2 ? '' : $G2 < $H2 ? 'north' : 'south'),
|
||||||
|
($G1 == $H1 ? '' : $G1 < $H1 ? 'east' : 'west' ),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
# win!
|
||||||
|
printf("\nYou found him in %d tries!\n", $i);
|
||||||
|
# move to the continue block
|
||||||
|
next PLAY;
|
||||||
|
}
|
||||||
|
} # tries loop
|
||||||
|
|
||||||
|
# No more guesses
|
||||||
|
printf("Sorry, that's %d guesses.\n", $TRIES);
|
||||||
|
printf("The Hurkle is at %d, %d\n", $H1, $H2);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execution comes here either from the "next PLAY"
|
||||||
|
# statement, or by the PLAY block naturally ending
|
||||||
|
# after the player has lost.
|
||||||
|
continue {
|
||||||
|
print "\nLet's play again. Hurkle is hiding.\n\n";
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user