/
hangman.p6
executable file
·80 lines (72 loc) · 2.34 KB
/
hangman.p6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/perl6
# Simple hangman game to illustrate Perl 6.
# Very procedural. No OOP. Uses scalars, arrays, and hashes
# TODO: needs cleaning
use v6;
my $dictionary = shift(@*ARGS) // 'words';
my @words = read-dictionary($dictionary);
my $alphabet = "abcdefghijklmnopqrstuvwxyz";
my @hangman = <head torso left_arm right_arm left_leg right_leg>;
loop {
my $word = @words[rand * +@words];
my @blanks = "_" xx chars($word);
my (@hanging,%missed,%guessed);
my $i = 0;
while @hanging != @hangman {
say " Word: " ~ join(" ", @blanks);
say "Letters missed: " ~ join(" ", sort keys %missed);
say " Hangman: " ~ join(" ", @hanging);
if join('',@blanks) eq $word { say "\t\tYou Win!"; last; }
say "Enter a letter ...";
my $guess = substr(lc(get($*IN)), 0, 1); # only take first char
if not defined(index($alphabet,$guess)) {
say "That's not a letter!";
next;
}
if %guessed{$guess} {
say "You already guessed that letter!";
next;
}
%guessed{$guess}++;
if defined(index($word,$guess)) {
say "yes";
@blanks = fill-blanks(@blanks,$word,$guess);
}
else {
say "no";
push(@hanging, @hangman[$i++]);
%missed{$guess}++;
}
}
say "\t\tYou lose!\nThe word was ''$word''" if @hanging == @hangman;
say "Try again? (Y/n)";
my $answer = get($*IN);
last if lc(substr($answer,0,1)) eq 'n';
}
say "Thanks for playing!";
exit;
sub read-dictionary ($dictionary) {
say "Reading dictionary...";
my $fh = open $dictionary, :r or die;
my @words;
for lines($fh) <-> $line {
chomp($line); # remove newline
$line = lc($line); # make all words lower case
next unless chars($line) > 4; # only take words with more than 4 characters
push(@words,$line);
}
say "Done.";
return @words;
}
sub fill-blanks(@blanks is copy,$word,$letter) {
return unless $letter;
@blanks = "_" xx chars($word) if !@blanks;
my $next_pos = 0;
loop {
my $pos = index($word,$letter,$next_pos);
last unless defined $pos;
@blanks[$pos] = $letter;
$next_pos = $pos+1;
}
return @blanks;
}