0

我正在自学python,但在我正在从事的一个简单游戏项目中遇到了障碍。

我想将玩家统计数据保存在与游戏引擎运行的房间不同的模块中。问题是当我尝试Player从不同的模块设置属性时,它不会保存新属性并实例化原始属性。

这是模块中的Playerentities

class Player(object):

    def __init__(self):

        self.name = ' '
        self.hp = 0
        self.current_hp = 0
        self.strength = 0
        self.dexterity = 0
        self.constitution = 0

这就是我如何尝试操作和测试rooms模块中的属性

class CharacterCreation(Scene):
    def enter(self):
        character = entities.Player()
        character.hp = 10
        print character.hp
        return 'barracks'

class Barracks(Scene):
    def enter(self):
        character = entities.Player()
        print character.hp
        return 'shop'

当我用我的其余代码对此进行测试时,这就是我得到的。

-------------------------------------------------------------------------------


10
-------------------------------------------------------------------------------


0
-------------------------------------------------------------------------------

那么我在这里错过了什么?我以为我可以使用设置该属性,=但似乎我弄错了?我第一次这样做时,它起作用了,但是我如何让 python 将新值设置hp为 10?

4

2 回答 2

2

您正在每个场景中创建一个新的 Player 对象,更改其属性,然后将其丢弃

您应该明确地将一个玩家传递到每个场景中:

def enter(self, player):
   ... do something with player ...
于 2013-01-31T15:57:43.713 回答
1

看起来您正在为Player每个方法创建一个新实例enter......

如果你打算在游戏中只有一个玩家,你可以把它作为一个全局变量(通常不是很好的主意)或者更好,作为一个单例类: http ://blog.amir.rachum.com/发布/21850841339/在 python 中实现单例模式

我对代码做了一些调整。它添加了PlayerPool类(实际上更像是一个缓存)。它可能会给你一些想法:)

#!/usr/bin/env python
#http://stackoverflow.com/questions/14629710/python-setting-attributes-from-module-to-module/14629838#14629838

class Player(object):
    def __init__(self):
        self.name = ' '
        self.hp = 0
        self.current_hp = 0
        self.strength = 0
        self.dexterity = 0
        self.constitution = 0

class PlayerPool(object):
    _players = dict()

    @classmethod
    def getPlayerByName(cls, name):
        if not name in cls._players:
            newPlayer = Player()
            newPlayer.name = name
            cls._players[newPlayer.name] = newPlayer
        return cls._players[name]


class Scene(object):
    pass

class CharacterCreation(Scene):
    def enter(self):
        character = PlayerPool.getPlayerByName("foobar-hero")
        character.hp = 10
        print "%s has %s points of hp" % (character.name, character.hp)
        return 'barracks'

class Barracks(Scene):
    def enter(self):
        character = PlayerPool.getPlayerByName("foobar-hero")
        print "%s has %s points of hp" % (character.name, character.hp)
        return 'shop'

if __name__ == "__main__":
    step1 = CharacterCreation()
    if step1.enter() == "barracks":
        step2 = Barracks()
        step2.enter()

输出:

borrajax@borrajax-comp:~/Tests/Python/Stack Overflow$ python ./players.py 
foobar-hero has 10 points of hp
foobar-hero has 10 points of hp

欢迎来到蟒蛇。我相信您会发现它具有非常酷的功能...例如返回函数的能力,或将函数作为参数传递,检查任何模块中定义的类...看起来您会发现有用的东西。

于 2013-01-31T15:56:45.007 回答