Как исправить логику программы?

Нужно написать программу: Компьютер загадывает слово из файла, человек должен отгадать его по одной букве (похоже на поле чудес). Также должны быть счетчики ошибок, использованных букв и отгаданных букв. Вот в них и проблема! Когда ввожу букву, он добавляет её в счетчик ошибок и в счетчик использованных букв столько раз, сколько букв в загаданном слове! И никак не могу это исправить, потому что, наверное, не достаточно знаний, следовательно, не вижу где ошибка, следовательно, не знаю что надо гуглить))

class GameProgress(Enum):
WIN = 1
NOT_STARTED = 2
IN_PROGRESS = 3
LOST = 4





class Game:

    def __init__(self):
        self.allowed_mistakes = 7
        # self.counter_mistakes = 0
        self.used_letters = []
        self.guessed_letters = []
        self.game_status = GameProgress.NOT_STARTED
        self.word = " "

    def game_beggining(self):
        filename = "data\\WordsStockRus.txt"

        words = []
        with open(filename, encoding='utf8') as file:
            for line in file:
                words.append(line.strip('\n'))

        rand_index = random.randint(0, len(words) - 1)  # -1 - чтоб не выходить за границы
        self.word = words[rand_index]
        #self.guessed_letters = (False for _ in self.word)
        print(self.word)
        return self.word

    # open_any = True if open_any = self.word
    def game_process(self):
        Game.game_beggining(self)
        self.game_status = GameProgress.IN_PROGRESS
        # letter = input(f'Rhe computer made a word! Name the letter: ')
        number_of_letters = len(self.word)
        print(f'The word consists of {number_of_letters} letters')
        result = []

        while self.game_status == GameProgress.IN_PROGRESS:

            letter = input(f'The computer made a word! Name the letter: ')

            for i in range(len(self.word)):
                if letter == self.word[i]:
                    result.append(self.word[i])
                    self.guessed_letters.append(letter)
                    self.used_letters.append(sorted(letter))
                    print(f"You guessed the letter! ")
                else:
                    self.used_letters.append(letter)
                    self.allowed_mistakes -= 1
                    print(f"There is no such letter! Try again!\n You have {self.allowed_mistakes} attempts left")

            if self.allowed_mistakes == 0:
                print(f'You used all you attempts :(! You Lost! The hidden word {self.word}')
                self.game_status = GameProgress.LOST

            if result == self.word:
                print('Congratulation! You winner!!!')
                self.game_status = GameProgress.WIN
            print(f'Guessed letters ' + (' '.join(map(str, self.guessed_letters))))
            print(f"Used letters: " + (' '.join(map(str, self.used_letters))))
        return result

Результат выполнения


Ответы (3 шт):

Автор решения: Bor-is-luv

Считаю, что ошибка здесь

for i in range(len(self.word))

После того, как ввели букву, с ней сравнивается каждая буква загаданного слова. Очевидно, что большинство букв не будут совпадать с введённой, тогда сработает блок else.

Предлагаю попробовать такой вариант

from collections import Counter
if letter in self.word: # оператор in проверит, входит ли буква в слово
    result.append(letter)
    self.guessed_letters.append(letter)
    self.used_letters.append(sorted(letter))
    print(f"You guessed the letter! ")
else:
    self.used_letters.append(letter)
    self.allowed_mistakes -= 1
    print(f"There is no such letter! Try again!\n You have {self.allowed_mistakes} attempts left")
...
if Counter(result) == Counter(self.word)
...
→ Ссылка
Автор решения: Roman Onofreichuk
  1. self.guessed_letters += ["[ ]" for i in self.word]заполняет список предварительными значениями
  2. if letter in self.word: оператор in проверит, входит ли буква в слово
  3. for i in range(len(self.word)): if letter == self.word[i]: self.guessed_letters[i] = letter

    если буквы совпадают => [] заменяется отгаданной буквой

  4. self.used_letters = sorted(self.used_letters) сортирует массив использованных букв в алфавитном порядке, использование sort(letter) неверно ибо передается всего одна буква а должен массив. Думаю можно еще так sorted(self.used_letters.append(letter))

  5. if self.guessed_letters == list(self.word):если списки совпадают вы выиграли

Сам код:

import random
from enum import Enum
class GameProgress(Enum):
  WIN = 1
  NOT_STARTED = 2
  IN_PROGRESS = 3
  LOST = 4

