游戏设计 - 处理奖励 / 鸭子类型 - Python

4
我目前在我的游戏设计中遇到一个设计问题,虽然不是非常严重,但让我感到有些困扰,所以我想询问其他人的意见 :-)
我目前正在尝试使用pygame,我开发了一个小型的太空射击游戏,现在我想处理一些奖励。
目前我有一个抽象类Bonus,从中派生出所有当前实现的奖励:一个“健康奖励”,可以给玩家回复一些生命值,一个“死亡奖励”,可以将玩家的生命值降至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)

到目前为止,一切都还好,但我想添加一个“炸弹奖励”,当玩家射击时,它会爆炸并杀死周围的敌人。

这个“奖励”实现了我的抽象类Bonus的“use(target)”方法,就像其他奖励一样,但我觉得将这样的奖励添加到玩家的奖励清单中有点不妥,因为它们之间应该没有关系!

奖励背后的概念是“某物对某物做某事”,以前的目标是我的玩家类,但现在不明确了......当然,我可以在检测到哪些奖励被射击后调用player.useBonuses() ,但在阅读了许多关于鸭子类型及其如何成为Python风格的讨论之后,我在思考如何处理我的奖励问题?

感谢您看到这里,希望你们能帮我解决问题!

问候


当螺栓被发射到炸弹上时,炸弹会爆炸,它不会在玩家区域周围爆炸,可以出现在屏幕的任何位置,与当前玩家位置完全无关。抱歉之前表述不清楚。 - attwad
4个回答

1
如果您不想让某个col进入player.bonuses而是其他地方,请在抽象类Bonus中创建一个toplayer方法,并使用默认实现:
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)

或类似的内容。


1
我不写Python,但这是我的建议:为您的玩家装备每种类型的武器(即使是通过奖励获得的武器),并将通过奖励获得的武器的弹药设置为0。然后,当您的玩家捡起“炸弹奖励”(或其他物品)时,在玩家的炸弹武器上添加一颗弹药。这应该能够很好地工作。

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()

你需要自己实现distance()函数。

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


当螺栓被发射到炸弹上时,炸弹会爆炸,它不会在玩家周围爆炸,可以出现在屏幕的任何位置,与当前玩家位置无关。这就是我说这个奖励与玩家之间没有关系的意思。 但是你的实现可以用于其他类型的奖励,比如盾牌,谢谢 :) - attwad

0

我在几年前编写的一个小行星克隆游戏中有一个奖励系统。现在它(尽管是一个已经死亡的项目)存放在Bitbucket上。我认为它不像你所追求的那么灵活,但是小的"奖励"实体会生成并移动,如果它们与小行星碰撞,奖励将被移除并且玩家错过了。如果玩家与之碰撞,则会获得奖励分数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接