#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:
Более простой код менее подвержен ошибкам:
- прочитайте все слова из URL-адреса один раз, заполните список, перетасуйте его для случайности
- возьмите 1-е слово один раз в качестве текущего слова из перетасованного списка
- сделайте все слова строчными и создайте список одинаковой длины с ‘*’ на букву
- [фактическая игра] Задавайте предположения, подсчитывайте попытки, если они ложны, и проверяйте в конце каждого раунда, закончили ли вы:
- Выполняется, когда попытки == 7 или угаданное слово, затем идет 6, а затем 4
- Условно перейти к 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