Skip to main content
Code Review

Return to Revisions

2 of 2
deleted 8 characters in body
hjpotter92
  • 8.9k
  • 1
  • 26
  • 50

python hangman solver

I wrote a program that read a csv file that contain 100 rows that look like:

1;S****L;SCHOOL
2;*A*G*A*;HANGMAN

then try to guess the letters like in a hangman game. My scope is to count every right and wrong letters and then sum them up. The code works fine, I get around 1670 right + wrong attempts to guess the letters. My approach was to create a dictionary in which I store all the letters from the alphabet and read every words from the file then sum every appearance of a letter and store them in the dictionary. Somethin like

{
 "A" : 30,
 "B" : 40
}

Then I sort the dict based on every letter occurrence and first try to guess the letter with the most apparace.

My question. Is something that I can improve in order to get a smaller number of attempts?

import csv
INPUT_FILE = "words.csv"
def oppenFile(): # function to read the file
 with open(INPUT_FILE, "r", encoding="utf-8") as words:
 reader = list(csv.reader(words, delimiter=";"))
 return reader
def letterCount(): # function that count every the letter in the file and return a dict: {A : 2}
 letters = dict.fromkeys("QWERTYUIOPĂÎASDFGHJKLȘȚÂZXCVBNM", 0)
 words = oppenFile()
 for w in range(len(words)):
 for l in list(words[w][2]):
 if l not in list(words[w][1]):
 letters[l] += 1
 return letters
def checkLetters(word, wholeWord, letters): # function that solve a word return the number of right + wrong attempts
 attempts = 0
 for letter, key in letters.items():
 if letter in wholeWord and letter not in word:
 attempts += 1
 index = [i for i, lit in enumerate(wholeWord) if lit == letter]
 letters[letter] -= len(index)
 for j in range(len(index)):
 word = word[:index[j]] + letter + word[(index[j] + 1):]
 elif '*' not in word:
 break
 else:
 attempts += 1
 return attempts
def hangman():
 words = oppenFile()
 numberOfAttempts = 0
 letters = letterCount()
 for i in range(len(words)):
 letters = dict(sorted(letters.items(), key=lambda x: x[1], reverse=True)) # sort the dict
 numberOfAttempts += checkLetters(words[i][1], words[i][2], letters)
 print(f"{numberOfAttempts} right + wrong attempts")
if __name__ == "__main__":
 hangman()
tibi
  • 43
  • 4
lang-py

AltStyle によって変換されたページ (->オリジナル) /