개발일기

#8 파이썬 연습 (클래스를 활용하여 게임 만들기) 본문

오늘의 공부일기/파이썬 공부일기

#8 파이썬 연습 (클래스를 활용하여 게임 만들기)

츄98 2023. 3. 24. 12:13

오늘의 튜터님 말씀

클래스라는 것은 과자틀을 만드는 것이고 과자틀을 사용해서 찍어낸 쿠키가 인스턴스다..!

객체와 인스턴스는 동일한 말이다~

 

1. __init__ 함수 

class에 __init__메소드를 사용할 경우 인스턴스 생성 시 해당 메소드가 실행된다.
클래스에 init함수는 클래스의 인스턴스를 생성하는 과정에서 무조건 실행되는 함수이다.
class CookieFrame():
    def __init__(self, name):
        print(f"생성 된 과자의 이름은 {name} 입니다!")
        self.name = name
        
# name은 init함수에서 인자로 받고 있고, self.name = name이라고 name이라는 변수를 저장하고 있으므로 
# 나중에 name을 확인하고 싶으면 print(cookie.name)하면 된다.
# 근데 init 함수에서 name이라는 인자를 받고 있지만, 입력된 인자가 없으면 에러 발생!
# 인자가 입력되지 않은 경우, 입력된 경우 모두 코드를 실행시키고 싶으면 기본값을 지정해주면 된다.
# name = "default"
# init함수뿐 아니라 함수에서도 똑같이 활용 가능하다.

 

2. class 상속 :

클래스를 생성할 때 다른 클래스에 선언된 변수, 메소드 등의 기능들을 가져와 사용할 수 있도록 해주는 기능
동일한 코드를 여러 클래스에서 조금씩 수정해 사용하거나 모듈에 내장되어 있는 클래스를 변경할 때 주로 사용된다.
  • super()를 사용하면 부모 클래스의 코드를 그대로 사용할 수 있다.
  • 상속이 되면  부모 클래스의 매소드를 상속받아서 쓸 수 있다.
  • 상속 받은 클래스의 특정 코드를 변경해 사용할 때, 오버라이딩 활용하기!
  • 똑같은 이름의 매서드를 선언하면 부모클래스의 매서드가 아닌 자식클래스에 새로 선언된 매서드를 사용하게 된다.  
  • module의 코드를 변경하는 행위는 가능하면 하지 않는 것이 좋다.
  • 내 맘대로 수정했다가 원래 되던게 안될 수도 있고, 나중에 버전이 업데이트된 걸 설치했을 때 문제가 생길 수 있다.
  • 상속을 사용해서 오버라이딩을 활용하기! 
  • class 객체 공부는 구현부코드를 보고 하기!! 꼭 :)

 

3. 활용하기 :)

class 상속을 연습할 겸 게임을 한 번 만들어보았어요!

https://github.com/jisukim908/pythonpractice.git

 

GitHub - jisukim908/pythonpractice: Using python, make some interesting practices!

Using python, make some interesting practices! Contribute to jisukim908/pythonpractice development by creating an account on GitHub.

github.com

구경하실 분은, game폴더 속 Mostergame.py를 살펴보시면 됩니다! (즐겜하세요..^^)

 

몇 가지 코드를 보면서, 느낀 점과 배운 점을 적어보도록 하겠습니다!

먼저, 부모 클래스..!

class Monster():
    def __init__(self,hp):
        self.hp=hp

    def attack(self,damage):
        self.hp -= damage

    def healing(self,plus):
        self.hp += plus
        print(f'치유스킬 발동. 남은 hp : {self.hp}')

    def status_check(self):
        if self.hp > 0:
            print(f'마왕이 반격을 했다. 당신의 몬스터는 살았습니다. 남은 hp : {self.hp}')
        else:
            print(f'마왕이 반격을 했다. 당신의 몬스터는 죽었습니다.')

Monster라는 큰 부모클래스를 만들고, 자식 클래스로 EvilMoster, FireMonster, WaterMonster를 만들었어요.

오버라이딩과 super()을 활용하여 Evil, Fire, Water 몬스터들의 클래스 속성을 변경했습니다.

마왕과 우리 편 몬스터 둘 중 하나만 살 때까지 싸웠으면 좋겠어서 while문을 활용하여 코드를 짰습니다.

결과값이 한 번에 나오는 게 아니라 약간의 텀을 두고 나왔으면 좋겠어서 time.sleep을 이용했습니다.

print("용사여 환영합니다. 당신은 마왕을 무찔러야 합니다. 당신의 몬스터를 고르세요.")
time.sleep(2)
print("물몬스터(w)는 공격데미지가 상대적으로 높습니다. 불몬스터(f)는 치유력 회복이 느립니다.")
time.sleep(2)
choice = input("당신의 선택은? w 또는 f 중 하나를 써주세요.").strip()
print("당신의 몬스터가 공격을 시작합니다.")
time.sleep(2)

공격데미지나 치유스킬은 랜덤하게 줄 수 있게  random.randiant를 활용했고,

몬스터의 성질에 따라 범위가 다르게 조절했습니다.

#예시이고 실제 코드와 무관
evil.attack(damage=int(random.randint(1, 40)));
water.attack(damage=int(random.randint(10, 40)));
water.healing(plus=random.randint(1, 20));

마지막으로 if-break구문을 활용해서 hp가 0 이하가 되면 멈추게 했습니다.

솔직히.. 완벽한 확률게임입니다 ^^

저도 몇 번 해봤는데.. 어쩔 땐 이기고, 어쩔 땐 지더라군요 ㅋㅋ

여러분의 운을 확인해보세요 :)

 

지금까지 for문이나 if문은 많이 사용을 해봤지만, while 구문은 활용해보지 못했는데 이번에 while문을 사용해볼 수 있어서 좋았고,  class, class 상속을 충분히 연습할 수 있어서 좋았습니다 :)

 

수업듣는걸로 끝내지 말고, 직접 활용해보는 게 중요하다는 튜터님의 말씀을 따라서

요즘 개념공부한 걸 적더라도 직접 만들어보고 활용한 것도 같이 적고 있습니다~

(시간은 더.. 오래 걸리지만 ;; 확실히 이해도 잘 되고.. 생각한 걸 구현해보니 재미도 있습니다 ㅎㅎ)

이렇게 해나가다보면.. 실력이 늘겠죠?ㅜㅜ 제발..

더 열심히 하는 방법뿐이겠죠 ㅎㅎ 열심히 하겠습니다!!