1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RPG

Last updated at Posted at 2024-03-08

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

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)

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

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

#前
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の使い方についてアドバイスを頂きまして
再度確認したところ

#最初
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),

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

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


#修正前
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)

以上。

1
0
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?