в моем коде, когда я запускаю это, и, например, если слово запускается, то если вы наберете 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', но вместо этого он умножает его на длину пробега
Вы просмотрели мой ответ? Я вижу, вы выбрали другой ответ в качестве приемлемого ответа. если вы считаете, что это неправильно, пожалуйста, прокомментируйте свое мнение, почему
Вы проверяете, была ли буква уже угадана в цикле, поэтому она будет повторяться для каждой буквы слова, начиная с первого вхождения буквы.
В примере «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)
Я считаю, что вы без причины проголосовали за мой пост. если нет, пожалуйста, скажите мне, чтобы я забрал свой отрицательный голос.
Я не минусовал ваш пост и не понимаю, почему кто-то его минусует. Единственная проблема, которая мне приходит в голову, заключается в том, что вы могли бы свести код к меньшему примеру с той же логикой (минимально воспроизводимый пример). Но поскольку ваш код довольно короткий, я не ожидаю, что он будет необходим.
Пожалуйста, немного отредактируйте свой ответ, чтобы мой отзыв отрицательного голоса вступил в силу. мой код немного длиннее, потому что я добавил подсказку и вышел, а также включил всю игру. В любом случае спасибо.
Извините, я принял вас за автора вопроса. Но я тоже не отрицал ваш ответ.
Но я полагаю, что кто-то проголосовал против, потому что ваш ответ содержит ненужные дополнения, о которых не просили и которые не должны быть (StackOverflow не является службой написания кода). Но как плюс: вы предоставили ссылку на библиотеку палача.
по-видимому, отрицательный голос не будет возвращен, если основной пост не будет отредактирован. Я пробовал несколько раз. Извините за отрицательное голосование, когда я писал свой ответ, я увидел уведомление о том, что кто-то опубликовал ответ, затем я быстро отправил свой и увидел, что он также был выбран как правильный ответ, и мой ответ быстро получил отрицательную оценку! поверьте мне даже без повторного тестирования. Я подумал про себя, как можно опубликовать ответ, а ОП проверить его через минуту и выбрать как правильный ответ? поэтому я подумал, может быть, это ты. Иисус!
О чем ты говоришь? вы проверили мои коды? он работает совершенно нормально и показывает предыдущие предположения так, как и должно быть. Я добавил еще два варианта, чтобы помочь сообществу, потому что это игра.
Извините, меня смутил переключенный порядок display = ""
и блок, проверяющий, угадана ли буква.
Давайте продолжим обсуждение в чате.
Теперь мой отрицательный голос успешно отозван. не знаю, почему это заняло несколько минут
Было бы хорошо, если бы вы упомянули, откуда мы можем получить соответствующие библиотеки .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)
, когда анализы будут готовы. приятной игры!!
Для тех, кто видит мой ответ, отрицательное голосование произошло через секунду после того, как я опубликовал свой ответ. кто-то минусует меня без профессиональной причины, вы можете протестировать игру самостоятельно. Спасибо.
Создайте дополнительную переменную для хранения уже заданных предположений и проверьте, есть ли в ней новое предположение (и выведите сообщение, если да), перед циклом for.