2016-03-26 14 views
0

あなたは、コストが付いているユニットを訓練でき、そのユニットの一定量を訓練するための総コストを計算できるようにしたいと考えています。ゲームユニットの属性(コスト)を保存する適切な方法は何ですか?

ユニットはすべて同じ属性を共有しますが、前記属性の値は異なる単位で変化します。

私は辞書を使用して2つの潜在的な解決策、発見した:ような何かをやっている場合ので、私は疑問に思い

swordsmen['gold'] * 1200 

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

をしかし、私は少し冗長にするための情報にアクセスするための方法を見つけますこれは適切です:

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を発見したいくつかのぞんざいな研究を、行います。だから私はこの解決策についてもわからない。

プログラムの進化について考えると、ユニットに新しい属性を追加する必要はほとんどありませんが、新しいユニット(同じ属性のユニット)を追加する必要がありそうですが、 。

これらの解決策のいずれかが適切か、それを行うためのより良い方法があるのか​​、なぜ間違っているのだろうかと思います。

+0

木材 '、私は意見をベースとして閉じるように投票していますが、私の意見はあなたが' Unit'というクラスを作成する必要があること、例えば、それは 'gold'を取る' __init__'メソッドを定義しています'、' 'stone''、' 'iron''をパラメータとして、インスタンスの属性として設定します。あなたは 'spearmen = Unit(5、30、0、10)'と言うことができ、 'spearman.gold * 1200'を使うことができます。 1つのクラスだけを使用しているので、新しい種類のユニットごとに新しいクラスを定義する必要はありません。 – zondo

+0

オピニオンベースまたはプログラマーサイト(他のSEサイトのダイアログでは選択できません...) – bish

+0

初心者であると私は推測しました。解決策ですが、これは意見のことと思われるので質問を終了してください、お時間をありがとうございます。 – McBain

答えて

1

オブジェクトの属性はオブジェクト定義(クラス)の一部である必要があります。オブジェクトが共通の属性セットを共有する場合は、親クラスから継承する必要があります。

保存方法については、これを行う方法はたくさんあります。共通オブジェクトのデフォルト属性を定義する親クラスを持つことができます(@ zondoが提案するように、ユニットクラス)。これらの属性は辞書として格納することができます。

デフォルトの属性の値を上書きするか、その特定のユニットタイプの新しいものを作成するために、継承したクラスのディクショナリを変更することができます。

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}) 
関連する問題