繁体   English   中英

为什么我的腌制对象没有恢复?

[英]Why are my pickled objects not restoring?

所以我正在开发一个基于文本的 RPG 并且我对编码相当陌生,大约一个月前才开始学习 Python,所以如果有人可以提供帮助,他们将成为救星。

当我保存并加载我的游戏时,它会加载我的默认玩家统计数据,我该如何让它加载统计数据增加以及我的药水和金币也重置为默认值。

class Player:
    name = "Razor"
    atkl = 15
    atkh = 20
    magic_light_slashl = 20
    magic_light_slashh = 25
    magic_fireballl = 40
    magic_fireballh = 48
    magic_lightningl = 55
    magic_lightningh = 65
    maxhp = 50
    hp = 50
    maxap = 10
    ap = 10
    exp = 0
    level = 1
    gold = 20
    potions = 0
    great_potions = 0
    max_potions = 0
    elixers = 0
    great_elixers = 0
    max_elixers = 0

def save():
    player = Player
    level_state = Player.level
    with open('savefile', 'wb') as f:
        pickle.dump([player, level_state], f, protocol=2)
        print("Game has been saved.")
        start_up()

def load():
    if os.path.exists('savefile') == True:
        with open('savefile', 'rb') as f:
            player, level_state = pickle.load(f)
            print("Loaded save state.")
            start_up()
    else:
        print("Could not find save file.")
        main()

这是我如何升级的一些内容。

def level_up():
    if Player.level == 1:
        if Player.exp >= 30 and Player.exp < 80:
            print("You are level 2")
            Player.level = 2
            Player.atkl = 17
            Player.atkh = 22
            Player.magic_light_slashl = 23
            Player.magic_light_slashh = 27
            Player.maxhp = 53
            Player.hp = 53
            Player.maxap = 12
            Player.ap = 12

如果您需要更多我的代码来帮助我,请询问。

你误解了课程的工作方式。 您正在使用类级别的属性,而不是实例级别的属性,这会导致它们不能正确地pickle。 您本质上是将一个类视为一本字典,而这根本不是它们的工作方式。

当你创建一个类时,它就像一个蓝图。 汽车的蓝图可用于创建许多汽车“实例”,但蓝图不是汽车本身。

因此,为了从您的Player类中获取一个实例,您需要“实例化”它。 您可以通过按名称调用类并在其后加上括号()完成此操作。 括号向 Python 表明您正在调用类的构造函数,该构造函数在类中定义为__init__() 你的类没有构造函数,所以应该先定义一个。

class Player:
    def __init__(self):
        # this is the constructor

        # let's add some instance-level properties
        self.name = 'Razor'
        # you can add the rest of your properties here as long as they being with self

        print 'I am a new instance of the player class, my name is ' + self.name

然后你可以实例化它并将实例存储在这样的变量中(注意我们的消息将在构造过程中打印):

player = Player()

然后您可以访问该实例上的属性

print player.name

或者你可以改变它们

player.name = 'Blade'
print player.name
# prints 'Blade'

此实例化有用且重要的原因是它允许您根据需要创建任意数量的“玩家”(或角色或敌人等),并且它们都保留自己的属性。 self是一个明确的指标,表明您正在与实例对话,而不是类本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM