Игра Hangman, меняющая слова на протяжении всей игры

#python #function #loops

#python #функция #циклы

Вопрос:

Пока я создаю word_blank_list (список с пробелами для пользователя) для choose_word, слово изменяется и не распознается, поскольку это новое слово, когда я пытаюсь удалить его из списка. Код и сообщение об ошибке приведены ниже. Остальная часть кода работает. Это последний шаг. Спасибо!

 #Choose a word
import urllib.request
import random

def choose_word():
  word_file = 'https://raw.githubusercontent.com/lizzierobinson2/coolcode/master/list of words'
  my_file = urllib.request.urlopen(word_file)
  chosen_word = my_file.read()
  chosen_word = chosen_word.decode("utf-8")
  list_of_words = chosen_word.split("n")
  for x in range(1):
    return random.choice(list_of_words)
    break
  
print('Welcome to the game hangman! The blanks of a word I have chosen are printed below. :)')

  #Create a list that holds the word and makes each letter a string
word_blank_list = [choose_word()]
length = len(choose_word())

for spaces in range(length):
  word_blank_list.append('_')

#word_blank_list.remove(choose_word())
print(word_blank_list)

word_list = [choose_word()]
string = ''
string = string.join(word_list)

word_string = list(string)

  #Define print_body and say what happens when the letter is not in the word
def print_body(number):
  if number == 1:
    print("  |/  ")
  if number == 2:
    print("  |/  ")
    print("  (_)  ")
  if number == 3:
    print("  |/  ")
    print("  (_)  ")
    print("   |   ")
    print("   |   ")
  if number == 4:
    print("  |/  ")
    print("  (_)  ")
    print("  /|   ")
    print(" / |   ")
  if number == 5:
    print("  |/  ")
    print("  (_)  ")
    print("  /|  ")
    print(" / |  ")
  if number == 6:
    print("  |/  ")
    print("  (_)  ")
    print("  /|  ")
    print(" / |  ")
    print("  /    ")
    print(" /     ")
  if number == 7:
    print("  |/  ")
    print("  (_)  ")
    print("  /|  ")
    print(" / |  ")
    print("  /   ")
    print(" /    ")

num_of_tries = 0

while True:
  ask_guess = None
  #Ask the user for a letter
  letter_ask = input('Enter a letter. ').lower()
  #printing 2 of same letter
  placement = []
  guess = letter_ask
  for x in range(len(word_string)):
    if word_string[x] == guess:
      placement.append(x)
  for x in placement:
    word_blank_list[x] = guess    

  if letter_ask not in word_string:
    num_of_tries = num_of_tries   1
    print('This letter is not in the word. A part of the body has been drawn. Try again.')
    print_body(num_of_tries)
       
    #What happens when the letter is in the word
  if letter_ask in word_string:
    location = word_string.index(letter_ask)
    word_blank_list[location] = letter_ask
    print(word_blank_list)
    ask_guess = input('Would you like to guess what the word is? ').lower()
    
    if ask_guess == 'yes':
      guess = input('Enter your guess. ').lower()   
         
    if ask_guess == 'no':
      continue

    #How to stop the game
  if num_of_tries == 7:
    print('You lose :(')
    break
  if guess == choose_word():
    print('Congrats! You win!')
    break 
  if guess != choose_word() and ask_guess == 'yes':
    print('This is incorrect.')
    continue 
  
 ValueError                                Traceback (most recent call last)
<ipython-input-42-0f2af26177a0> in <module>()
     22   word_blank_list.append('_')
     23 
---> 24 word_blank_list.remove(choose_word())
     25 print(word_blank_list)
     26 

ValueError: list.remove(x): x not in list
  

Большое вам спасибо!

Комментарии:

1. Почему for x in range(1): return random.choice(list_of_words); break — просто return random.choice(list_of_words)

2. Я добавил это, чтобы исправить проблему, чтобы слово было выбрано только один раз, но это не сработало. Если я удалю его, он все равно не будет работать.

3. choose_word() возвращает случайное слово, word_blank_list = [choose_word()] сохраняет это случайное слово в списке, но length = len(choose_word()) получает длину нового случайного слова и word_blank_list.remove(choose_word()) пытается удалить новое случайное слово, которого не будет в списке. выберите слово один раз и сохраните его word = choose_word() , а затем обратитесь к нему для своих вещей, таких как len(word)

Ответ №1:

Более простой код менее подвержен ошибкам:

  1. прочитайте все слова из URL-адреса один раз, заполните список, перетасуйте его для случайности
  2. возьмите 1-е слово один раз в качестве текущего слова из перетасованного списка
  3. сделайте все слова строчными и создайте список одинаковой длины с ‘*’ на букву
  4. [фактическая игра] Задавайте предположения, подсчитывайте попытки, если они ложны, и проверяйте в конце каждого раунда, закончили ли вы:
  5. Выполняется, когда попытки == 7 или угаданное слово, затем идет 6, а затем 4
  6. Условно перейти к 2. для нового раунда

 import urllib.request
import random

def get_all_words():
    word_file = 'https://raw.githubusercontent.com/lizzierobinson2/coolcode/master/list of words'
    return urllib.request.urlopen(word_file).read().decode("utf-8").split("n")

list_of_words = get_all_words()
random.shuffle(list_of_words)

# loop until the user does not want to continue or the words are all guessed at
while True: 
    # prepare stuff for this round - the code for the rounds of guessing never
    # touches the "word" setup - only ui and tries get modified
    word_to_guess = list_of_words.pop()
    lower_word = word_to_guess.lower()
    ui = ['*']*len(word_to_guess)
    tries = 0

    # gaming round with 7 tries
    while True:
        print("The word: "   ''.join(ui))
        letter = input("Pick a letter, more then 1 letter gets ignored: ").lower().strip()[0]

        # we just compare the lower case variant to make it easier
        if letter not in lower_word:
            tries  = 1
            # print your hangman here
            print(f"Errors: {tries}/7")
        else:
            # go over the lower-case-word, if the letters match, place the letter
            # of the original word in that spot in your ui - list 
            # string.index() only reports the FIRST occurence of a letter, using 
            # this loop (or a list comp) gets all of them
            for i,l in enumerate(lower_word):
                if l == letter:
                    ui[i] = word_to_guess[i]

        # test Done-ness:
        if word_to_guess == ''.join(ui):
            print("You won.")
            break
        elif tries == 7:
            print("You lost.")
            break
    # reset tries
    tries = 0
    if not list_of_words:
        print("No more words to guess. Take a break.")
        break
    elif input("Again? [y/ ]").lower() != 'y':
        break