#python
#python
Вопрос:
В настоящее время я нахожусь в процессе создания игры hangman. Моя проблема во 2-м цикле for, для x в списке слов. Предполагается, что этот цикл for проходит через список слов (в этом примере [‘H’, ‘E’, ‘L’, ‘L’, ‘O’]) и:
if x in newwordlist or x==guessedletter
, затем x печатается в новый список
elif x not in newwordlist or x!=guessed letter
, затем для этого значения печатается «-«.
Когда я набираю букву H в консоли в качестве угаданного письма. Список новых слов обновляется и становится [‘H’, ‘-‘, ‘-‘, ‘-‘, ‘-‘] потому что я указал в коде, что если x=guessedletter, то print .
Но, когда я перейду к следующему вводу, например, O. Новый список слов теперь [‘-‘, ‘-‘, ‘-‘, ‘-‘, ‘ О’]. Как мне сделать так, чтобы вместо этого он становился [‘H’, ‘-‘, ‘-‘, ‘-‘, ‘ О’].
Мой цикл for указывает, что если x находится в newwordlist, то распечатайте его, а если это не так, то не печатайте «-«. Почему он не помнит, что newwordlist содержит значение H и не должен заменяться тире. Вместо этого он должен вывести это значение.
ALPHABET = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z']
word = input() # word player 2 is trying to guess
wordlist = list(word) # word in list form
guessedletter = input() # guessed letter
guesses = 6 # max amount of guesses
while guesses <= 6 and guesses > 0:
newABC = []
newABCstring = ('')
for x in ALPHABET:
if x != guessedletter:
newABC.append(x)
newABCstring = (newABCstring str(x))
print("Unused letters:" " " (newABCstring))
ALPHABET = newABC
newwordlist = []
for x in wordlist: # ['H', 'E', 'L', 'L', 'O']
if x in newwordlist or x == guessedletter:
newwordlist.append(x)
elif x not in newwordlist or x != guessedletter:
newwordlist.append('-') # ['-', '-', 'L', 'L', '-']
print(newwordlist)
newwordliststring = ('')
for x in newwordlist:
newwordliststring = (newwordliststring str(x))
if len(newwordliststring) == len(newwordlist):
print("Guess the word," " " (newwordliststring)) # prints the guessedletter dashes in string form
guessedletter = input()
Ответ №1:
«newwordlist = []» выполняется для каждой итерации в цикле while. Таким образом, даже если «H» установлено на предыдущей итерации, оно сбрасывается на [] .
У вас может быть newwordlist с элементом, инициализированным all на ‘-‘ вне цикла while. Каждый раз, когда игрок правильно угадывает букву, просто обновляйте этот список вместо добавления элементов в список.
newwordlist = ['-' for x in wordlist]
while guesses > 0:
# some code
for idx, letter in enumerate(wordlist):
if letter == wordlist[idx]:
newwordlist[idx] = letter
print(newwordlist)
# remaining code
Комментарии:
1. Я вижу, есть ли у меня способ поместить «newwordlist = []» внутри цикла for? При этом также настраивая его на вывод этого цикла for? Таким образом, я мог бы выполнять цикл с новым списком с помощью «H».
2. Ну, технически да, если вы сохраните состояние в другом месте. Но у вас должно быть что-то вне цикла, чтобы сохранять состояния.
Ответ №2:
Вы должны сделать следующее.
- поместите список новых слов вне цикла while
- просто замените индекс newwordlist внутри цикла for. Смотрите код ниже.
`
ALPHABET = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z']
word = input() # word player 2 is trying to guess
wordlist = list(word) # word in list form
guessedletter = input() # guessed letter
guesses = 6 # max amount of guesses
#define the newwordlist outside while loop
newwordlist = ['-' for letter in word]
while guesses <= 6 and guesses > 0:
newABC = []
newABCstring = ('')
for x in ALPHABET:
if x != guessedletter:
newABC.append(x)
newABCstring = (newABCstring str(x))
print("Unused letters:" " " (newABCstring))
ALPHABET = newABC
# newwordlist = []
for index, x in enumerate(wordlist): # ['H', 'E', 'L', 'L', 'O']
if x in newwordlist or x == guessedletter:
#just replace the value in the newwordlist
newwordlist[index] = x
#blow elif is not required
# elif x not in newwordlist or x != guessedletter:
# newwordlist.append('-') # ['-', '-', 'L', 'L', '-']
print(newwordlist)
newwordliststring = ('')
for x in newwordlist:
newwordliststring = (newwordliststring str(x))
if len(newwordliststring) == len(newwordlist):
print("Guess the word," " " (newwordliststring)) # prints the guessedletter dashes in string form
guessedletter = input()
`
Комментарии:
1. Это отличный ответ, который решает проблему, однако я должен следовать рекомендациям, установленным для программы, и это включает в себя отказ от использования функции enumerate .
2. enumerate просто дает вам значение индекса для цикла for. без enumerate вы не получите индекс итерированного значения. Не уверен, какой вариант использования здесь.
Ответ №3:
Возможно, вы захотите попробовать это и сравнить с вашим:
class E(Exception): pass
A = []
for i in range(65, 91):
A.append(chr(i))
w = []
for i in 'HELLO':
w.append(i)
g = ['-'] * len(w)
d = {}
for i in w:
d[i] = 0
print('Please guess the word :n%sn' % g)
while True:
try:
i = input('Guess letter/word: ').upper()
if __debug__:
if len(i) != 1 and i not in A:
raise AssertionError('Only a single letter and ASCII permitted')
else: raise E
except AssertionError as e:
print('n%s' % e.args[0])
continue
except E:
if i in w:
if i not in g:
g[w.index(i, d[i])] = i
d[i] = w.index(i)
print(g)
else:
try:
g[w.index(i, d[i] 1)] = i
d[i] = w.index(i, d[i] 1)
print(g)
except ValueError:
continue
if w == g:
print('You are great')
break
Вывод:
PS D:Python> python p.py
Please guess the word :
['-', '-', '-', '-', '-']
Guess letter/word: h
['H', '-', '-', '-', '-']
Guess letter/word: e
['H', 'E', '-', '-', '-']
Guess letter/word: l
['H', 'E', 'L', '-', '-']
Guess letter/word: l
['H', 'E', 'L', 'L', '-']
Guess letter/word: l
Guess letter/word: l
Guess letter/word: o
['H', 'E', 'L', 'L', 'O']
You are great