2017-04-18 5 views
0

私はstatを増減するたびにmax hpを上げる関数を作成しようとしています。私はself.maxHpCalc()playerを変更しようとしました。**私は考えることができ、運がなかった理由はすべて、変数=(int)をorcクラスに移動しています。私はそれをどのように変更するかに応じて、私は自分自身を得る/プレーヤーは属性強度を持たない、maxHpまたはmaxHpCalcは定義されていない。Pythonでのテキストベースのゲームのクラスの操作

class player: 
    def __init__(self, hp = 1 , maxHp = 1, strength = 4, defense = 5): 
     self.hp = hp 
     self.maxHp = maxHpCalc() 
     self.strength = strength 
     self.defense = defense 

    def maxHpCalc(): 
     player.maxHp = player.strength + player.defense 

class orc(player): 
    def __init__(self, hp, maxHp, strength , defnese): 
     super().__init__(hp, maxHp, strength, defense) 
print(player.maxHp) 

すべてが、私はここにいくつかの固定のコードがクラスを行使するための小さなドライバプログラムで、の自己は、一瞬

+0

私はこれを読んだが、私は質問を見るのに苦労している。あなたはそれを正しくやっているという安心感を探していますか? –

+0

笑はい、上部のセクションです。多かれ少なかれ私はちょうど自分自身に話していた。それが正しいと思われる場合はそれを無視してください。主に私はすべてのdef関数の最後に問題があります。統計情報が何であるかに応じて常に変化する変数にして欲しいからです。だから私は "プレーヤーの属性upperStrengthを持っていない"またはmaxHPCalcが定義されていないなどのエラーが発生します。現在のところraiseStat()関数があり、maxHp =(formula)があり、それは動作しますが、私が見たところでは、関数をクラスに入れる方法が必要ですmaxHp = maxHpCalc()それを動作させる方法を見つけました。 – Reederboard

+0

これらの関数をインデントしてみましたか?それで、それらはクラスのスコープの下にありますか?これらの種類の字下げエラーは、コードをテキストボックスに貼り付けた結果ではなく、元のポスターコードの本物のエラーであるとは決して確信できません。 –

答えて

0

で何の属性の力を持っていない/私のプレーヤーを与える変更します。それはplayerインスタンスに含まれるデータ上で動作する場合

注以下は、結合した方法であるべきである

  1. 機能maxHpCalcを変更します。したがって、それはselfパラメータを持ち、その自己参照からstrengthdefenseを参照する必要があります。
  2. _maxHpCalcを呼び出す場合は、selfを参照する必要があります。私はそれを縛られた方法にしました、そして、それは働くためにインスタンスを必要とします。それが私的な方法であることを示すためにアンダースコアを付け加えました。
  3. あなたは、そうでない場合は、関数が呼び出された時点で定義されていない、strengthdefenseの値を設定した後maxHpCalcを呼び出す必要があります。
  4. player.maxHpは意味がありません。 playerはクラスであり、静的な プロパティmaxHpを持たないため、そのプロパティにアクセスするにはインスタンスが必要です。私はインスタンスを作成し、それを参照します。

コード:

class player: 
    def __init__(self, hp=1, maxHp=1, strength=4, defense=5): 
     self.hp = hp 
     self.strength = strength 
     self.defense = defense 
     self.maxHp = self._maxHpCalc() 

    def _maxHpCalc(self): 
     return self.strength + self.defense 

class orc(player): 
    def __init__(self, hp, maxHp, strength , defense): 
     super().__init__(hp, maxHp, strength, defense) 

p = player() 
o = orc(1,2,3,4) 

print(p.maxHp) 
print(o.maxHp) 

私はまた、あなたがそれを使用するが、他のパラメータからそれを計算していない場合は、なぜ、コンストラクタのパラメータmaxHpを含め、聞いていますか?

+0

アンダースコアを追加することが私の主な問題だったようです。私はそれがあなたが加えることができるものなのか分からなかった。これを削除すると同じエラーが発生し、実行可能に修正されます。 maxHp = 1の場合は、実際の目的はそこに存在しませんでした。私は数日間このことを混乱させてきたし、そこにいることを自分自身で混乱させました。私は仕事をする関数を得ることができなかったので、ブルートは別の関数の中でそれを強制的にtweek私の公式の中に強制して、それをクラッシュさせずに続けます また、printステートメントは9と7を与えますか? orc(1,2,3,4)とは何ですか? – Reederboard

+0

@Reederboardアンダースコアは、関数が定義され使用されているときに存在するか存在しない限り、プログラムに関係してはいけません。それは単なる大会です。 –

+0

アンダースコアが削除された場合、失敗します。self.maxHp = self.maxHpCalc() AttributeError: 'player'オブジェクトに 'maxHpCalc'属性がありません – Reederboard

関連する問題