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):
        for i in range(0, 20): print
        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
