Как исправить логику программы?
Нужно написать программу: Компьютер загадывает слово из файла, человек должен отгадать его по одной букве (похоже на поле чудес). Также должны быть счетчики ошибок, использованных букв и отгаданных букв. Вот в них и проблема! Когда ввожу букву, он добавляет её в счетчик ошибок и в счетчик использованных букв столько раз, сколько букв в загаданном слове! И никак не могу это исправить, потому что, наверное, не достаточно знаний, следовательно, не вижу где ошибка, следовательно, не знаю что надо гуглить))
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 шт):
Считаю, что ошибка здесь
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)
...
self.guessed_letters += ["[ ]" for i in self.word]заполняет список предварительными значениямиif letter in self.word:оператор in проверит, входит ли буква в словоfor i in range(len(self.word)): if letter == self.word[i]: self.guessed_letters[i] = letterесли буквы совпадают => [] заменяется отгаданной буквой
self.used_letters = sorted(self.used_letters)сортирует массив использованных букв в алфавитном порядке, использованиеsort(letter)неверно ибо передается всего одна буква а должен массив. Думаю можно еще такsorted(self.used_letters.append(letter))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()
Всем спасибо за помощь! Я решил проблему! Если кому-нибудь интересно, то вот, немного не доделанное, но рабочее решение:
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
