클래스 변수
- 한 클래스로 만들어진 객체에 일괄적으로 무언가를 적용하기 위해 인스턴스 변수가 아닌
클래스 변수로 정의해야 합니다. - 클래스명 바로 밑에 정의하고 클래스로부터 만들어진 모든 객체에 값이 일괄적으로 적용됩니다.
게임만들기(완성)
- 공격하는 과정에서 우리 편도 피해를 입습니다.(피해는 난수값으로 지정)
- Unit 클래스를 공격 유닛인 AttackUnit 클래스가 상속받습니다.
- 지상공격 유닛인 보병과 탱크를 Soldier 와 Tank 클래스를 정의합니다.
- 공중유닛을 위해 비행 기능을 제공하는 Flyable 클래스를 정의 합니다.
- 공중 공격 유닛인 FlyableAttckUnit 클래스는 Flyable 클래스와 AttackUnit 클래스를 다중 상속 받습니다.
- 전투기 유닛을 위한 Stealth 클래스를 정의합니다.
from random import *
class Unit:
def __init__(self, name, hp, speed):
self.name = name
self.hp = hp
self.speed = speed
print("{0} 유닛을 생성했습니다.".format(name))
def move(self, location):
print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))
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 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))
class Soldier(AttackUnit):
def __init__(self):
AttackUnit.__init__(self, "보병", 40, 5, 1)
def booster(self):
if self.hp > 10:
self.hp -= 10
print("{0} : 강화제를 사용합니다. (HP 10 감소)".format(self.name))
else:
print("{0} : 체력이 부족해 기술을 사용할 수 없습니다".format(self.name))
class Tank(AttackUnit):
siege_developed = False
def __init__(self):
AttackUnit.__init__(self, "탱크", 150, 35, 1)
self.siege_mode = False
def set_siege_mode(self):
if Tank.siege_developed == False:
return
if self.siege_mode == False:
print("{0} : 시지 모드로 전환합니다.".format(self.name))
self.damage *= 2
self.siege_mode = True
else:
print("{0} : 시지 모드를 해제합니다.".format(self.name))
self.damage //= 2
self.siege_mode = False
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):
self.fly(self.name, location)
class Stealth(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 : Good Game")
print("[Player] 님이 게임에서 퇴장했습니다.")
game_start()
so1 = Soldier()
so2 = Soldier()
so3 = Soldier()
ta1 = Tank()
ta2 = Tank()
st1 = Stealth()
attack_units = []
attack_units.append(so1)
attack_units.append(so2)
attack_units.append(so3)
attack_units.append(ta1)
attack_units.append(ta2)
attack_units.append(st1)
for unit in attack_units:
unit.move("1시")
Tank.siege_developed = True
print("[알림] 탱크의 시지 모드 개발이 완료됐습니다.")
for unit in attack_units:
if isinstance(unit, Soldier):
unit.booster()
elif isinstance(unit, Tank):
unit.set_siege_mode()
elif isinstance(unit, Stealth):
unit.cloaking()
for unit in attack_units:
unit.attack("1시")
for unit in attack_units:
unit.damaged(randint(5, 20))
game_over()
'학습단 > Python 학습단' 카테고리의 다른 글
10장 예외 (finally + 실습문제) (0) | 2023.07.26 |
---|---|
10장 예외처리하기 (0) | 2023.07.25 |
3주차 완료입니다. (0) | 2023.07.21 |
9-2장 클래스(게임 만들기2) (0) | 2023.07.21 |
9장 클래스(게임 만들기) (0) | 2023.07.20 |