wordList = []

letters = []

import string

#Loads all words, and returns those with numLetters letters.
def loadWords(numLetters, filename):
    something = open(filename, "r")

    data = something.readlines()
    something.close()

    newWords = []
    for word in data:
        word= word.lower()
        newWord = ""
        #Strip all non-letters, including whitespace
        for letter in word:
            if letter in string.letters:
                newWord = newWord + letter
                
        newWords.append(newWord)

    # Only include words longer than 2 letters and
    # shorter than 10 letters...
    newList = []
    for word in newWords:
        if len(word) == numLetters:
            newList.append(word)
    return(newList)

def pickNumWords():
    wl_str = raw_input("How many letters?")
    try:
       numLetters = int(wl_str)
       if numLetters < 3 or numLetters > 10:
           print "Pick a number between 3 and 10! Try again!"
           num = pickNumWords()
           return(num)
    except:
        print "that wasn't a valid number! Try again!"
        num = pickNumWords()
        return(num)

    #Everything is OK
    return numLetters
    
def countLetters(word, letter):
    count = 0
    for item in word:
        if item == letter:
            count = count + 1
    return count
def countLetterFreq(wordList, letter):
    wordSize = len( wordList[0] )

    aList = []
    for item in range(wordSize):
        aList.append(0)

    for word in wordList:
        index = 0
        while index < wordSize:
            wl = word[index]
            if wl == letter:
                aList[index] = aList[index] + 1
            index = index + 1
    return aList
    
def printLetters():
    print "Letters so far:",
    for item in letters:
        print item,
    print
    
def hangman():
    global wordList
    global letters

    numLetters = pickNumWords()

    for x in range(numLetters):
        letters.append("_")
    

    guesses = numLetters * 2
    
    print "You have", guesses, "guesses left"

    wordList = loadWords(numLetters, "6of12.txt")
    print "DEMO: We have", len(wordList), "words!"

    while guesses > 0:
        printLetters()
        letter = raw_input("Enter your letter guess:")

        newList = filter( lambda w: letter[0] not in w, wordList)

        print "DEMO: newList has", len(newList), "words left"

        if len(newList) > 0:
            wordList = newList
            guesses = guesses -1

            print "Sorry, the word *I* was thinking of, doesn't have any letters", letter[0], " in it!"
            print "You  have ", guesses, "guesses left"
        else:
            #Throw out any words with two of the same letter!
            newList = []
            for item in wordList:
                if not (countLetters(item, letter[0]) > 1):
                    newList.append(item)
            if len(newList) > 0:
                wordList = newList
            
            letterFreq = countLetterFreq(wordList, letter[0])
            maxNum = max(letterFreq)
            maxIdx = letterFreq.index(maxNum)
            newList = filter( lambda w: w[maxIdx] == letter[0], wordList)
            wordList = newList
            print "DEMO:", wordList
            
            letters[maxIdx] = letter[0]
            print "Congratulations! You found a letter!"

        #did they win? Yah, right...
        if "_" not in letters:
            print "\n\nCONGRATULATIONS! You won!"
            guesses = 0
        
    if "_" in letters:
       print "So sorry! You lost. The word I was thinking of was:"
       print wordList[0]
    
        
    
    

hangman()
