首页 > 解决方案 > 多次调用类中的方法,变量保持一致

问题描述

为 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())

标签: pythonpython-3.x

解决方案


您的问题与变量的范围无关,masked_word而是您在每次猜测时都销毁并重新创建它。一个可能的解决方案可能是:

_在初始化时用 s 预填充变量:

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_

推荐阅读