游戏设计-处理奖金/鸭子类型-python

游戏设计-处理奖金/鸭子类型-python,python,pygame,duck-typing,Python,Pygame,Duck Typing,我目前在我的游戏设计中面临着一个设计问题,并不可怕,但它已经够困扰我的了,所以我想问问其他人的意见:-) 我目前正在试验pygame,我开发了一款小型太空射击游戏,现在我想处理一些奖金 现在我有一个抽象类奖金,从中衍生出当前实现的所有奖金:一个“健康奖金”,它给玩家一些健康,一个“死亡奖金”,它使玩家的健康下降到1 在我的游戏循环中,这里是我所做的(大致): 在我告诉玩家使用奖金之后 class Player: ... def useBonuses(self): for bonus in

我目前在我的游戏设计中面临着一个设计问题,并不可怕,但它已经够困扰我的了,所以我想问问其他人的意见:-)

我目前正在试验pygame,我开发了一款小型太空射击游戏,现在我想处理一些奖金

现在我有一个抽象类奖金,从中衍生出当前实现的所有奖金:一个“健康奖金”,它给玩家一些健康,一个“死亡奖金”,它使玩家的健康下降到1

在我的游戏循环中,这里是我所做的(大致):

在我告诉玩家使用奖金之后

class Player:
...
def useBonuses(self):
    for bonus in self.bonuses:
        bonus.use(self)
到目前为止,一切都还不错,但我想增加一个“炸弹奖励”,当玩家射击时,它会爆炸并杀死周围的敌人

这个“奖金”实现了我的抽象类奖金的“使用(目标)”方法,就像其他人一样,但是我觉得在玩家奖金列表中添加这样的奖金有点不好,因为它们之间应该没有关系

奖金背后的概念是,这是“对某事做某事的东西”,以前是我的玩家等级的目标,但现在不太清楚。。。 当然,在检测到哪些奖金被射杀后,我可以测试奖金的类型(使用isinstance),而不是调用player.useBonuals(),例如奖金的类型,但是在我阅读了关于duck类型的所有讨论以及为什么它是python方式之后,我想知道如何处理奖金问题

谢谢你们的阅读,希望你们能帮助我


如果你不想让某个
col
进入
玩家。奖金
但是在其他地方,在抽象类
奖金
中使用默认实现创建一个
顶层
方法:

def toplayer(self, player):
    player.bonuses.append(self)
并在
炸弹奖励
类中重写它。(正如您所提到的,您不必继承,但如果这样做可以让您轻松地重用功能,那么这样做也没有问题。)

例如,一个玩家可以有一个属性
炸弹
,通常
,而
炸弹奖金
类可以:

def toplayer(self, player):
    player.bomb = self
当对所有累积的奖金采取行动时,可以从

if player.bomb is not None:
    player.bomb.explode(player.position)

或者类似的东西。

我不是用python写的,但我的建议是:给你的玩家装载他能获得的每种武器(甚至是通过奖金获得的武器),并将他通过奖金获得的武器上的弹药设置为0。然后,当你的玩家获得“炸弹奖励”(或其他)时,向玩家身上的炸弹武器添加一枚弹药。这应该可以很好地工作。

我认为你的思路是正确的-我认为“炸弹奖励”仍然与玩家对象相关,因为它会影响玩家周围的敌人。您只需实现“炸弹奖金”的
use()
方法,如下所示:

class BombBonus(Bonus):
    def use(self, player):
        assert isinstance(player, Player)
        # TODO: find all enemies that are close to the player - assuming you
        # have all enemy objects in a list call 'enemies'
        global enemies
        for enemy in enemies:
          if distance(player.position, enemy.position) < 400:
            # if the distance between player and an enemy is less than 400
            # (change this value to your liking), destroy that enemy.
            enemy.explode()
班级奖金(奖金):
def使用(自身、玩家):
断言isinstance(玩家,玩家)
#TODO:找到所有靠近玩家的敌人-假设你
#将列表中的所有敌人对象都称为“敌人”
全球敌人
对于敌人中的敌人:
如果距离(玩家位置、敌人位置)<400:
#如果玩家与敌人之间的距离小于400
#(根据您的喜好更改此值),摧毁该敌人。
敌人爆炸
您需要自己设计
distance()
的实现


在没有详细计划的情况下开发游戏意味着你经常会有一些新想法,这些想法几乎适合你现有的对象,你需要选择是用新功能扩展现有的类来支持你的新想法,还是创建一组新的类,因为你认为新想法太不一样了。这里没有对与错,只要确保你的想法以一种对你有意义的方式组织起来。

我在几年前写的一个小行星克隆中有一个奖金系统。它现在还活着(就像一个死掉的项目一样)。我认为它不像你期望的那样灵活。但小的产卵和移动,如果他们,奖金将被删除和错过的球员。如果,奖励点数。

炸弹在发射一颗箭时爆炸,它不会在玩家周围爆炸。它可以在屏幕上的任何位置,并且绝对与当前玩家的位置无关。我的意思是,此奖励与玩家之间没有关系。但是你的实现可以用来获得另一种奖励,比如盾牌,谢谢:)炸弹在发射一颗箭时爆炸,它不会在玩家周围爆炸,它可以在屏幕上的任何地方,绝对与当前玩家的位置无关。很抱歉把这说得不清楚。
class BombBonus(Bonus):
    def use(self, player):
        assert isinstance(player, Player)
        # TODO: find all enemies that are close to the player - assuming you
        # have all enemy objects in a list call 'enemies'
        global enemies
        for enemy in enemies:
          if distance(player.position, enemy.position) < 400:
            # if the distance between player and an enemy is less than 400
            # (change this value to your liking), destroy that enemy.
            enemy.explode()