RPG

https://paiza.jp/works/mondai/class_primer/class_primer__heros

今までの問題の応用だったので
難しくはなかったですね。
時間はかかりますが。。。

```py
class Status():
    #当初の勇者のステータス
    def __init__(self,level,hp,attack,defense,speed,clever,fortune):
        self.level = int(level)
        self.hp = int(hp)
        self.attack = int(attack)
        self.defense = int(defense)
        self.speed = int(speed)
        self.clever = int(clever)
        self.fortune = int(fortune)
    
    def levelup(self, add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune):
        self.level += 1
        self.hp += int(add_hp)
        self.attack += int(add_attack)
        self.defense += int(add_defense)
        self.speed += int(add_speed)
        self.clever += int(add_clever)
        self.fortune += int(add_fortune)
    
    def muscle_training(self, add_hp, add_attack):
        self.hp += int(add_hp)
        self.attack += int(add_attack)

    def running(self, add_defense, add_speed):
        self.defense += int(add_defense)
        self.speed += int(add_speed)

    def study(self, add_clever):
        self.clever += int(add_clever)

    def pray(self, add_fortune):
        self.fortune += int(add_fortune)
        
    def __str__(self):
        """表示文字列に変換する"""
        return f"{self.level} {self.hp} {self.attack} {self.defense} {self.speed} {self.clever} {self.fortune}"



N,K= map(int,input().split())
#勇者たちのステータスを登録
braves = [Status(*input().split()) for _ in range(N)]

#勇者たちのトレーニングコマンドメソッド
def levelup(number,add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune):
    braves[int(number)-1].levelup(add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune)

def muscle_training(number,add_hp,add_attack):
    braves[int(number)-1].muscle_training(add_hp,add_attack)

def running(number,add_defense, add_speed):
    braves[int(number)-1].running(add_defense,add_speed)

def study(number,add_clever):
    braves[int(number)-1].study(add_clever)
    
def pray(number,add_fortune):
    braves[int(number)-1].pray(add_fortune)
#ここを上の関数たちをつかってラムダ関数で書ければ短くできる
commands = {
    'levelup':levelup,
    'muscle_training' :muscle_training,
    'running' :running,
    'study' :study,
    'pray' :pray,
}

for _ in range(K):
    number,command,*args = input().split()
    commands[command](number,*args)


for brave in braves:
    print(brave)

```
ただ一点、コメントで教えてもらったコマンドメニューを辞書で作るところですが、
上のをラムダ関数で書こうとしてかけず、いったんそのまま書いてました。。。
関数名とか引数をどう書こうか迷っていたので。。。
時間もなかったのでいったんそのまま書きました。
また時間がある時に調べて書いてみます


＊＊＊
解答見たところで直したほうがいいなと思ったところ

```py
#前
def __str__(self):
        """表示文字列に変換する"""
        return f"{self.level} {self.hp} {self.attack} {self.defense} {self.speed} {self.clever} {self.fortune}"

#修正後
def print(self):
        print(self.level,self.hp,self.attack,self.defense,self.speed,self.clever,self.fortune)

```
ですね。全部数値だし。

***
コメント欄からラムダ式と**argの使い方についてアドバイスを頂きまして
再度確認したところ

```py
#最初
def levelup(number,add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune):
    braves[int(number)-1].levelup(add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune)

#ラムダ
 'levelup': lambda brave, *args: brave.levelup(*args),

```
https://www.sejuku.net/blog/23677

要するにdefの代わりにlambdaと書いて、その横に引数そして、セミコロン(:)の後に引数を使用した処理内容という形式にて書く。

ということなので、levelup関数について考えてみます
levelup関数はそもそもbraves[int(number)-1]がイコールbraveなので、
これを引数とし、さらに全ての引数を全部*argsで代用します
そうすると下記のようになります
私がわからなかった、ひっかかっていたのはbraveの部分ですね。
クラスのselfの部分かーと今さら気づきました。

```py

#修正前
def levelup(number,add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune):
    braves[int(number)-1].levelup(add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune)
    
##↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

def levelup(brave,*args):
    brave.levelup(*args)

##↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

#ラムダ(+辞書）
'levelup' : lambda brave,*args: brave.levelup(*args)

#もちろん、braves[int(number)-1]がbraveになったのでちょっと変える必要がある
```py
for _ in range(K):
    number,command,*args = input().split()
    commands[command](number,*args)
```

以上。