본문 바로가기
  • Coding & Book
학습단/Python 학습단

9-2장 클래스(게임 만들기2)

by 루이3 2023. 7. 21.

게임 소개

  • 세 종족 사이에 전쟁을 그린 게임입니다.
  • 유닛을 최대한 빠르게 많이 만들어 적을 궤멸시키는 게임입니다.
  • 종족은 보병, 탱크, 전투기 와 같은 유닛을 생성합니다.
  • 공격유닛과 공격할수 없는 유닛이 있습니다.
  • 의무병이 공격할수 없는 유닛에 해당 합니다. 

 

 

상속

  • 클래스의 내용을 다른 클래스가 물려받아 사용하는 것을 뜻합니다.
  • 클래스에 공통되는 부분을 중복으로 작성하지 않고 재사용할수 있습니다.
  • 아래 코드는 9장의 유닛과 공격 유닛 코드를 수정한 것입니다.

 

class Unit:
    def __init__(self, name, hp):
        self.name = name 
        self.hp = hp 

class AttackUnit(Unit):
    def __init__(self, name, hp, damage):
        Unit.__init__(self, name, hp)
        self.damage = damage
    
    def attack(self, location):
        print("{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage))


    def damaged(self, damage):
        print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
        self.hp -= damage
        print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
        if self.hp <= 0:
            print("{0} : 파괴됐습니다.".format(self.name))

 

 

다중 상속

  • 한 클래스가 두개 이상의 다른 클래스로부터 상속을 받는것을 의미합니다.
  • 형태는 아래 1번과 같습니다.
  • 지상 유닛을 다른 위치로 수송하면서 공격력이 없는 수송선같은 유닛을 만들어주겠습니다.

1번)

class 자식 클래스(부모 클래스1, 부모 클래스2,..):

 

2번)

class Flyable:
    def __init__(self, flying_speed):
        self.flying_speed = flying_speed
    
    def fly(self, name, location):
        print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))


class FlyableAttackUnit(AttackUnit, Flyable):
    def __init__(self, name, hp, damage, flying_speed):
        AttackUnit.__init__(self, name, hp, damage)
        Flyable.__init__(self, flying_speed)

 

 

메소드 오버라이딩

  • 상속관계일때 자식 클래스에서 부모 클래스에 정의한 메서드를 그대로 사용하지 않고
    같은 이름으로 메서드를 새롭게 정의해 사용하는 방법입니다.

 

pass

  • 아무것도 하지 않고 그냥 넘어간다는 의미로 사용합니다.

 

 

super()

  • 클래스에 이름을 적지 않고 부모 클래스에 접근할수 있습니다.
  • 상속하는  부모 클래스의 메서드를 사용할때 필요합니다.

 

 

 

게임만들기

  • 이동 동작을 나타내는 move() 메서드를 정의하겠습니다.
  • 지상유닛에 기동성이 좋은 호버 바이크와 공중유닛에 체력과 공격력이 좋은 우주 순양함을 만들어주겠습니다.
  • 유닛이 많아 개별적으로 관리가 어려우므로 move() 메서드를 오버라이딩해서
    재정의 한 메서드에서 fly()를 호출하도록 바꾸겠습니다.
class Unit:
    def __init__(self, name, hp, speed):
        self.name = name
        self.hp = hp
        self.speed = speed

    def move(self, location):
        print("[지상 유닛 이동]")
        print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))


class AttackUnit(Unit):
    def __init__(self, name, hp, damage, speed):
        Unit.__init__(self, name, hp, speed)
        self.damage = damage

    def attack(self, location):
        print("{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage))

    def damaged(self, damage):

        print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
        self.hp -= damage

        print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
        if self.hp <= 0:
            print("{0} : 파괴됐습니다.".format(self.name))

class Flyable:
    def __init__(self, flying_speed):
        self.flying_speed = flying_speed
    
    def fly(self, name, location):
        print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))



class FlyableAttackUnit(AttackUnit, Flyable):
    def __init__(self, name, hp, damage, flying_speed):
        AttackUnit.__init__(self, name, hp, damage, 0)
        Flyable.__init__(self, flying_speed)

    def move(self, location):
        print("[공중 유닛 이동]")
        self.fly(self.name, location)

'학습단 > Python 학습단' 카테고리의 다른 글

9-3장(게임 만들기3)  (0) 2023.07.24
3주차 완료입니다.  (0) 2023.07.21
9장 클래스(게임 만들기)  (0) 2023.07.20
8-2장 파일 입출력  (0) 2023.07.19
8장 입출력  (0) 2023.07.18