[Tutor] Please critique my hangman.py program
Matt Smith
smith-matt at tiscali.co.uk
Fri Jul 23 12:10:19 CEST 2004
Hi,
Thanks again for all of the help. This list is making learning Python much
easier than it could have been. My second Python program has now reached
a stage where I'd like to show it to people and get some comments. It's a
fairly no-violent version of hangman as no one gets hung and it's
impossible to lose. It has taught me alot about using strings, lists and
files. Here's the program:
# Hangman program by Matt Smith
import random
import string
def random_word(word_length):
"""Returns a random word of length word_length"""
file = open("hangman_words.txt","r")
word_list = []
for word in file:
word = word.strip()
if len(word) == word_length:
word_list.append(word)
file.close()
if len(word_list) == 0:
return 0
else:
return random.choice(word_list)
def print_status (correct_so_far,incorrect,guesses):
"""Prints the current status of the game"""
for i in range(len(correct_so_far)):
print correct_so_far[i],
print "\nIncorrect letters:",
for i in range(len(incorrect)):
print incorrect[i],
print "\nYou have had",guesses,"guesses so far."
# Game title
print "\n**************"
print "*Hangman Game*"
print "**************\n"
play_again = "y"
while string.lower(play_again) == "y":
# Get a word to guess
while 1:
try:
word_length = input("What length word do you want to guess? ",)
print "Thinking, please wait.."
word = random_word(word_length)
if word == 0:
print "I don't know any words that long!"
else:
break
except:
print "That's not a proper word length!"
word = string.lower(word)
# Setup list to hold correct letters
correct_so_far = []
for i in range(word_length):
correct_so_far.append("_")
# Setup some other variables
incorrect = []
guesses = 0
letters_guessed = 0
# Start main game loop.
print "\nI am thinking of a word",word_length,"letters long"
while letters_guessed < word_length:
# Print status of game on each pass.
print
print_status (correct_so_far,incorrect,guesses)
# Get guess from user
while 1:
guess = raw_input("Which letter would you like to try? ")
guess = string.lower(guess)
if len(guess) != 1:
print "You can only guess one letter at a time!"
elif guess in incorrect or guess in correct_so_far:
print "You've already tried that letter!"
elif guess not in ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]:
print "That's not a valid letter."
else:
break
guesses = guesses + 1
# Evaluate guess against word
letter_correct = 0
for i in range(word_length):
if guess == word[i]:
correct_so_far[i] = guess
letter_correct=1
letters_guessed = letters_guessed + 1
if letter_correct == 0:
incorrect.append(guess)
# Finish the game
print "\nWell done! You guessed the",word_length,"letter word",word,"in",guesses,"goes."
print "You guessed",len(incorrect),"letters incorrectly."
play_again = raw_input("Do you want to play again? (y/n) ",)
print "Goodybye!"
# End of Program
Cheers,
Matt.
More information about the Tutor
mailing list