0

独学で Python を学んでいるのですが、現在取り組んでいる単純なゲーム プロジェクトで問題が発生しました。

ゲーム エンジンによって実行されているルームとは別のモジュールに、プレーヤーの統計情報を保持したいと考えています。問題は、別のモジュールから属性を設定しようとするとPlayer、新しい属性が保存されず、元の属性がインスタンス化されることです。

ここにモジュールのPlayerクラスがありますentities

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 オブジェクトを作成し、その属性を変更してから破棄しています。

各シーンに 1 人のプレーヤーを明示的に渡す必要があります。

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

すべてのメソッドで新しいPlayerインスタンスを作成しているようですenter...

ゲームにプレイヤーを 1 人だけ配置する場合は、グローバル変数として (通常はあまり良い考えではありません)、シングルトン クラスとして使用することもできます: http://blog.amir.rachum.com/ post/21850841339/implementing-the-singleton-pattern-in-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 に答える