2013-01-31 3 views
0

Im учит себя python, и я столкнулся с проблемой в простом игровом проекте, над которым я работаю.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?

ответ

1

Похоже, вы создаете новый Player экземпляр на каждом enter методом ...

Если вы собираетесь иметь только один игрок в игре, вы могли бы иметь его в качестве глобальной переменной (обычно не очень хорошая идея) или даже лучше, в качестве одноэлементного класса: 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() 

, который выводит:

[email protected]:~/Tests/Python/Stack Overflow$ python ./players.py 
foobar-hero has 10 points of hp 
foobar-hero has 10 points of hp 

Добро пожаловать на питона. Я уверен, что вы обнаружите, что у него действительно классные функции ... например, возможность возвращать функции или передавать функции в качестве параметров, проверять классы, определенные в любом модуле ... Похоже, что вы можете найти полезные вещи.

+0

Таким образом, каждый раз, когда я называю игрока, Im вызывая совершенно новую версию этого? сумасшедший, у меня есть небольшая проблема с пониманием вашей ссылки, хотя, если я последую этим шагам с моим кодом, значит ли это, что он сделает только один экземпляр игрока? также, что было бы так плохо, если бы я сделал его глобальной переменной, но содержал в своем собственном модуле? Это также беспокоит меня, когда я начинаю внедрять монстров. – lerugray

+0

Да, вы создаете новый ... Не пытайтесь скопировать код в одноэлементный шаблон ... Просто исследуйте его ... О глобальных переменных ... хорошо: http://c2.com/ cgi/wiki? GlobalVariablesAreBad :) – BorrajaX

+0

Это работает, но я боюсь, что вы пытаетесь научить OP работать, прежде чем он сможет ходить. –

2

Вы создаете новый объект Player в каждой сцене, меняя его атрибуты, а затем отбрасывая его.

Вы должны быть явно прохождения одного единственного игрока в каждой сцене:

def enter(self, player): 
    ... do something with player ... 
+0

не нужно было бы называть его как себя, комнаты.Player(), в отличие от игрока? И должен ли я использовать это в коде для каждой комнаты? – lerugray

+0

Нет. У вас, похоже, есть странные недоразумения в отношении объектно-ориентированного программирования. Здесь нет ничего особенного в Python: вы должны прочитать введение в ООП. –

+0

Да, я новичок в программировании в целом и могу использовать лучшее понимание ООП, я постараюсь найти хорошие знакомства, спасибо! – lerugray

Смежные вопросы