8일차 내일배움캠프 개발일지

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 게임을 완성해보려고 합니다.

 

 

언젠가 개발킹이 되는 그날까지...

그럼 안뇽