プログラミング経験が浅いので、専門用語に間違いがあったりコードが稚拙であったりするかもしれませんがご容赦ください。
前提
以下の課題を解いています。is_alive変数を持たせる所で何か変なことになっている可能性が高いのですが、何がダメでどう直せば正しく動くのかが分かりません。
0. Warrior型を作成する。
Warrior型のオブジェクトはhealth, attackという2つの変数を持ち、それぞれ50, 5という数である。またis_aliveという変数も持ち、health > 0ならTrue、そうでなければFalseである。
0. Knight型を作成する。
Knight型はWarrior型の子クラスであり、Warrior型と同様にhealth, attack, is_aliveを持つ。attackが7である点以外はWarrior型と同じ。
0. fight(unit1, unit2)という関数を作成する。
unit1がunit2に攻撃し、unit2.healthがunit1.attackだけ減る。もしunit2が生きていれば(unit2.is_alive == Trueならば)unit2がunit1に攻撃し、unit1.healthがunit2.attackだけ減る。
これをどちらかのhealthが0以下になるまで繰り返す。このときunit1.is_alive == Trueなら関数fightはTureを、そうでなければFalseを返す。
発生している問題・エラーメッセージ
プログラムをコマンドプロンプトから実行したところ、終了しませんでした。Ctrl+Cで中止させたところ次のメッセージが表示されました。
Traceback (most recent call last): File "test.py", line 37, in <module> print(fight(chuck, bruce)) File "test.py", line 22, in fight unit_1.health -= unit_2.attack
該当のソースコード
Python
1class Warrior: 2 def __init__(self): 3 self.health = 50 4 self.attack = 5 5 6 # ここが怪しい 7 if self.health > 0: 8 self.is_alive = True 9 else: 10 self.is_alive = False 11 12 13class Knight(Warrior): 14 def __init__(self): 15 super().__init__() 16 self.attack = 7 17 18 19def fight(unit_1, unit_2): 20 while unit_1.is_alive == True and unit_2.is_alive == True: 21 unit_2.health -= unit_1.attack 22 if unit_2.is_alive == True: 23 unit_1.health -= unit_2.attack 24 25 if unit_1.is_alive == True: 26 return True 27 else: 28 return False 29 30 31# ここから下はコードが正しい結果を返すか確かめるためのものなので、課題本体は以上で終わりです。 32chuck = Warrior() 33bruce = Warrior() 34carl = Knight() 35dave = Warrior() 36mark = Warrior() 37 38 39print(fight(chuck, bruce)) 40print(fight(dave, carl)) 41print(chuck.is_alive) 42print(bruce.is_alive) 43print(carl.is_alive) 44print(dave.is_alive) 45print(fight(carl, mark)) 46print(carl.is_alive) 47
試したこと
じつは最初、is_alive変数ではなくis_alive()メソッドだと勘違いして以下のコードを書いていました。このコードはちゃんと作動し正しい結果を与えたのですが、仕様と異なるせいか正解とは判定されませんでした。そこでメソッドの部分だけ変更したところ、上記のような事態になりました。
Python
1class Warrior: 2 def __init__(self): 3 self.health = 50 4 self.attack = 5 5 6 def is_alive(self): 7 if self.health > 0: 8 return True 9 else: 10 return False 11 12 13class Knight(Warrior): 14 def __init__(self): 15 super().__init__() 16 self.attack = 7 17 18 19def fight(unit_1, unit_2): 20 while unit_1.is_alive() and unit_2.is_alive(): 21 unit_2.health -= unit_1.attack 22 if unit_2.is_alive(): 23 unit_1.health -= unit_2.attack 24 25 if unit_1.is_alive(): 26 return True 27 else: 28 return False 29 30 31chuck = Warrior() 32bruce = Warrior() 33carl = Knight() 34dave = Warrior() 35mark = Warrior() 36 37 38print(fight(chuck, bruce)) 39print(fight(dave, carl)) 40print(chuck.is_alive()) 41print(bruce.is_alive()) 42print(carl.is_alive()) 43print(dave.is_alive()) 44print(fight(carl, mark)) 45print(carl.is_alive()) 46
なぜis_aliveがメソッドではないと思ったかというと、課題の中に示されていた例ではis_aliveのあとに()が付いていなかったからです(この判断は少し自信がありません。本当にメソッドではなく変数なのでしょうか?)。
###教えていただきたいこと
0. 「is_aliveは()が付いていないのでメソッドではなく変数」というのは正しいのか?
0. is_alive変数をどのように記述すればちゃんと動作するのか?
回答2件
あなたの回答
tips
プレビュー