Игра в угадывание букв Python

#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:  
  

Примечания:

  1. Создается guess_list, который ведет учет всех догадок.
  2. После каждого угадывания буква добавляется в список.
  3. Когда пользователь повторяет предположение, он получает предупреждение. Мы используем 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.