class Game:

    def __init__(self):
        self.allowed_mistakes = 7
        # self.counter_mistakes = 0
        self.used_letters = []
        self.guessed_letters = []
        self.game_status = GameProgress.NOT_STARTED
        self.word = " "

    def game_beggining(self):
        filename = "WordsStockRus.txt"

        words = []
        with open(filename, encoding='utf8') as file:
            for line in file:
                words.append(line.strip('\n'))

        rand_index = random.randint(0, len(words) - 1)  # -1 - чтоб не 
        выходить за границы
        self.word = words[rand_index]
        #self.guessed_letters = (False for _ in self.word)
        print(self.word)
        return self.word

    # open_any = True if open_any = self.word
    def game_process(self):
        Game.game_beggining(self)
        self.game_status = GameProgress.IN_PROGRESS
        # letter = input(f'The computer made a word! Name the letter: ')
        number_of_letters = len(self.word)
        print(f"The computer made a word!")
        print(f"The word consists of {number_of_letters} letters")
        self.guessed_letters += ["[ ]" for i in self.word]

        while self.game_status == GameProgress.IN_PROGRESS:

            letter = input(f"Name the letter: ")
            if letter in self.word:
                self.used_letters.append(letter)
                print(f"You guessed the letter")

                for i in range(len(self.word)):
                  if letter == self.word[i]:
                    self.guessed_letters[i] = letter

                print(f"Guessed letters: {self.guessed_letters}")
            else:
                self.used_letters.append(letter)
                self.allowed_mistakes -= 1
                print(f"There is no such letter! Try again!\n You have {self.allowed_mistakes} attempts left")

            if self.allowed_mistakes == 0:
                print(f"You used all you attempts :(! You Lost! The hidden word {self.word}")
                self.game_status = GameProgress.LOST

            if self.guessed_letters == list(self.word):
                print("Congratulation! You winner!!!")
                self.game_status = GameProgress.WIN

                print(f"word was {self.word}")
                self.used_letters = sorted(self.used_letters)
                print(f"Used letters: " + (' '.join(map(str, self.used_letters))))
        return result

game = Game()
game.game_process()
→ Ссылка
Автор решения: Voleidol

Всем спасибо за помощь! Я решил проблему! Если кому-нибудь интересно, то вот, немного не доделанное, но рабочее решение:

class Game:

def __init__(self):
    self.allowed_mistakes = 7
    # self.counter_mistakes = 0
    self.used_letters = []
    self.guessed_letters = []
    self.game_status = GameProgress.NOT_STARTED
    self.word = " "

def game_beggining(self):
    filename = "data\\WordsStockRus.txt"

    words = []
    with open(filename, encoding='utf8') as file:
        for line in file:
            words.append(line.strip('\n'))

    rand_index = random.randint(0, len(words) - 1)  # -1 - чтоб не выходить за границы
    self.word = words[rand_index]
    #self.guessed_letters = ['-'] * len(self.word)
    self.word = list(self.word)
    #print(''.join(self.word))
    #print(''.join(self.guessed_letters))
    return self.word

def game_process(self):
    Game.game_beggining(self)
    self.game_status = GameProgress.IN_PROGRESS
    number_of_letters = len(self.word)
    print(f'The word consists of {number_of_letters} letters')
    #result = []
    self.guessed_letters = ['-'] * len(self.word)
    print(''.join(self.guessed_letters))

    while self.game_status == GameProgress.IN_PROGRESS:
        letter = input(f'The computer made a word! Name the letter: ')
        if letter in self.word:
            for i, symbol in enumerate(self.word):
                if letter == symbol:
                    self.guessed_letters[i] = symbol
                    print(' '.join(self.guessed_letters))
                else:
                    pass
        if letter not in self.word:
            self.allowed_mistakes -= 1
            print(f"There is no such letter! Try again! You have {self.allowed_mistakes} attempts left!")

        self.used_letters.append(letter)
        print(f"Used letters: " + (' '.join(self.used_letters)))

        if self.allowed_mistakes == 0:
            print(f"Your attempts the end! The hidden word  " + (' '.join(self.word)))
            self.game_status = GameProgress.LOST

        if '-' not in self.guessed_letters:
            print("Congratulation! You winner!!!".upper())
            self.game_status = GameProgress.WIN

    return self.guessed_letters
→ Ссылка