#python #if-statement #while-loop #counter
#python #оператор if #цикл while #счетчик
Вопрос:
Я хочу создать игру hangman python, поэтому я создал более простую часть игры. Идея игры состоит в том, чтобы угадать буквы в случайно сгенерированном слове. Вот что у меня есть до сих пор. Я перечислил проблему и вопросы, которые у меня есть внизу.
import random
words = ['holiday', 'american', 'restaurant', 'computer', 'highschool', 'programming']
random_word = random.choice(words)
count = 0
while True: #repeatedly asks you to guess the letter in a random word
guess = str(input("Guess a letter: "))
guess = guess.lower()
if guess in random_word: #checks if the letter you input is in the random generated word
print("Yay, its in the word")
else:
count = 1
print("Not in the word, attempts: %d" % count)
if count > 5:
print("You have reached max attempts")
print("Sorry, but hangman died! You lose")
break
else:
continue
Проблема, с которой я сталкиваюсь: когда пользователь угадывает букву, он может угадывать ее снова бесконечное количество раз. Как я могу сделать так, чтобы пользователь не мог повторно угадывать одну и ту же букву?
Есть ли способ убедиться, что пользователь не угадывает ту же букву? Это может быть проблемой в реальной игре hangman, когда есть несколько одинаковых букв. Любая помощь / отзывы приветствуются, спасибо!
Комментарии:
1. Затем вам либо понадобится список угаданных букв, либо создайте копию текущего слова и удалите каждую угаданную букву из этой копии.
2. Как бы вы это сделали, когда играете вживую лично, на бумаге? Если на то пошло: когда кто-то в реальной игре hangman правильно угадывает букву, что вы делаете (как вы размечаете бумагу), что ваша программа еще не делает? Подумайте о ведении записей, которые необходимо выполнить. Вы никогда не можете ожидать, что сможете запрограммировать что-либо, что вы не можете сначала четко описать простыми словами вашего родного языка.
3. Как упоминал Мартинен, вы можете иметь список, подобный приведенному ниже, и добавлять к нему каждое предположение, чтобы отслеживать уже введенные слова и проверять, есть ли угаданное слово уже в этом списке.
guessed_words = [] guessed_words.append(guess)
Для каждого предположения вы можете проверить, находится ли предположение в списке guessed_words или нет, как показано ниже (в цикле while):if guess in guessed_words: continue else: print('You already guessed this word.')
4. согласен с @KarlKnechtel. Подумайте о проблеме и будьте очень точны в этом. Затем подумайте о решении, а затем о коде. В этом смысле этот вопрос связан с python так же, как это предложение связано с английским.
Ответ №1:
Вот один из способов сделать это.
import random
words = ['holiday', 'american', 'restaurant', 'computer', 'highschool', 'programming']
random_word = random.choice(words)
count = 0
guess_list = []
while True: #repeatedly asks you to guess the letter in a random word
guess = str(input("Guess a letter: "))
guess = guess.lower()
if guess not in guess_list:
if guess in random_word: #checks if the letter you input is in the random generated word
print("Yay, its in the word")
else:
count = 1
print("Not in the word, attempts: %d" % count)
if count > 5:
print("You have reached max attempts")
print("Sorry, but hangman died! You lose")
break
else:
print("You have already guessed {}. Try again".format(guess))
print(set(guess_list))
guess_list.append(guess)
Пример вывода (word — компьютер):
Guess a letter: c
Yay, its in the word
Guess a letter: e
Yay, its in the word
Guess a letter: e
You have already guessed e. Try again
{'e', 'c'}
Guess a letter: e
You have already guessed e. Try again
{'e', 'c'}
Guess a letter: w
Not in the word, attempts: 1
Guess a letter: m
Yay, its in the word
Guess a letter: m
You have already guessed m. Try again
{'w', 'm', 'e', 'c'}
Guess a letter:
Примечания:
- Создается guess_list, который ведет учет всех догадок.
- После каждого угадывания буква добавляется в список.
- Когда пользователь повторяет предположение, он получает предупреждение. Мы используем set, поэтому отображаются только уникальные элементы в списке угадывания.
Код можно доработать, но он должен выполнять свою работу.
Комментарии:
1. Большое вам спасибо за этот новый подход. Я новый программист, поэтому мне определенно нужно больше читать документацию. Я буду продолжать в том же духе, спасибо.
2. Вы пробовали запускать приведенный выше код? Делает ли это то, что вы ожидали?
3. Да, большое вам спасибо за вашу помощь. Я пробую разные версии, но думаю, что я на правильном пути
Ответ №2:
В зависимости от слова, вам может потребоваться разрешить несколько догадок, если буква появляется более одного раза. (это может быть не вашим требованием. Не знаком с игрой.)
Подход
Что вам нужно, так это хранилище, которое отслеживает количество вхождений каждой буквы в слове.
Что-то вроде:
letterCounts = Counter("hello") # word: 'hello' => {'h': 1, 'e': 1, 'l': 2, 'o': 1}
Здесь я использую коллекцию счетчиков.
Затем вы можете уменьшить количество угаданной буквы
if guesses_letter in list(letterCounts.elements()):
if (letterCounts[guessed_letter] > 0):
letterCounts[guessed_letter] -= 1
else:
# the letter can't be repeated now. do the needful here.