티스토리 뷰

스타크래프트에는 레이스와 같은 공중 유닛도 굉장히 많은데요. 공중 유닛 중에도 레이스와 같이 공격이 가능한 공중 공격 유닛이 있는 반면 마린, 탱크와 같은 지상 유닛을 다른 위치로 수송만 하며 공격력은 없는 드랍쉽 같은 공중 유닛도 있습니다.

지상 유닛을 수송하기 위해 이동하는 드랍쉽

 

지상 유닛이 탑승 완료된 드랍쉽

공중 유닛의 경우 하늘을 날아서 이동하는데 이 기능은 지상 유닛에는 적용될 수 없는 내용이므로 날 수 있는 기능을 정의하는 클래스를 별도로 하나 만들겠습니다. 클래스 이름은 Flyable 이라고 하고 __init__() 생성자에는 날아서 이동할 때의 속도를 의미하는 flying_speed 를 멤버변수로 두겠습니다. 공중 유닛은 무게나 크기, 종류 및 이동 속도 업그레이드 여부에 따라 속도가 달라지거든요.

 

그리고 실제로 이동하는 동작을 fly() 함수에 정의할텐데, Flyable 클래스는 날아서 이동하는 기능만 제공하므로 어떤 유닛인지에 대한 정보는 따로 가지지 않도록 하겠습니다. 대신 fly() 함수를 호출할 때 유닛의 이름과 날아가는 방향 정보를 전달받도록 하지요.

# 날 수 있는 기능을 가진 클래스
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))

 

앞에서 멤버변수를 공부할 때 상대방에게 보이지 않는 클로킹이라는 특수한 기능을 가진 레이스를 소개드렸었는데요. 레이스는 하늘을 날아다니며 공격을 할 수 있는 공중 공격 유닛입니다. "공중" + "공격 유닛" 이죠. 지금까지 만든 클래스들 중에서 공격 유닛인 AttackUnit 에다가 "공중", 즉, 하늘을 날 수 있는 기능을 제공해주는 Flyable 클래스를 조합하면 공중 공격 유닛을 만들 수 있겠네요.

 

그럼 공중 공격 유닛을 위한 새로운 클래스를 만들어보겠습니다. 이름은 FlyableAttackUnit 으로 하구요, 이번에는 AttackUnit 과 Flyable 클래스를 함께 상속받도록 하겠습니다. 이렇게 2개 이상의 클래스를 상속받는 것을 다중 상속이라고 표현하며 형태는 다음과 같이 콤마(,)로 구분하여 부모 클래스들의 이름을 작성하면 됩니다.

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

 

그리고 상속받은 클래스들의 __init__() 생성자를 각각 호출해주면 됩니다.

# 공중 공격 유닛
class FlyableAttackUnit(AttackUnit, Flyable):
    def __init__(self, name, hp, damage, flying_speed): # 이름, 체력, 공격력, 공중 이동 속도
        AttackUnit.__init__(self, name, hp, damage) # 이름, 체력, 공격력
        Flyable.__init__(self, flying_speed) # 공중 이동 속도

 

이렇게 완성된 클래스를 통해 이번에는 발키리라는 유닛을 하나 만들어보겠습니다. 발키리는 공중 공격 유닛이며 한 번에 무려 14발의 미사일을 발사하는 강력한 유닛입니다. 특히 혼자 있을 때보다 여럿이 모여있을 때 적군에게 더욱 더 강력한 데미지를 입힐 수 있지요.

 

FlyableAttackUnit 클래스로부터 새로운 객체를 만들고 이름은 valkyrie 로 하겠습니다. 생성자에는 이름과 체력, 공격력, 그리고 하늘을 이동하는 속도 정보를 전달하겠습니다. 그 후에 Flyable 클래스에 정의된 fly() 함수를 호출하는데 이동할 유닛의 이름과 방향 정보를 전달값으로 넘기겠습니다.

# 발키리 : 공중 공격 유닛, 한번에 14발 미사일 발사.
valkyrie = FlyableAttackUnit("발키리", 200, 6, 5) # 이름, 체력, 공격력, 공중 이동 속도
valkyrie.fly(valkyrie.name, "3시") # 3시 방향으로 발키리를 이동

 

실행을 해보면 다음과 같이 발키리 유닛이 3시 방향으로 날아서 이동하는데 이동 속도는 5라는 것을 알 수 있네요.

발키리 : 3시 방향으로 날아갑니다. [속도 5]

 

클래스가 많아지고 상속관계가 생기다보니 이해가 어려울 수 있어서 다음 도표를 준비했습니다.

먼저 모든 유닛이 공통적으로 가지는 name, hp 를 가지는 일반 유닛 클래스인 Unit 이 있구요. 이를 상속받아서 공격력을 가지는 공격 유닛 클래스인 AttackUnit 을 정의하였습니다. 마린, 파이어뱃, 탱크를 만들기에 적합하죠.

 

그리고 공중 유닛을 위한 날 수 있는 기능을 가지는 Flyable 클래스를 정의하였습니다. 이 클래스는 그냥 날아가는 속도 정보와 날아가는 동작 메소드만 가지고 있지요.

 

마지막으로 공중 공격 유닛을 위해 AttackUnit 과 Flyable 을 다중 상속하는 FlyableAttackUnit 클래스를 만들었습니다. 레이스나 발키리를 만들기에 적합합니다.

 

도표를 통해 각 클래스들간의 관계를 이해하시고 지금까지 소개된 유닛을 어떤 클래스로, 또는 어떤 클래스들의 조합으로 만드는 게 좋을지 복습하신 후에 다음 장으로 넘어가시면 좋겠습니다.

 

 

지금까지 작성된 전체 코드입니다.

# 일반 유닛
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))

# 날 수 있는 기능을 가진 클래스
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) # 공중 이동 속도

# 발키리 : 공중 공격 유닛, 한번에 14발 미사일 발사.
valkyrie = FlyableAttackUnit("발키리", 200, 6, 5) # 이름, 체력, 공격력, 공중 이동 속도
valkyrie.fly(valkyrie.name, "3시") # 3시 방향으로 발키리를 이동
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함