티스토리 뷰

스타크래프트에는 유닛을 뽑는 수에 제한이 있습니다. 처음 게임을 시작할 때 8 만큼의 인구 수에 해당하는 유닛을 만들 수 있는데, 그 수를 초과하게 되면 더 이상 유닛을 뽑지 못하게 되지요. 이 때 더 많은 유닛을 계속하여 뽑기 위해서는 각 종족별로 무언가를 더 해줘야 하는데 테란의 경우 서플라이 디폿이라는 건물을 지으면 됩니다. 서플라이 디폿 건물이 하나씩 늘어날 때마다 인구 수 8 만큼 유닛을 더 만들 수 있게 되는 것이죠.

 

 

이번에는 건물을 위한 클래스를 하나 만들어 보겠습니다. 건물도 일반 유닛처럼 이름과 체력이 있는데 적군으로부터 공격을 받으면 파괴될 수가 있습니다. Unit 클래스에 공통 속성이 있으니 이를 상속 받아서 만들도록 하구요. 건물을 지을 때는 어느 위치에 지을지 플레이어가 정해야 하는데 이들을 모두 포함하여 name, hp, location 이라고 하겠습니다.

 

그런데 건물은 클래스를 정의하기는 하는데 __init__() 생성자의 세부 내용은 일단은 그냥 내버려 두겠습니다. 다른 작업을 먼저 하고 나서 나중에 코드를 완성한다고 가정할게요. 이럴 때 파이썬에서는 pass 를 쓸 수 있습니다.

# 건물
class BuildingUnit(Unit):
    def __init__(self, name, hp, location):
        pass

# 서플라이 디폿 : 건물, 1개 건물 = 8 유닛.
supply_depot = BuildingUnit("서플라이 디폿", 500, "7시") # 체력 500, 생성 위치 7시

이렇게만 한 상태에서 서플라이 디폿 객체를 만들고 실행을 해보면 에러 없이 잘 실행되는 것을 볼 수 있습니다. 여기서 pass 는 아무것도 하지 않고 일단은 그냥 넘어간다는 의미로 사용됩니다. 즉, __init__() 생성자는 실제로는 완성되지 않았지만 마치 완성된 것처럼 보여질 수 있는 것이죠.

 

pass 는 다른 곳에서도 사용이 가능합니다. 위 코드에 이어서 함수를 2개 만들어볼게요. 게임 시작을 알리는 game_start() 함수와 게임 종료를 알리는 game_over() 함수입니다. game_start() 에서는 print() 를 통해 문구를 출력하는데 game_over() 에서는 그냥 pass 로만 적어둘게요.

def game_start():
    print("[알림] 새로운 게임을 시작합니다.")

def game_over():
    pass

game_start()
game_over()

 

실행 결과는 다음과 같습니다.

[알림] 새로운 게임을 시작합니다.

game_start() 함수에서는 정의된 동작을 수행하고 game_over() 함수에서는 pass 를 통해 그냥 넘어가게 된 것이죠. 함수 뿐 아니라 if, for, while 등에서도 pass 를 사용하여 당장은 세부 동작을 정의하지 않은 채로 뒀다가 나중에 다시 코드를 완성하도록 할 수가 있습니다.

 

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

# 일반 유닛
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, speed, damage):
        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, 0, damage)
        Flyable.__init__(self, flying_speed)

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

# 건물
class BuildingUnit(Unit):
    def __init__(self, name, hp, location):
        pass

# 서플라이 디폿 : 건물, 1개 건물 = 8 유닛.
supply_depot = BuildingUnit("서플라이 디폿", 500, "7시") # 체력 500, 생성 위치 7시

def game_start():
    print("[알림] 새로운 게임을 시작합니다.")

def game_over():
    pass

game_start()
game_over()
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함