2021. 12. 22. 20:14ㆍ개발일지/내일배움캠프 TIL
사실 오늘은 개발일지를 쓰지 않아야 할 것 같았습니다.
턴제 rpg 게임 만들기 프로젝트를 진행했지만
제한시간 내에 끝낼 수 없었고,
코드를 적어나가려고 하니 아직 클래스와 함수에 대한 지식이
완벽하게 정립되어 있지 않은 상태인 것을 확인할 수 있었기 때문입니다.
튜터님이 진행하신 클래스를 사용하는 법을 확인한 순간
저는 클래스 사용 자체를 잘못하고 있었다는 것을 알 수 있었습니다.
class Object:
hp = None
normal_atk_dmg = None
name = None
def atk(self, enemy_hp):
print("몸통박치기!")
return enemy_hp - self.normal_atk_dmg
# 자식 클래스로 플레이어 생성
class Player(Object):
hp = 200
normal_atk_dmg = 30
magic_atk_dmg = 50
name = "전사"
제가 작성한 부모. 자식 간 상속 입니다.
자식 클래스를 보시면 뭔가 이상하지 않나요?
부모 클래스에서 이미 정의한 변수를 다시 적은 것입니다.
이러한 오류가 왜 나왔을까요?
그것은 부모 클래스에서 생성자를 입력하지 않았기 때문입니다.
그리고 클래스에 적는 것이 아닌 함수에 그 값을 매개변수로 넣은 것을
가져오는 형태가 되어야하겠습니다.
class Object:
def __init__(self, name, hp, power):
self.name = name
self.hp = hp
self.power = power
def attack(self, target):
print(f"{self.name}이(가) {target.name}을(를) 공격!")
print(f"{target.name}에게 {self.power}만큼의 데미지!")
target.hp = target.hp - self.power
if (target.hp <= 0):
print(f"{target.name}을(를) 죽였습니다!")
else:
print(f"{target.name}의 HP가 {target.hp}이 되었습니다")
class Player(Object):
def magic(self, target):
print(f"{self.name}이(가) {target.name}에게 마법을 사용!")
print(f"{target.name}에게 50만큼의 데미지!")
target.hp = target.hp - 50
if (target.hp <= 0):
print(f"{target.name}을(를) 죽였습니다!")
else:
print(f"{target.name}의 HP가 {target.hp}이 되었습니다")
class Monster(Object):
def cure(self):
self.hp = self.hp + 10
print(f"{self.name}이 체력을 10 회복했습니다!")
def stay(self):
print(f"{self.name}이 대기했습니다!")
차이가 느껴지시나요? 저는 클래스를 사용했지만 전혀 클래스를 이해하지 못한 채로 사용하다보니
클래스가 활용할 수 있는 부분을 사용할 수 없었던 것입니다.
class Monster(Object):
hp = 100
normal_atk_dmg = random.randint(10, 30)
name = "미니고블린", "고블린", "슈퍼고블린"
def __await__(self):
print(" 이 대기합니다.")
return
def hp_heal(self):
print("명상치료!")
print("자신의 체력을 10만큼 회복했다.")
self.hp = self.hp + 10
# 인스턴스 과정을 진행
player = Player()
monster1 = Monster()
monster2 = Monster()
monster3 = Monster()
그리고 제가 만든 이 코드 역시 문제가 발생합니다.
데미지를 정해진 범위 내에서 랜덤으로 주고 싶다는 생각까진 좋았으나.
그 밑에 변수로 생성한 name이 문제가 됩니다.
저는 이름을 입력하여 바로바로 찾을 수 있는 형태를 만들고 싶었지만
처음부터 꼬인 코드를 되돌리기엔 너무 늦어버렸죠.
위 방식으로 하다간 몬스터를 생성할 때마다 인스턴스 과정을 진행해야할 것입니다.
class Monster(Object):
def cure(self):
self.hp = self.hp + 10
print(f"{self.name}이 체력을 10 회복했습니다!")
def stay(self):
print(f"{self.name}이 대기했습니다!")
def createobjects():
Warrior = Player('전사', 100, 10)
# 이름으로 해당 몬스터 인스턴스를 찾을 수 있도록, 딕셔너리 형태로 Monsters 를 묶어놓음
Monsters = {}
Monsters['미니고블린'] = Monster('미니고블린', 10, 10)
Monsters['고블린'] = Monster('고블린', 30, 30)
Monsters['슈퍼고블린'] = Monster('슈퍼고블린', 50, 50)
return Warrior, Monsters
제출 시간이 다 되니 제 코드에 문제가 있다는 것을 깨달을 수 있었습니다.
오늘 스스로 게임을 만들 수 있다는 생각에 들떠있었지만
컴퓨터가 자동으로 게임을 실행하고 종료하는 것을 만들 수 밖에 없었습니다.
해설에 나온 코드를 보고 오늘은 튜터님이 만드신 코드의 로직을 공부하고
함수와 클래스에 대해서 한번 더 복습하는 시간을 가졌습니다.
딕셔너리를 만들고 생성자의 매개변수 형태에 맞게 넣어주는 방법은
훨씬 깔끔하고 정확한 방법이었습니다.
예전에 정말로 제가 안다고 생각한 개념이
실제로 쓸 날이 왔을 때 생각이 나지 않았던 경험을 했습니다.
이번 코드를 작성하면서도 이러한 상황이 되니 많이 답답했지만
어쩌겠나요. 저는 아직 공부를 하는 과정에 있으니
다음에 사용할 때는 제대로 작성할 수 있다는 마음가짐으로 공부를 했습니다.
오늘 이렇게나 생성자의 중요성을 알게 되었으니
주말에 다시 스스로 프로젝트를 진행하여
저만의 턴제 rpg 게임을 완성해보려고 합니다.
언젠가 개발킹이 되는 그날까지...
그럼 안뇽
'개발일지 > 내일배움캠프 TIL' 카테고리의 다른 글
10일차 내일배움캠프 개발일지 (0) | 2021.12.25 |
---|---|
9일차 내일배움캠프 개발일지 (0) | 2021.12.24 |
7일차 내일배움캠프 개발일지 (0) | 2021.12.21 |
6일차 내일배움캠프 개발일지 (0) | 2021.12.20 |
5일차 내일배움캠프 개발일지 (0) | 2021.12.18 |