存储游戏单元属性(成本)的适当方法是什么?



假设你有一个游戏,你可以训练有成本的单位,并且你希望能够计算训练一定数量的单位的总成本。

所有单位共享相同的属性,但所述属性的值将在不同的单位之间发生变化。

我发现了两个潜在的解决方案,使用字典:

spearmen = {'gold' : 2, 'wood' : 10, 'stone' : 5, 'iron' : 0}
swordsmen = {'gold' : 5, 'wood' : 30, 'stone': 0, 'iron' : 10}

但我发现访问信息的方法有点冗长:

swordsmen['gold'] * 1200

所以我想知道这样做是否合适:

class Spearmen:
    gold = 2
    wood = 10
    stone = 5
    iron = 0
class Swordsmen
    gold = 5
    wood = 30
    stone = 0
    iron = 10

使用类使访问信息变得不那么冗长:

Spearmen.gold * 1200

通过粗略的研究,我发现了这个问题,这表明我试图做的事情通常被认为是反模式的。所以我也不确定这个解决方案。

当考虑我的程序的演变时,我不太可能必须为单元添加新的属性,但我更有可能需要添加新的单元(具有相同的属性)。

因此,我想知道这些解决方案中的任何一个是否合适,或者是否有更好的方法来做到这一点(以及为什么它们是错误的)。

对象的属性应该是对象定义(类)的一部分。如果对象共享一组公共属性,则它们应该从父类继承。

至于应该如何存储它们,有很多方法可以做到这一点。您可以有一个父类来定义公共对象的默认属性(如@zondo所建议的,一个Unit类);这些属性可以存储为字典。

您可以修改继承类中的字典,以覆盖默认属性的值,或者为特定的单元类型创建新的值。

class BaseUnit(object):
    def __init__(self, name, stats={}):
       self.stats = {}
       if not stats:
           self.stats['health'] = 10
           self.stats['armor'] = 10
           self.stats['strength'] = 10
       else:
           self.stats.update(stats)
       self.name = name
class Peon(BaseUnit):
    pass
class Warrior(BaseUnit):
    pass
grunt = Peon(name='Igor', {'strength': 5, 'armor': 5})
soldier = Warrior(name='Frank', {'armor': 10, 'health': 20, 'damage': 50})

相关内容

最新更新