File Coverage

blib/lib/Acme/GuessNumber.pm
Criterion Covered Total %
statement 35 48 72.9
branch 5 10 50.0
condition n/a
subroutine 7 7 100.0
pod 1 1 100.0
total 48 66 72.7


line stmt bran cond sub pod time code
1             # Acme::GuessNumber - Number guessing game robot
2              
3             # Copyright (c) 2007-2008 imacat. All rights reserved. This program is free
4             # software; you can redistribute it and/or modify it under the same terms
5             # as Perl itself.
6             # First written: 2007-05-19
7              
8             package Acme::GuessNumber;
9 1     1   11636 use strict;
  1         2  
  1         36  
10 1     1   6 use warnings;
  1         2  
  1         36  
11 1     1   9 use base qw(Exporter);
  1         2  
  1         432  
12 1     1   7 use vars qw($VERSION @EXPORT @EXPORT_OK);
  1         2  
  1         103  
13             $VERSION = 0.04;
14             @EXPORT = qw(guess_number HURRY_UP);
15             @EXPORT_OK = @EXPORT;
16             # Prototype declaration
17             sub guess_number($;$);
18              
19 1     1   6 use vars qw(@GUESSMSGS @RESTMSGS);
  1         1  
  1         192  
20             @GUESSMSGS = split /\n/, << "EOT";
21             %d?
22             Is it %d?
23             It must be %d!
24             EOT
25             @RESTMSGS = split /\n/, << "EOT";
26             Any cigarette?
27             I'm feeling lucky tonight
28             I'm getting a little tired
29             It's killing me
30             I'm gonna faint
31             EOT
32              
33             # HURRY_UP: Speed up the game
34 1     1   5 use constant HURRY_UP => 1;
  1         2  
  1         687  
35              
36             # guess_number: Play the game
37             sub guess_number($;$) {
38 1     1 1 8 local ($_, %_);
39 1         3 my ($max, $hurry, $to_rest);
40 1         3 ($max, $hurry) = @_;
41 1 50       4 $hurry = 0 if @_ < 2;
42            
43             # Play the game
44 1 50       4 $to_rest = 5 + int rand 7 unless $hurry;
45 1         2 while (1) {
46 18         20 my ($num, $guess);
47             # Generate the number
48 18         73 $num = 1 + int rand $max;
49             # Generate the guess
50 18         20 $guess = 1 + int rand $max;
51             # Output our guess
52 18         62 $_ = sprintf $GUESSMSGS[int rand scalar @GUESSMSGS], $guess;
53 18         701 printf "%-40s", ": $_";
54             # Hit?
55 18 100       79 if ($guess == $num) {
56 1         5 print ": Jackpot!\n";
57 1         3 last;
58             }
59 17         1440 print ": Sorry, it's $num.\n";
60             # We are in a hurry
61 17 50       48 next if $hurry;
62             # Take a little rest
63 0 0       0 if (--$to_rest == 0) {
64 0         0 my ($flush, $rest);
65 0         0 $flush = $|;
66 0         0 $| = 1;
67             # Yell something
68 0         0 print " *" . $RESTMSGS[int rand scalar @RESTMSGS] . "* ";
69 0         0 $rest = 3 + int rand 4;
70 0         0 while ($rest-- > 0) {
71 0         0 print ".";
72 0         0 sleep 1;
73             }
74 0         0 print "\n";
75 0         0 $| = $flush;
76             # Reset the rest counter
77 0         0 $to_rest = 5 + int rand 7;
78             # Take a breath
79             } else {
80 0         0 sleep 1;
81             }
82             }
83            
84 1         4 return;
85             }
86              
87             return 1;
88              
89             __END__