import string from functools import reduce lettersGuessed = "" wordList = [] def loadWords(filename): f = open(filename, "r") data = f.readlines() f.close() wordList = [] for word in data: newWord = "" for letter in word.lower(): if letter in string.ascii_lowercase: newWord = newWord + letter wordList.append(newWord) return wordList def pickNumber(): numLettersStr = input("How many letters?") try: numLetters = int(numLettersStr) except: print("not a valid number, try again!") num = pickNumber() return(num) if numLetters < 3 or numLetters > 10: print("Please pick a number between 3 and 10!") num = pickNumber() return(num) else: return numLetters #This function goes through the wordlist, counting #how many words have a specifed letter at a specified spot. def countLetterSpots(letter, spot, wordList): counter = 0 for word in wordList: if word[spot] == letter: counter = counter + 1 return counter #Given a word and a letter, this helper function tells you how many #times the letter appears in that word. def countLetters(letter, word): count = 0 for item in word: if item == letter: count = count + 1 return count def pickALetter(): global lettersGuessed print("Letters already guessed:", lettersGuessed) letter = input("Guess a letter:") if letter in lettersGuessed: print("You already guessed that one! Try again!") return pickALetter() lettersGuessed= lettersGuessed + letter lettersGuessed = str( reduce( lambda x,y: x+y, sorted(lettersGuessed)) ) return letter def hangman(): global wordList global lettersGuessed lettersGuessed = "" wordList = loadWords("6of12.txt") print("We read have", len(wordList), "total words!") numLetters = pickNumber() ourSpots = "" for x in range(numLetters): ourSpots = ourSpots + "_" #Only keep words of the specified length! wordList =list( filter( lambda w: len(w) == numLetters, wordList) ) print("DEMO: We have", len(wordList), "of ", numLetters, "length!") guesses = numLetters * 3 while( guesses > 0): print(ourSpots) letter = pickALetter() guesses = guesses - 1 #Try removing all words with that letter. excludeList = list( filter( lambda w: letter[0] not in w, wordList) ) #Try keeping all words with only one of those letters! noDupesList = list( filter( lambda x: countLetters(letter[0],x) == 1, wordList)) #Which option leaves us more words? if len(excludeList) > len(noDupesList) and len(excludeList) > 0: #We disavow all knowledge of any words with that letter in it! wordList = excludeList print ("Sorry, my word does not have", letter[0], "in it!") print("DEMO: we now have:", len(wordList), "words left...") print("You now have ", guesses, "Guesses left!") elif len(noDupesList) >= len(excludeList) and len(noDupesList) > 0: wordList = noDupesList #Only consider words with one of that letter! #Reveal the letter spot that appears in the most words! aList = [] for x in range(numLetters): num = countLetterSpots(letter[0], x, wordList) aList.append(num) print("DEMO: Spots are:", aList) spotNum = max(aList) spotIdx = aList.index(spotNum) ourSpots = ourSpots[0:spotIdx] + letter[0] + ourSpots[spotIdx+1:] wordList = list( filter( lambda w: letter[0] == w[spotIdx], wordList) ) print("DEMO: we now have:", len(wordList), "words left...") else: #Oh No, we must be down to one word! print("DEMO: Oh no, you got us boxed in!") print("word is:", wordList[0]) #If the letter in in the word, play it straight! for i in range(len(wordList[0])): if letter == wordList[0][i]: ourSpots = ourSpots[0:i] + letter[0] + ourSpots[i+1:] #Check if the user has won! if "_" not in ourSpots: print("Congratulations! You won!") print("Our word was:", wordList[0]) guesses = 0; #Exit the loop! #After the while loop, we have either won or lost...find out if we have #won (the user has lost) if "_" in ourSpots: print("sorry, you lost, our word was:", wordList[0])