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

时间:2016-03-26 15:08:59

标签: python

让我们假设您有一个游戏,您可以训练附加成本的单位,并且您希望能够计算培训一定数量的单位的总成本。

所有单元都具有相同的属性,但所述属性的值将在不同的单元中发生变化。

我找到了两个使用词典的潜在解决方案:

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

做一些粗略的研究我发现this question,这表明我经常尝试做的事情往往被视为反模式。所以我也不确定这个解决方案。

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

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

1 个答案:

答案 0 :(得分:1)

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

至于如何存储它们,有很多方法可以做到这一点。您可以拥有一个父类来定义公共对象的默认属性(如@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})