gpt4 book ai didi

python - 玩家应该继承还是拥有关卡?

转载 作者:太空宇宙 更新时间:2023-11-04 07:09:57 24 4
gpt4 key购买 nike

过去几周我一直在努力学习 OOP,我学到了很多,但我不确定这一点,我的类层次结构应该是什么样的?

假设有两个类,这是一个Level类:

class Level(object):
def __init__(self, level, exp):
self.level = level
self.exp = exp

@property
def required_exp(self, level=None):
return 80 + 40 * (level or self.level)

def add_exp(self, exp):
self.exp += exp
while self.exp >= self.required_exp:
self.exp -= self.required_exp
self.level += 1

显然它还有一些其他方法,但这是基本思想。

现在第二个类叫做Player。它有一些属性,比如:name, health, level, experience points, damage

到目前为止我所学到的(SO 上的某个人这样说)是在我不确定是使用继承(is-a-relationship)还是属性( 有一个关系)。问题是:Player 是一个 Level,还是 Player 有一个 Level?

嗯……两者都不是。Player肯定不是一个级别,这一点我敢肯定。Player 有它的级别,但级别不等于 Level 类。相反,Player 具有等级和经验值,它们都是 Level 类的属性。您还可以向 Player 添加经验值,因此从 Level 继承它是有意义的。

作为旁注,这些命名对我来说也没有任何意义。有这样的东西是有意义的: Level.increase(self) 将 Level 增加一个。然而,对于玩家来说,调用 Player.level_up(self) 会更有意义,就像在大多数(所有?)角色扮演游戏中所使用的那样。调用 Player.increase(self) 没有任何意义,您不能将 Player 增加一个,而是将其级别增加一个。再一次,调用 Level.level_up(self) 也没有多大意义......

因此,我认为我应该像使用接口(interface)一样使用 Level 并从中继承 Player(和其他子类),但我不确定是否如此我决定问你,反正我是来学习的。我应该怎么办?将 LevelPlayer 一起使用的最正确方法是什么?

最佳答案

我相信我就是让你问自己这个问题的人:“A 类是 B 类,还是 A 类有 B 类?”,所以我觉得我必须回答这个问题。

我不能 100% 确定您的关卡实际作用是什么,但我假设它与《口袋妖怪》、《魔兽世界》、《英雄联盟》和数以千计的其他游戏中使用的关卡类似。如果是这样,您的 Level 类就已经出错了,它不应该是那样的。

你肯定在一件事上是对的;“玩家肯定不是一个级别的”正如其他人已经提到的那样,您应该选择 has-a 关系。球员确实有水平,我们都知道这一点。但是,你告诉我玩家没有 Level 类型的属性,而是一个整数 level 属性来保存你的 Level 的数值-类。

这应该已经敲响了一些警钟,但这里有一个提示:它与具有一个名为 name 的 string 类型属性的 Name 类是一样的 在里面。

所以答案是:Name 类本身应该已经是一个字符串,它应该继承自 string,而不是在其中包含一个 string 属性来保存它的值。这同样适用于您的 Level,它本身已经是一个整数,因此从 int 继承它,然后添加 exp 及其方法。

现在您可以使用player.level 返回玩家等级的整数值。要获得 exp,您“必须”使用 player.level.exp。我引用了“必须”,因为即使听起来很奇怪,exp 也是关卡的一个属性。它基本上与数字的小数点相同,有意义吗?

此外,调用类似 player.level.increase() 的方法现在更有意义了。虽然,它已经是一个整数值,但为什么不直接执行 player.level += 1 呢?如果您需要在添加中添加一些高级内容,您可以重写 Level.__add__(self, value) 方法。我想不出你为什么不需要这个的单一原因? (不是现在您已经将 required_exp 设为属性)

关于python - 玩家应该继承还是拥有关卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16490290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com