Lesson 19 - How accurate our Hangman algorithm is?

posted Mar 15, 2018, 8:04 AM by Attila Lengyel
import word_dict, random

def drawhangman(missedGuesses):
  if missedGuesses <= 0: return
  print("     _____________")
  if missedGuesses > 1:
    print("      |          |")
  else: print("      |")
  if missedGuesses > 2:
    print("      |          O")
  else: print("      |")
  if missedGuesses > 3:
    print("      |         /|\\")
  else: print("      |")
  if missedGuesses > 4:
    print("      |          |")
  else: print("      |")
  if missedGuesses > 5 :
    print("      |         / \\")
  else: print("      |")
  print("      |")
  print("      |")
  print("      |_____________")
  
def lengthwords(searchspace, length):
  returnspace = []
  for w in searchspace:
    if len(w) == length:
      returnspace.append(w.lower())
      
  return returnspace

def match(searchspace, pattern):
  returnspace = []
  for w in searchspace:
    add = True
    for x in range(0, len(w)):
      if pattern[x] != "_" and w[x] != pattern[x]:
          add = False
          break
    if add:
      returnspace.append(w)
  return returnspace

def eliminatemissed(searchspace, missedletters):
  returnspace = []
  for w in searchspace:
    add = True
    for l in w:
      if missedletters.find(l) != -1:
        add = False
        break
    if add:
      returnspace.append(w)
  return returnspace

def stat(searchspace, pattern):
  abc = "abcdefghijklmnopqrstuvwxyz"
  lstat = {}
  for c in abc:
    lstat[c] = 0
  for w in searchspace:
    letters = ""
    for c in w:
      if letters.find(c) == -1:
        letters += c
    for c in letters:
      lstat[c] += 1
  count = 0
  letter = ""
  for c in abc:
    if pattern.find(c) == -1:
      if lstat[c] > count:
        count = lstat[c]
        letter = c
  return letter

def guess(wordlength, pattern, eliminatedletters):
  space = lengthwords(word_dict.db, wordlength)
  space = match(space, pattern)
  space = eliminatemissed(space, eliminatedletters)
  lstat = stat(space, pattern)
  return lstat

def play(word, draw):
  
  good_letters = ""
  eliminated_letters =""
  word_dash = ""
  for x in range(0, len(word)):
    word_dash += "_ "
  if draw: print (word_dash)
  
  missed_guesses = 0
  
  while missed_guesses < 7 and word_dash.find("_") != -1:
    automatedguess = guess(len(word), word_dash.replace(' ',''), eliminated_letters)
    if draw: print("Let me guess:", automatedguess)
    if len(automatedguess) == 0: missed_guesses += 1
    if word.find(automatedguess) > -1:
      if draw: print("Correct guess!")
      good_letters += automatedguess
    else:
      eliminated_letters += automatedguess
      if draw: print("Wrong guess!")
      missed_guesses = missed_guesses + 1
      if draw: drawhangman(missed_guesses)
    word_dash = ""
    for x in range(0, len(word)):
      if good_letters.find(word[x]) > -1:
        word_dash += word[x] + " "
      else:
        word_dash += "_ "
    if draw: print(word_dash)
  if draw: print("The word is", word)
  return missed_guesses

#This is the main program

space = lengthwords(word_dict.db, 9)
totalgames = 0
lostgames = 0
for w in space:
  totalgames += 1
  guesses = play(w, False) 
  if guesses == 7: lostgames += 1
  print(w, guesses)

print(totalgames, lostgames)

size = len(word_dict.db)
print("Let's play Hangman")
question = input("Do you want to pick a word? (yes/no):")
if question == "yes":
  word = input("Give me a word:")
  play(word, True)
else:
  wordindex = random.randint(0, size)
  randomword = word_dict.db[wordindex]
  randomword = randomword.lower()
  play(randomword, True)
Comments