初心者です。初歩的な質問ですいません。
テキストでRPGの戦闘を題材にクラスの継承を勉強中です。
出題された問題は、勇者・戦士と魔法使いでは表示される文言を変えて出すために継承を利用していました。
print(self.name+"は"+enemy+"を攻撃した") #戦士、勇者の時
print(self.name+"は"+enemy+"に魔法を唱えた") #魔法使いの時
問題はクリアしたのですが、できればついでにもう少しリアルにしたいので、
魔法使いの攻撃については、wizardクラスのattackメソッドにある「魔法」に種類を追加したいです。
「炎」
「風」
「水」
などで、「魔法使いはスライムに炎を唱えた」などと表示されるようにしたいです。
python
1class Player(): 2 def __init__(self,name,spell): 3 self.name=name 4 self.spell=spell 5 6 def attack(self,enemy): 7 print(self.name+"は"+enemy+"を攻撃した") 8 9class Wizard(Player): 10 11 def attack(self,enemy,spell): 12 print(self.name+"は"+enemy+"に"+self.spell+"を唱えた") 13 14 15hero=Player("勇者") 16warrior=Player("戦士") 17wizard=Wizard("魔法使い") 18party=[hero,warrior,wizard] 19 20for player in party: 21 if player==wizard: 22 maho=["fire","water","riot"] 23 fire=(Wizard("炎")) 24 water=(Wizard("水")) 25 riot=(Wizard("雷")) 26 for spell in maho: 27 spell.attack() 28 else: 29 player.attack("スライム")
spellの使い方でエラーが出てしまいます。
Traceback (most recent call last):
File "Main.py", line 15, in <module>
hero=Player("勇者")
TypeError: init() missing 1 required positional argument: 'spell'
どのようにspellを使えばいいのでしょうか?
上の文章だと、spellがオブジェクトになってしまっているのだと思います。
コードはコードブロック<code>で囲んでください。
> おそらくループの順番などの問題でうまく動きません。
ということですが、どこでそう思ったか追記したほうがいいと思います。
https://teratail.com/tour を参考にコード部分をシンタックスハイライト・マークダウンで囲ってください。質問は再編集できます。また、「上手く動きません」の実行結果と「こう動いてほしい」という結果を併せて記載してください。
ご指摘ありがとうございます。
修正します。
魔法は一種類だけが唱えられる
ってのが希望です。
randomを使用して実現できました。
<code>
```
import random
class Player:
def __init__(self, name):
self.name = name
def attack(self, enemy):
print(self.name+"は"+enemy+"を攻撃した")
class Wizard(Player):
def attack(self, enemy, spell):
print(self.name+"は"+enemy+"に"+spell+"を唱えた")
hero = Player("勇者")
warrior = Player("戦士")
wizard = Wizard("魔法使い")
party = [hero, warrior, wizard]
for player in party:
if player == wizard:
maho = ["炎", "水", "雷"]
num=len(maho)
num1=random.randrange(num)
spell=maho[num1]
wizard.attack("スライム",spell)
else:
player.attack("スライム")
```
</code>
すいません、私の伝え方が悪かったですね。
hayataka2049さんの言っておられますとおり、質問を編集してください。
誤解を与えてしまい、すみません。