class Player:
###
중략
###
def attack(self):
print("일반 공격 돌입!!")
attack = random.randint(self.power-10, self.power+10)
print(f"당신은 {attack}의 피해를 입혔다!")
return attack
class Monster():
###
중략
###
def damage(self, attack):
self.hp = self.hp - attack
print(f"당신은 {attack}만큼의 피해를 입었습니다!")
p.attack()
m.damage(attack)
>>> NameError: name 'attack' is not defined
분명 attack을 return했는데... 값이 없다고 한다
뭐가 문제지?
return 된 값을 class 바깥의 변수에 담아주지 않아서 값을 찾을 수 없었던 것!!
class Player:
###
중략
###
def attack(self):
print("일반 공격 돌입!!")
attack = random.randint(self.power-10, self.power+10)
print(f"당신은 {attack}의 피해를 입혔다!")
return attack
class Monster():
###
중략
###
def damage(self, attack):
self.hp = self.hp - attack
print(f"당신은 {attack}만큼의 피해를 입었습니다!")
# class 바깥에서 변수 값을 할당
p_attack = p.attack()
m.damage(p_attack)
class Player:
###
중략
###
def attack(self):
print("일반 공격 돌입!!")
attack = random.randint(self.power-10, self.power+10)
print(f"당신은 {attack}의 피해를 입혔다!")
return attack
class Monster():
###
중략
###
def damage(self, attack):
self.hp = self.hp - attack
print(f"당신은 {attack}만큼의 피해를 입었습니다!")
# class 바깥에서 변수 값을 할당
m.damage(p.attack())
코드를 깔끔하게 쓰는 건 아랫쪽이 낫긴 하지만
나의 경우 time.sleep를 통해 결과값을 천천히 도출시키고 싶었기 때문에 1번을 채택했다.
코드를 깔끔하게 쓰는 것도 중요하지만, 활용 방식에 따라서 차선을 선택하는 게 나을때도 있다는 걸 느꼈다.
class 인스턴스를 random으로 뽑아내고 싶을 떄
-> list 사용
# 인스턴스 랜덤으로 뽑기
class Monster():
def __init__(self, type, hp, power):
self.type = type
self.hp = hp
self.hp_max = hp
self.power = power
###
중략
###
monster_list = [
Monster(type="용용이", hp=100, power=20),
Monster(type="칼칼이", hp=200, power=25),
Monster(type="빵빵이", hp=300, power=30),
Monster(type="쌩쌩이", hp=400, power=35),
Monster(type="펑펑이", hp=500, power=40)
]
m = random.choice(monster_list)
이렇게 list에 랜덤한 인스턴스 후보들을 넣어주고,
random.choice를 사용, 할당하면 랜덤으로 하나가 뽑힌다!
리스트랑 딕셔너리를 잘만 활용하면 코드를 정말 깔끔하게 만들 수 있구나 싶다.
특히 random 같은 함수랑 같이 붙으면 가독성이 더 좋아지는듯.