use strict; use warnings; ###################### ###################### ## Main Program ## ###################### ###################### my $word = "toast"; my @word_array = split //, $word; my $word_len = length($word); print "\n"; my $found_one = 0; my $guessed_word = 0; my ($guess, $good_guesses, $bad_guesses); my ($tot_found, $occurrences, $all_occurrences) = 0; while ($word_len >= $tot_found) { if ($word_len == $tot_found) { print_word(); print "\nYou've guessed the word!\n"; play_again(); } else { print_word(); if ($guessed_word == 0) { get_guess(); check_guess(); } else { play_again(); } } if ((defined($bad_guesses))&&(length($bad_guesses) == 5)) { print "\nYou've had 5 bad guesses. GAME OVER\n\n"; print "The word was \"$word\"\n"; last; } } ###################### ###################### ## Sub Routines ## ###################### ###################### ################ # print_word # ################ sub print_word { print "\nIncorrect: $bad_guesses\n" if defined($bad_guesses); print "\n"; if ((defined($found_one))&&($found_one == 0)) { for (my $i=1; $i<=$word_len; $i++) { print " _ "; } print "\n"; } else { for (my $i=0; $i<$word_len; $i++) { if ($i =~ /[$all_occurrences]/) { print " $word_array[$i] "; } else { print " _ "; } } print "($word_len letters) ($tot_found found)\n\n"; if (($word_len > $tot_found)&&($tot_found > $word_len/2)) { print "Do you want to guess the word (y or n)? "; my $response = ; chomp($response); early_guess() if ($response eq "y"); } } } ############### # get_guess # ############### sub get_guess { print "\nGuess a letter: "; $guess = ; chomp($guess); print "\n-----------------------------------------\n"; } ################# # check_guess # ################# sub check_guess { my $occurrences = ""; my $guess_len = length($guess); print "\n$guess\n"; if ($guess !~ /[[:alpha:]]/) { print "\n***Invalid letter*** (hit any key)\n"; <>; } elsif ($guess_len > 1) { print "\n***Only one letter please!*** (hit any key)\n"; <>; } elsif ((defined($good_guesses))&&($guess =~ /[$good_guesses]/)) { print "\n***You already guessed that letter!*** (hit any key)\n"; <>; } else { if ($word =~ /[$guess]/) { if (defined($good_guesses)) { $good_guesses .= "$guess" unless ($guess =~ /[$good_guesses]/); } else { $good_guesses .= "$guess"; } my $ct = 0; foreach my $element (@word_array) { if ($element eq $guess) { $occurrences .= "$ct"; } $ct++; } $found_one = 1; } else { if (defined($bad_guesses)) { $bad_guesses .= "$guess" unless ($guess =~ /[$bad_guesses]/); } else { $bad_guesses .= "$guess"; } } $all_occurrences .= $occurrences; $tot_found = length($all_occurrences); } } ################# # early_guess # ################# sub early_guess { print "Your guess: "; my $word_guess = ; chomp($word_guess); if ($word_guess eq $word) { print "\nYou've guessed the word!\n"; $guessed_word = 1; } else { print "\nYou guessed wrong (hit any key)"; <>; } return $guessed_word; } sub play_again { print "Do you want to play again (y or n)? "; my $play_again = ; chomp($play_again); if ($play_again eq "y") { reset_game(); } else { last; } } sub reset_game { ($good_guesses, $bad_guesses) = ""; ($tot_found, $found_one, $occurrences, $all_occurrences, $guessed_word) = 0; }