Повтор уже угаданной буквы при отображении уже угаданной буквы в Python

в моем коде, когда я запускаю это, и, например, если слово запускается, то если вы наберете r, а затем снова r в следующем поле ввода, оно будет уже угадано * len выбранного_слова

я тоже новичок в программировании, так что простите меня, если я тупой

import random
from hangman_words import word_list
from hangman_art import logo
from hangman_art import stages
# TODO-1: - Update the word list to use the 'word_list' from hangman_words.py

lives = 6

# TODO-3: - Import the logo from hangman_art.py and print it at the start of the game.

chosen_word = random.choice(word_list)
print(logo)
print(chosen_word)

placeholder = ""
word_length = len(chosen_word)
for position in range(word_length):
    placeholder += "_"
print("Word to guess: " + placeholder)

game_over = False
correct_letters = []

while not game_over:

    # TODO-6: - Update the code below to tell the user how many lives they have left.
    print(f"**************************** {lives} /6 LIVES LEFT****************************")
    guess = input("Guess a letter: ").lower()

    # TODO-4: - If the user has entered a letter they've already guessed, print the letter and let them know.

    display = ""

**    for letter in chosen_word:
        if letter == guess:
            display += letter
            correct_letters.append(guess)
        elif letter in correct_letters:
            display += letter
        else:
            display += "_"
        if guess in display:
            print(f"You've already guessed {guess}!")
    print("Word to guess: " + display)**

    # TODO-5: - If the letter is not in the chosen_word, print out the letter and let them know it's not in the word.
    #  e.g. You guessed d, that's not in the word. You lose a life.

    if guess not in chosen_word:
        lives -= 1

        if lives == 0:
            game_over = True

            # TODO 7: - Update the print statement below to give the user the correct word they were trying to guess.
            print(f"***********************YOU LOSE**********************")

    if "_" not in display:
        game_over = True
        print("****************************YOU WIN****************************")

    # TODO-2: - Update the code below to use the stages List from the file hangman_art.py
    print(stages[lives])

я попытался сделать так, чтобы мой код выводил, например, --> если я введу r во второй раз в слове run, тогда будет сказано, что вы уже угадали 'r', но вместо этого он умножает его на длину пробега

Создайте дополнительную переменную для хранения уже заданных предположений и проверьте, есть ли в ней новое предположение (и выведите сообщение, если да), перед циклом for.

Michael Butscher 11.08.2024 09:31

Вы просмотрели мой ответ? Я вижу, вы выбрали другой ответ в качестве приемлемого ответа. если вы считаете, что это неправильно, пожалуйста, прокомментируйте свое мнение, почему

hamflow 11.08.2024 10:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы проверяете, была ли буква уже угадана в цикле, поэтому она будет повторяться для каждой буквы слова, начиная с первого вхождения буквы.

В примере «run» двойной ввод «r» приведет к печати сообщения три раза. Для слов типа «переполнение» оно будет напечатано пять раз, поскольку для первых трёх букв это условие не выполняется: guess in display

Чтобы сообщение не печаталось более одного раза, вы можете просто вынести блок из цикла for, и логика останется той же, поскольку она не зависит от letter:

display = ""

for letter in chosen_word:
    if letter == guess:
        display += letter
        correct_letters.append(guess)
    elif letter in correct_letters:
        display += letter
    else:
        display += "_"

if guess in display:
    print(f"You've already guessed {guess}!")

Но это не сработает с буквами, которых нет в слове. Чтобы отслеживать угаданные буквы, вы можете определить переменную перед основным циклом:

guessed_letters = set()

При этом используется набор, который похож на список, но неупорядочен и не может иметь повторяющихся записей.

Внутри цикла вы можете просто проверить, находится ли предположение в этом наборе:

if guess in guessed_letters:
    print(f"You've already guessed {guess}!")
else:
    guessed_lettters.add(guess)

Я считаю, что вы без причины проголосовали за мой пост. если нет, пожалуйста, скажите мне, чтобы я забрал свой отрицательный голос.

hamflow 11.08.2024 10:15

Я не минусовал ваш пост и не понимаю, почему кто-то его минусует. Единственная проблема, которая мне приходит в голову, заключается в том, что вы могли бы свести код к меньшему примеру с той же логикой (минимально воспроизводимый пример). Но поскольку ваш код довольно короткий, я не ожидаю, что он будет необходим.

oskar 11.08.2024 10:24

Пожалуйста, немного отредактируйте свой ответ, чтобы мой отзыв отрицательного голоса вступил в силу. мой код немного длиннее, потому что я добавил подсказку и вышел, а также включил всю игру. В любом случае спасибо.

hamflow 11.08.2024 10:25

Извините, я принял вас за автора вопроса. Но я тоже не отрицал ваш ответ.

oskar 11.08.2024 10:27

Но я полагаю, что кто-то проголосовал против, потому что ваш ответ содержит ненужные дополнения, о которых не просили и которые не должны быть (StackOverflow не является службой написания кода). Но как плюс: вы предоставили ссылку на библиотеку палача.

