인프런 커뮤니티 질문&답변

yokxim님의 프로필 이미지
yokxim

작성한 질문수

파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자

스타크래프트 프로젝트 후반전

탱크 시즈모드에서 공격력 2배가 실행이 안됩니다.

작성

·

127

0

안녕하세요. 제가 영상을 보고 이해하면서 교수님이 주신 코드를 그대로 따라 적었는데 다른 부분에는 문제가 없지만, 탱크 시즈모드 전환되는게 오류가 나는것 같습니다. 공격 모드 준비 과정에서 마린은 스팀팩을 쓰고, 탱크는 시즈모드로 전환하고, 레이스는 클로킹 모드로 전환해야 하는데 그중 탱크만 모드 전환이 안되는것 같습니다. 어디가 문제인 건가요?

# 스타크래프트 프로젝트

from random import *

# 일반 유닛
class Unit:
    def __init__(selfnamehpspeed):
        self.name = name
        self.hp = hp
        self.speed = speed
        print("{0} 유닛이 생성되었습니다.".format(name)) # 이 format에서는 그냥 name을 받아도 self.name을 받아도 상관없다.

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

    # 피격 시 (일반 유닛도 피해를 입을 수 있기에 제일 부모 클래스인 Unit으로 메소드를 이동하였다.)
    def damaged(selfdamage): 
        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__(selfflying_speed):
        self.flying_speed = flying_speed
    
    def fly(selfnamelocation):
        print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))

# 공격 유닛
class AttackUnit(Unit):
    def __init__(selfnamehpspeeddamage): 
        Unit.__init__(self, name, hp, speed)
        self.damage = damage

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

# 공중 공격 유닛
class FlyableAttackUnit(AttackUnitFlyable):
    def __init__(selfnamehpdamageflying_speed):
        AttackUnit.__init__(self, name, hp, 0, damage) 
        Flyable.__init__(self, flying_speed)

    def move(selflocation):
        self.fly(self.name, location)

# ------------------------------
# 마린 클래스 생성
class Marine(AttackUnit):
    def __init__(self):
        AttackUnit.__init__(self"마린"4015)
    
    # 스팀팩 : 일정 시간 동안 공격 속도 증가, 자신의 체력을 10 희생
    def stimpack(self):
        if self.hp > 10:
            self.hp -= 10
            print("{0} : 스팀팩을 사용합니다. (Hp 10 감소)".format(self.name))
        else:
            print("{0} : 체력이 부족하여 스팀팩을 사용하지 않습니다.".format(self.name))

# 탱크 클래스 생성
class Tank(AttackUnit):
    def __init__(self):
        AttackUnit.__init__(self"탱크"150135)
        self.seize_mode = False

    # 시즈 모드 : 탱크를 지상에 고정시켜, 더 높은 공격력으로 공격 가능
    seize_developed = False # 시즈모드 개발여부

    def set_seize_mode(self):
        if Tank.seize_developed == False:
            return
        
        # 현재 시즈모드가 아닐 때 -> 시즈모드
        if self.seize_mode == False:
            print("{0} : 시즈모드로 전환합니다.".format(self.name))
            self.damage *= 2
            self.seize_mode = True

        # 현재 시즈모드일 때 -> 시즈모드 해제
        else:
            print("{0} : 시즈모드를 해제합니다.".format(self.name))
            self.damage /= 2
            self.seize_mode = False

# 레이스 클래스 생성
class Wraith(FlyableAttackUnit):
    def __init__(self):
        FlyableAttackUnit.__init__(self"레이스"80205)
        self.cloaked = False # 처음 생성되었을 때 클로킹 모드 해제 상태

    # 클로킹 모드 : 적의 시야에서 보이지 않음
    def cloaking(self):
        if self.cloaked == True:
            print("{0} : 클로킹 모드 해제합니다.".format(self.name))
            self.cloaked == False
        else:
            print("{0} : 클로킹 모드 실행합니다.".format(self.name))
            self.cloaked == True

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

def game_over():
    print("Player : GG")
    print("[Player} 님이 게임에서 퇴장하셨습니다.")

# --------------------------------------------
# 실제 게임 시작
game_start()

# 마린 3기 생성
m1 = Marine()
m2 = Marine()
m3 = Marine()

# 탱크 2기 생성
t1 = Tank()
t2 = Tank()

# 레이스 1기 생성
w1 = Wraith()

# 유닛 일괄 관리
# 다중 선택이 용이하게 되게 하기 위해서 리스트를 만들어서 다 집어넣는다.
attack_units = []
attack_units.append(m1)
attack_units.append(m2)
attack_units.append(m3)
attack_units.append(t1)
attack_units.append(t2)
attack_units.append(w1)

# 전군 이동
for unit in attack_units:
    unit.move("1시")

# 탱크 시즈모드 개발
Tank.seize_developed == True
print("[알림] 탱크 시즈 모드 개발이 완료되었습니다.")

# 공격 모드 준비 (마린 : 스팀팩, 탱크 : 시즈모드, 레이스 : 클로킹)
for unit in attack_units:
    if isinstance(unit, Marine): # 만들어진 개체가 어떤 클래스의 개체인지 확인하는 작업이다.
        unit.stimpack()
    elif isinstance(unit, Tank):
        unit.set_seize_mode()
    elif isinstance(unit, Wraith):
        unit.cloaking()

