Skip to content

Instantly share code, notes, and snippets.

@stephenroller
Created July 19, 2012 13:11
Show Gist options
  • Save stephenroller/3143809 to your computer and use it in GitHub Desktop.
Save stephenroller/3143809 to your computer and use it in GitHub Desktop.
Simple Hangman Implementation
from __future__ import with_statement
# +-----+
# | |
# | O
# | -|-
# | / \
# |
# -----
#
# h__ __ _e__
#
# x t
import re
from sys import stdin
def get_word():
import random
f = open("/usr/share/dict/words")
words = f.readlines()
retval = random.choice(words)[:-1].lower()
f.close()
return retval
def play():
word = get_word()
def minsp(minimum, char, amount):
if amount > minimum:
return char
return ' '
def draw_hangman(misses):
print chr(27) + "[2J"
print ' +-----+'
print ' | |'
print ' | ', minsp(0, 'O', misses)
print ' | %s%s%s%s%s' % (minsp(6, '+', misses),
minsp(2, '-', misses),
minsp(1, '|', misses),
minsp(3, '-', misses),
minsp(7, '+', misses))
print ' | %s%s %s%s' % (minsp(8, '_', misses),
minsp(4, '/', misses),
minsp(5, '\\', misses),
minsp(9, '_', misses))
print ' |'
print ' -----------'
def replace_with_blanks(word, guesses):
subst = lambda x: x in guesses and x or '_'
return ''.join(subst(l) for l in word)
guesses = []
bad_guesses = []
withblanks = replace_with_blanks(word, guesses)
while True:
draw_hangman(len(bad_guesses))
print
print withblanks
print "bad guesses: %s" % ' '.join(bad_guesses)
print "guess? ",
c = stdin.readline()[0].lower()
if c in guesses or not re.match(r'[a-z]', c):
continue
guesses.append(c)
bad_guesses = filter(lambda x: x not in word, guesses)
withblanks = replace_with_blanks(word, guesses)
if len(bad_guesses) > 5:
draw_hangman(len(bad_guesses))
return "lose", word
if word == withblanks:
return "win", word
if __name__ == '__main__':
try:
while True:
print '\nYou %s. The word was "%s". Play again (y/N)? ' % play()
inpt = stdin.readline().lower()[0]
if inpt != 'y':
break
except KeyboardInterrupt:
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment