我目前面临的一个设计问题,在我的游戏设计,并不可怕,但它困扰我,所以我想问别人的意见:-)
我目前正在试验pygame,我已经开发了一个小的空间射手,现在我想处理一些奖金。
现在我有一个抽象的等级奖励,从中获得当前所有的奖励:一个“健康奖励”,它会给玩家一些健康,一个“死亡奖励”,它会把玩家的健康降低到1。
在我的游戏循环中,我所做的(大致)是:

def testCollisionBonusBolt():
    #bolts are sprites fired by the player that allow him to get the bonuses
    collisions = pygame.sprite.groupcollide(bonusesGroup, boltsGroup, True, True)
    for col in collisions:
        player.bonuses.append(col)

在我告诉玩家使用奖金之后
class Player:
...
def useBonuses(self):
    for bonus in self.bonuses:
        bonus.use(self)

到目前为止一切都还不错,但我想加上一个“炸弹奖励”,当玩家开枪时,炸弹会爆炸并杀死周围的敌人。
这个“奖金”实现了我的抽象类奖金的“使用(目标)”方法,但我觉得把这样的奖金添加到玩家的奖金列表中有点糟糕,因为他们之间应该没有关系!
奖金背后的概念是,这是“对某样东西有作用的东西”,以前是我的玩家等级的目标,但现在不是那么清楚了…
当然,在检测到哪些奖金被射中后,我可以测试奖金的类型(使用isinstance),例如奖金的类型,而不是调用player.useCanods(),但在所有讨论之后,我都读到了关于duck键入的内容以及为什么这是pythonic方法,我想知道如何处理奖金问题?
谢谢你们读到这里,希望你们能帮我!
当做

最佳答案

如果您不希望某个col进入player.bonuses而进入其他位置,请在抽象类toplayer中使用默认实现创建一个Bonus方法:

def toplayer(self, player):
    player.bonuses.append(self)

并在bomb bonus类中重写它。(正如您所提到的,您不必继承,但是如果这样做可以让您轻松地重用一些功能,那么这样做是没有问题的。)
例如,玩家可以有一个属性bomb,通常None,而bomb bonus类可以:
def toplayer(self, player):
    player.bomb = self

当对累积的所有奖金采取行动的时候,可以从
if player.bomb is not None:
    player.bomb.explode(player.position)

或者类似的。

10-08 16:52