안녕하세요. 제가 영상을 보고 이해하면서 교수님이 주신 코드를 그대로 따라 적었는데 다른 부분에는 문제가 없지만, 탱크 시즈모드 전환되는게 오류가 나는것 같습니다. 공격 모드 준비 과정에서 마린은 스팀팩을 쓰고, 탱크는 시즈모드로 전환하고, 레이스는 클로킹 모드로 전환해야 하는데 그중 탱크만 모드 전환이 안되는것 같습니다. 어디가 문제인 건가요?
# 스타크래프트 프로젝트
from random import *
# 일반 유닛
class Unit:
def __init__(self, name, hp, speed):
self.name = name
self.hp = hp
self.speed = speed
print("{0} 유닛이 생성되었습니다.".format(name)) # 이 format에서는 그냥 name을 받아도 self.name을 받아도 상관없다.
# 이동 시
def move(self, location):
print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))
# 피격 시 (일반 유닛도 피해를 입을 수 있기에 제일 부모 클래스인 Unit으로 메소드를 이동하였다.)
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 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))
# 공중 공격 유닛
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):
self.fly(self.name, location)
# ------------------------------
# 마린 클래스 생성
class Marine(AttackUnit):
def __init__(self):
AttackUnit.__init__(self, "마린", 40, 1, 5)
# 스팀팩 : 일정 시간 동안 공격 속도 증가, 자신의 체력을 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, "탱크", 150, 1, 35)
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, "레이스", 80, 20, 5)
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(5, 21)) # 공격은 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} 님이 게임에서 퇴장하셨습니다.