oskar 11.08.2024 10:31

по-видимому, отрицательный голос не будет возвращен, если основной пост не будет отредактирован. Я пробовал несколько раз. Извините за отрицательное голосование, когда я писал свой ответ, я увидел уведомление о том, что кто-то опубликовал ответ, затем я быстро отправил свой и увидел, что он также был выбран как правильный ответ, и мой ответ быстро получил отрицательную оценку! поверьте мне даже без повторного тестирования. Я подумал про себя, как можно опубликовать ответ, а ОП проверить его через минуту и ​​выбрать как правильный ответ? поэтому я подумал, может быть, это ты. Иисус!

hamflow 11.08.2024 10:31

О чем ты говоришь? вы проверили мои коды? он работает совершенно нормально и показывает предыдущие предположения так, как и должно быть. Я добавил еще два варианта, чтобы помочь сообществу, потому что это игра.

hamflow 11.08.2024 10:32

Извините, меня смутил переключенный порядок display = "" и блок, проверяющий, угадана ли буква.

oskar 11.08.2024 10:35

Давайте продолжим обсуждение в чате.

oskar 11.08.2024 10:51

Теперь мой отрицательный голос успешно отозван. не знаю, почему это заняло несколько минут

hamflow 11.08.2024 10:56

Было бы хорошо, если бы вы упомянули, откуда мы можем получить соответствующие библиотеки .py для палача, которые можно найти здесь. вот исправленные коды. вам просто нужно было ввести условие, если предположение == отображает буквы в отдельном цикле for до того, как основной цикл for начнет действовать, а затем после этого снова сделать дисплей пустым с помощью display = "".

import random
from hangman_words import word_list
from hangman_art import logo
from hangman_art import stages

# TODO-1: - Update the word list to use the 'word_list' from hangman_words.py

lives = 6

# TODO-3: - Import the logo from hangman_art.py and print it at the start of the game.

chosen_word = random.choice(word_list)
print(logo)
print(chosen_word)
print('=============================')
print(f"type QUIT to exit the game")
print(f"type HINT to receive a hint")
print('=============================')
placeholder = ""
word_length = len(chosen_word)
for position in range(word_length):
    placeholder += "_"
print("Word to guess: " + placeholder)

game_over = False
quit = False
correct_letters = []
display = ""


# for hints, returning a not displayed correct letter
def hint(str1,str2): # str1 and str2 are correct letters and chosen word
    str1 = "".join(str1) # making sure all letters are into a single word
    str2 = "".join(str2)
    str1 = str(str1) # making sure they are strings
    str2 = str(str2)
    notdisplayed = []
    set1 = set(list(str1))
    set2 = set(list(str2))
    setout = set1 & set2
    setout = list(setout)
    wholeset = str1 + str2
    for s in wholeset:
        if s not in setout:
            notdisplayed.append(s)        
    
    return random.choice(notdisplayed)

while not game_over and not quit:

    # TODO-6: - Update the code below to tell the user how many lives they have left.
    print(f"**************************** {lives} /6 LIVES LEFT****************************")
    guess = input("Guess a letter: ").lower()
    if guess == 'quit':
        quit = True
    if guess == 'hint':
        guess = hint(correct_letters, chosen_word)
        print('hint is', guess)
    # TODO-4: - If the user has entered a letter they've already guessed, print the letter and let them know.

    for letter_ in display:
        if letter_ == guess:
            print(f"You've already guessed {guess}!")
            break
    display = ""    
    for letter in chosen_word:
        if letter == guess:
            display += letter
            correct_letters.append(guess)
        elif letter in correct_letters:
            display += letter
        else:
            display += "_"
    print("Word to guess: " + display)
    

    # TODO-5: - If the letter is not in the chosen_word, print out the letter and let them know it's not in the word.
    #  e.g. You guessed d, that's not in the word. You lose a life.

    if guess not in chosen_word:
        lives -= 1

        if lives == 0:
            game_over = True

            # TODO 7: - Update the print statement below to give the user the correct word they were trying to guess.
            print(f"***********************YOU LOSE**********************")

    if "_" not in display:
        game_over = True
        print("****************************YOU WIN****************************")

    # TODO-2: - Update the code below to use the stages List from the file hangman_art.py
    print(stages[lives])

Я также добавил опции quit и hint. набрав quit, просто выйдите из игры, пока hint покажет нужную букву. вы можете легко ограничить количество подсказок, внеся небольшие изменения, если хотите немного расстроить игроков. Не забудьте спрятать print(chosen_word), когда анализы будут готовы. приятной игры!!

Для тех, кто видит мой ответ, отрицательное голосование произошло через секунду после того, как я опубликовал свой ответ. кто-то минусует меня без профессиональной причины, вы можете протестировать игру самостоятельно. Спасибо.

hamflow 11.08.2024 10:45

Другие вопросы по теме