为Python编写一个hangman程序,并希望变量(self.masked_word)保持一致,因为我多次调用该方法...
例如,如果密码是“你好”,我在玩:
game.guess('h'),然后game.guess('l'),game.get_masked_word()应该返回:'h_ll _'...
[目前,同时播放这两个字只会返回猜中的最后一个字母...'__ ll_'。
已经尝试将self.masked_word从init移到guess(),我只是误解了如何创建在类内持久存在的非静态变量。谢谢
STATUS_WIN = "win"
STATUS_LOSE = "lose"
STATUS_ONGOING = "ongoing"
class Hangman(object):
def __init__(self, secret_word):
self.secret_word = secret_word
self.status = STATUS_ONGOING
self.remaining_guesses = 9
self.masked_word = ''
def guess(self, guess):
if self.secret_word.find(guess) >= 0:
self.masked_word = list(map(lambda n: '_' if n != guess else n, self.secret_word))
else:
self.remaining_guesses -= 1
if self.remaining_guesses < 0:
self.status = STATUS_LOSE
raise Exception("Vous avez déjà perdu!")
return ("You lose! :(")
elif guess is '' or guess is None:
return (f"You have {self.remaining_guesses} guesses left. Répondez cette fois avec un lettre.")
else:
return (f"You have {self.remaining_guesses} guesses left.")
def remaining_guesses(self):
return self.remaining_guesses
def get_masked_word(self):
return ''.join(self.masked_word)
def get_status(self):
return self.status
game = Hangman('hello')
print(game.guess('h'))
print(game.guess('l'))
print(game.get_masked_word())
您的问题与变量masked_word
的范围无关,但是您每次猜测都会销毁并重新创建它。可能的解决方案可能是:
在初始化时用_
填充变量:
def __init__(self, secret_word):
...
self.masked_word = ['_' for _ in secret_word]
然后仅显示此回合中猜出的字母:
def guess(self, guess):
if self.secret_word.find(guess) >= 0:
for i, letter in enumerate(self.secret_word):
if letter == guess:
self.masked_word[i] = letter
else:
self.remaining_guesses -= 1
这将导致:
You have 9 guesses left.
h_ll_