python - 在面向对象的游戏中管理项目

标签 python oop

每隔一段时间我就想从我的其他项目中休息一下,尝试将经典的基于文本的冒险游戏(这次是用 Python)作为一个有趣的项目,但我总是遇到设计问题来实现元素系统。

我希望游戏中的元素派生自一个基 Item 类,其中包含每个元素都具有的一些属性,例如损坏和重量。当我尝试向这些项目添加一些功能时,我的问题就开始了。当一个项目的损坏超过阈值时,它应该被销毁。这就是我的问题:我真的不知道如何做到这一点。

由于 del self 由于一百万种不同的原因而无法工作,(编辑:我有意提供“del”的使用,因为我知道这是错误的。我知道什么垃圾收集是,它怎么不是我想要的。) 我应该怎么做这个(以及其他类似的任务)?每个项目是否应该包含对其容器(我猜是播放器)的某种引用并“要求”删除自身?

首先想到的是一个包含游戏中每个项目的大字典,每个对象都会引用这个列表,并且都知道自己的唯一 ID。我根本不喜欢这个解决方案,我认为这根本不是正确的方法。有人有什么建议吗?

编辑:我看到很多人认为我担心垃圾回收。我所说的不是垃圾收集,而是实际从游戏中移除对象。我不确定哪些对象应该启动删除等。

最佳答案

我希望您的对象保留对其所有父对象的引用。然后,当它应该被销毁时,它会通知它的 parent 。如果您已经在使用事件系统,那么它应该可以很好地与游戏的其余部分集成。

避免强制您的父级在删除或添加引用时显式通知对象的一个​​好方法是使用某种代理。 Python 支持 properties,这将允许像 self.weapon = Weapon() 这样的代码实际将设置新武器的武器属性的职责交给用户定义的函数.

下面是一些使用属性的示例代码:

class Weapon(object):
    def __init__(self, name):
        self.name = name
        self.parent = None
    def destroy(self):
        if self.parent:
            self.parent.weaponDestroyed()

def WeaponRef():
    def getWeapon(self):
        return self._weapon
    def setWeapon(self, newWeapon):
        if newWeapon == None: #ensure that this is a valid weapon
            delWeapon(self)
            return
        if hasattr(self, "weapon"): #remove old weapon's reference to us
            self._weapon.parent = None
        self._weapon = newWeapon
        newWeapon.parent = self
    def delWeapon(self):
        if hasattr(self, "weapon"):
            self._weapon.parent = None
            del self._weapon
    return property(getWeapon, setWeapon, delWeapon)

class Parent(object):
    weapon = WeaponRef()
    def __init__(self, name, weapon=None):
        self.name = name
        self.weapon = weapon
    def weaponDestroyed(self):
        print "%s deleting reference to %s" %(self.name, self.weapon.name)
        del self.weapon


w1 = Weapon("weapon 1")
w2 = Weapon("weapon 2")
w3 = Weapon("weapon 3")
p1 = Parent("parent 1", w1)
p2 = Parent("parent 2")

w1.destroy()

p2.weapon = w2
w2.destroy()

p2.weapon = w3
w3.destroy()

现在,如果您正在做某种库存系统,其中玩家可以拥有不止一件武器并且其中任何一件都可以随时被摧毁,那么您将不得不编写自己的收藏类。
对于类似的事情,请记住 x[2] 调用 x.__getitem__(2)x[2] = 5 调用x.__setitem__(2, 5)del x[2] 调用 x.__delitem__(2)

关于python - 在面向对象的游戏中管理项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325775/

相关文章:

python - Groupby 计算集合中唯一值的频率

python - 通过 Java 网关链接 Netlogo 和 Python

python - 如何限制基类方法只运行一次

java - 面向对象 : Does container contain bike or chair?

javascript - JS 模块模式和调用另一个函数

python - 如何使用 flask 套接字?获取 KeyError : 'wsgi.websocket'

python - 按预定义索引拆分 python 字符串

python - pdf2txt.py 不执行命令

actionscript-3 - 为什么不能使用 "final"是一个安全问题?

php - PHP 中的面向对象编程 - 某些方面对于应用程序来说是否太过分了?