# 전군 공격
for unit in attack_units:
    unit.attack("1시")

# 전군 피해
for unit in attack_units:
    unit.damaged(randint(521)) # 공격은 5 ~ 20의 난수로 피해를 입음

# 게임 종료
game_over()
------------------------------------------
[알림] 새로운 게임을 시작합니다. 마린 유닛이 생성되었습니다. 마린 유닛이 생성되었습니다. 마린 유닛이 생성되었습니다. 탱크 유닛이 생성되었습니다. 탱크 유닛이 생성되었습니다. 레이스 유닛이 생성되었습니다. 마린 : 1시 방향으로 이동합니다. [속도 1] 마린 : 1시 방향으로 이동합니다. [속도 1] 마린 : 1시 방향으로 이동합니다. [속도 1] 탱크 : 1시 방향으로 이동합니다. [속도 1] 탱크 : 1시 방향으로 이동합니다. [속도 1] 레이스 : 1시 방향으로 날아갑니다. [속도 5] [알림] 탱크 시즈 모드 개발이 완료되었습니다. 마린 : 스팀팩을 사용합니다. (Hp 10 감소) 마린 : 스팀팩을 사용합니다. (Hp 10 감소) 마린 : 스팀팩을 사용합니다. (Hp 10 감소) 레이스 : 클로킹 모드 실행합니다. 마린 : 1시 방향으로 적군을 공격 합니다. [공격력 5] 마린 : 1시 방향으로 적군을 공격 합니다. [공격력 5] 마린 : 1시 방향으로 적군을 공격 합니다. [공격력 5] 탱크 : 1시 방향으로 적군을 공격 합니다. [공격력 35] 탱크 : 1시 방향으로 적군을 공격 합니다. [공격력 35] 레이스 : 1시 방향으로 적군을 공격 합니다. [공격력 20] 마린 : 5 데미지를 입었습니다. 마린 : 현재 체력은 25입니다. 마린 : 14 데미지를 입었습니다. 마린 : 현재 체력은 16입니다. 마린 : 15 데미지를 입었습니다. 마린 : 현재 체력은 15입니다. 탱크 : 12 데미지를 입었습니다. 탱크 : 현재 체력은 138입니다. 탱크 : 16 데미지를 입었습니다. 탱크 : 현재 체력은 134입니다. 레이스 : 14 데미지를 입었습니다. 레이스 : 현재 체력은 66입니다. Player : GG [Player} 님이 게임에서 퇴장하셨습니다.

답변 2

1

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요!

# 탱크 시즈모드 개발
Tank.seize_developed == True
print("[알림] 탱크 시즈 모드 개발이 완료되었습니다.")

부분에 문제가 있어 보입니다.

= 이 2개 들어가서 == 이렇게 되어있네요!

하나 제거하시고 다시 돌려보시겠어요? 

감사합니다.^^

0

yokxim님의 프로필 이미지
yokxim
질문자

실행 결과입니다.

----------------------------------------------------------

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

마린 유닛이 생성되었습니다.

마린 유닛이 생성되었습니다.

마린 유닛이 생성되었습니다.

탱크 유닛이 생성되었습니다.

탱크 유닛이 생성되었습니다.

레이스 유닛이 생성되었습니다.

마린 : 1시 방향으로 이동합니다. [속도 1]

마린 : 1시 방향으로 이동합니다. [속도 1]

마린 : 1시 방향으로 이동합니다. [속도 1]

탱크 : 1시 방향으로 이동합니다. [속도 1]

탱크 : 1시 방향으로 이동합니다. [속도 1]

레이스 : 1시 방향으로 날아갑니다. [속도 5]

[알림] 탱크 시즈 모드 개발이 완료되었습니다.

마린 : 스팀팩을 사용합니다. (Hp 10 감소)

마린 : 스팀팩을 사용합니다. (Hp 10 감소)

마린 : 스팀팩을 사용합니다. (Hp 10 감소)

레이스 : 클로킹 모드 실행합니다.

마린 : 1시 방향으로 적군을 공격 합니다. [공격력 5]

마린 : 1시 방향으로 적군을 공격 합니다. [공격력 5]

마린 : 1시 방향으로 적군을 공격 합니다. [공격력 5]

탱크 : 1시 방향으로 적군을 공격 합니다. [공격력 35]

탱크 : 1시 방향으로 적군을 공격 합니다. [공격력 35]

레이스 : 1시 방향으로 적군을 공격 합니다. [공격력 20]

마린 : 18 데미지를 입었습니다.

마린 : 현재 체력은 12입니다.

마린 : 19 데미지를 입었습니다.

마린 : 현재 체력은 11입니다.

마린 : 19 데미지를 입었습니다.

마린 : 현재 체력은 11입니다.

탱크 : 6 데미지를 입었습니다.

탱크 : 현재 체력은 144입니다.

탱크 : 7 데미지를 입었습니다.

탱크 : 현재 체력은 143입니다.

레이스 : 21 데미지를 입었습니다.

레이스 : 현재 체력은 59입니다.

Player : GG

[Player} 님이 게임에서 퇴장하셨습니다.

yokxim님의 프로필 이미지
yokxim

작성한 질문수

질문하기