🎉 berenickt 블로그에 온 걸 환영합니다. 🎉
Lang
python
08-클래스

1. 스타크래프트로 보는 OOP

1
# 보병: 공격 유닛, 군인, 총을 쏠 수 있음
2
name = "보병" # 이름
3
hp = 40 # 체력
4
damage = 5 # 공격력
5
6
print("{} 유닛을 생성했습니다.".format(name))
7
print("체력 {0}, 공격력 {1}\n".format(hp, damage))
8
9
# 탱크: 공격 유닛, 포를 쏠 수 있음, 두 가지 모드(일반/시지 모드)
10
tank_name = "탱크"
11
tank_hp = 150
12
tank_damage = 35
13
14
print("{} 유닛을 생성했습니다.".format(tank_name))
15
print("체력 {0}, 공격력 {1}\n".format(tank_hp, tank_damage))
16
17
# 새로 탱크2 추가
18
tank2_name = "탱크"
19
tank2_hp = 150
20
tank2_damage = 35
21
22
print("{} 유닛을 생성했습니다.".format(tank2_name))
23
print("체력 {0}, 공격력 {1}\n".format(tank2_hp, tank2_damage))
24
25
26
# 공격 함수
27
def attack(name, location, damage):
28
print("{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(name, location, damage))
29
30
31
attack(name, "1시", damage) # 보병 공격 명령
32
attack(tank_name, "1시", tank_damage) # 탱크 공격 명령
33
attack(tank2_name, "1시", tank2_damage) # 탱크2 공격 명령

2. 클래스와 객체 생성

2.1 생성자 - init

1
class Unit:
2
# __init__ 생성자 : 한 객체(보병, 탱크 1개)가 만들어질 떄 자동으로 호출되는 함수
3
# self는 자기자신을 의미, python의 클래스 안에서 메소드들은 모두 self를 작성함
4
def __init__(self, name, hp, damage):
5
self.name = name # 인스턴스 변수 name에 전달값 name 저장
6
self.hp = hp # 인스턴스 변수 hp에 전달값 hp 저장
7
self.damage = damage # 인스턴스 변수 damage에 전달값 damage 저장
8
print("{0} 유닛을 생성했습니다.".format(self.name))
9
print("체력 {0}, 공격력 {1}".format(self.hp, self.damage))
10
11
12
soldier1 = Unit("보병", 40, 5) # 보병1 생성, 전달값으로 이름/체력/공격력 전달
13
soldier2 = Unit("보병", 40, 5) # 보병2 생성, 전달값으로 이름/체력/공격력 전달
14
tank = Unit("탱크", 150, 35) # 탱크 생성, 전달값으로 이름/체력/공격력 전달

2.2

1
class Unit:
2
def __init__(self, name, hp, damage): # 생성자, self 외 전달값 3개
3
self.name = name
4
self.hp = hp
5
self.damage = damage
6
print("{0} 유닛을 생성했습니다.".format(self.name))
7
print("체력 {0}, 공격력 {1}".format(self.hp, self.damage))
8
9
10
soldier1 = Unit("보병", 40, 5) # 객체 생성
11
soldier2 = Unit("보병", 40, 5) # 객체 생성
12
tank = Unit("탱크", 150, 35) # 객체 생성
13
# soldier3 = Unit("보병") # 전달값 3개 중 1개만 넘김, TypeError 발생
14
# soldier3 = Unit("보병", 40) # 전달값 3개 중 2개만 넘김, TypeError 발생

2.3 멤버(인스턴스) 변수

1
class Unit:
2
def __init__(self, name, hp, damage): # 생성자, 전달값 3개
3
self.name = name # 인스턴스 변수 name
4
self.hp = hp # 인스턴스 변수 hp
5
self.damage = damage # 인스턴스 변수 damage
6
print("{0} 유닛을 생성했습니다.".format(self.name))
7
print("체력 {0}, 공격력 {1}".format(self.hp, self.damage))
8
9
10
# 전투기: 공중 유닛, 은폐 불가
11
stealth1 = Unit("전투기", 80, 5) # 객체 생성, 체력 80, 공격력 5
12
print("유닛 이름 : {0}, 공격력 : {1}".format(stealth1.name, stealth1.damage)) # 인스턴스 변수 접근
13
14
# 은폐 가능
15
stealth2 = Unit("업그레이드한 전투기", 80, 5)
16
stealth2.cloaking = True # 업그레이드한 전투기만을 위한 특별한 인스턴스 변수 정의, 은폐 상태
17
18
if stealth2.cloaking == True: # 은폐 상태라면
19
print("{0}는 현재 은폐 상태입니다.".format(stealth2.name))
20
21
# 오류 발생
22
# if stealth1.cloaking == True: # 다른 전투기의 은폐 여부
23
# print("{0}는 현재 은폐 상태입니다.".format(stealth1.name))

2.4

1
class AttackUnit: # 공격 유닛
2
# self는 자기자신을 의미, python의 클래스 안에서 메소드들은 모두 self를 작성함
3
def __init__(self, name, hp, damage):
4
self.name = name
5
self.hp = hp
6
self.damage = damage
7
8
def attack(self, location): # 전달받은 방향으로 공격
9
print(
10
"{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage)
11
) # 공간이 좁아서 2줄로 나눔
12
13
def damaged(self, damage): # damage만큼 유닛 피해
14
# 피해 정보 출력
15
print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
16
self.hp -= damage # 유닛의 체력에서 전달받은 damage만큼 감소
17
# 남은 체력 출력
18
print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
19
if self.hp <= 0: # 남은 체력이 0 이하이면
20
print("{0} : 파괴됐습니다.".format(self.name)) # 유닛 파괴 처리
21
22
23
# 화염방사병: 공격 유닛, 화염방사기를 사용함
24
flamethrower1 = AttackUnit("화염방사병", 50, 16) # 객체 생성, 체력 50, 공격력 16
25
flamethrower1.attack("5시") # 5시 방향으로 공격 명령
26
27
# 25만큼의 공격을 2번 받음
28
flamethrower1.damaged(25) # 남은 체력 25
29
flamethrower1.damaged(25) # 남은 체력 0

3. 클래스 상속

3.1

1
class Unit:
2
def __init__(self, name, hp):
3
self.name = name
4
self.hp = hp
5
6
7
class AttackUnit(Unit): # Unit 클래스 상속
8
def __init__(self, name, hp, damage):
9
Unit.__init__(self, name, hp) # 부모 클래스의 생성자 호출
10
self.damage = damage
11
12
def attack(self, location): # 전달받은 방향으로 공격
13
print(
14
"{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage)
15
) # 공간이 좁아서 2줄로 나눔
16
17
def damaged(self, damage): # damage만큼 유닛 피해
18
# 피해 정보 출력
19
print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
20
self.hp -= damage # 유닛의 체력에서 전달받은 damage만큼 감소
21
# 남은 체력 출력
22
print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
23
if self.hp <= 0: # 남은 체력이 0 이하이면
24
print("{0} : 파괴됐습니다.".format(self.name)) # 유닛 파괴 처리
25
26
27
flamethrower1 = AttackUnit("화염방사병", 50, 16)
28
flamethrower1.attack("5시") # 5시 방향으로 공격 명령
29
30
# 25만큼의 공격을 2번 받음
31
flamethrower1.damaged(25) # 남은 체력 25
32
flamethrower1.damaged(25) # 남은 체력 0

3.2 다중 상속

1
class Unit:
2
def __init__(self, name, hp):
3
self.name = name
4
self.hp = hp
5
6
7
class AttackUnit(Unit): # Unit 클래스 상속
8
def __init__(self, name, hp, damage):
9
Unit.__init__(self, name, hp) # 부모 클래스의 생성자 호출
10
self.damage = damage
11
12
def attack(self, location): # 전달받은 방향으로 공격
13
print(
14
"{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage)
15
) # 공간이 좁아서 2줄로 나눔
16
17
def damaged(self, damage): # damage만큼 유닛 피해
18
# 피해 정보 출력
19
print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
20
self.hp -= damage # 유닛의 체력에서 전달받은 damage만큼 감소
21
# 남은 체력 출력
22
print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
23
if self.hp <= 0: # 남은 체력이 0 이하이면
24
print("{0} : 파괴됐습니다.".format(self.name)) # 유닛 파괴 처리
25
26
27
# 비행 기능
28
class Flyable:
29
def __init__(self, flying_speed): # 비행 속도
30
self.flying_speed = flying_speed
31
32
def fly(self, name, location): # 유닛 이름, 비행 방향
33
print(
34
"{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed)
35
)
36
37
38
# 공중 공격 유닛
39
class FlyableAttackUnit(AttackUnit, Flyable):
40
def __init__(self, name, hp, damage, flying_speed): # 유닛 이름, 체력, 공격력, 비행 속도
41
AttackUnit.__init__(self, name, hp, damage) # 유닛 이름, 체력, 공격력
42
Flyable.__init__(self, flying_speed) # 비행 속도
43
44
45
# 요격기: 공중 공격 유닛, 미사일 여러 발을 한 번에 발사
46
interceptor = FlyableAttackUnit("요격기", 200, 6, 5) # 유닛 이름, 체력, 공격력, 비행 속도
47
interceptor.fly(interceptor.name, "3시") # 3시 방향으로 이동

3.3 메소드 오버라이딩

1
# 일반 유닛
2
class Unit:
3
def __init__(self, name, hp, speed): # speed 추가
4
self.name = name
5
self.hp = hp
6
self.speed = speed # 지상 이동 속도
7
8
def move(self, location): # 이동 동작 정의
9
print("[지상 유닛 이동]")
10
print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))
11
12
13
# 공격 유닛
14
class AttackUnit(Unit): # Unit 클래스 상속
15
def __init__(self, name, hp, damage, speed): # speed 추가
16
Unit.__init__(self, name, hp, speed) # speed 추가
17
self.damage = damage
18
19
def attack(self, location): # 전달받은 방향으로 공격
20
print(
21
"{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage)
22
) # 공간이 좁아서 2줄로 나눔
23
24
def damaged(self, damage): # damage만큼 유닛 피해
25
# 피해 정보 출력
26
print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
27
self.hp -= damage # 유닛의 체력에서 전달받은 damage만큼 감소
28
# 남은 체력 출력
29
print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
30
if self.hp <= 0: # 남은 체력이 0 이하이면
31
print("{0} : 파괴됐습니다.".format(self.name)) # 유닛 파괴 처리
32
33
34
# 비행 기능
35
class Flyable:
36
def __init__(self, flying_speed): # 비행 속도
37
self.flying_speed = flying_speed
38
39
def fly(self, name, location): # 유닛 이름, 비행 방향
40
print(
41
"{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed)
42
)
43
44
45
# 공중 공격 유닛
46
class FlyableAttackUnit(AttackUnit, Flyable):
47
def __init__(self, name, hp, damage, flying_speed):
48
AttackUnit.__init__(self, name, hp, damage, 0) # 지상 이동 속도 0
49
Flyable.__init__(self, flying_speed) # 비행 속도
50
51
def move(self, location): # ⭐️ Unit 클래스의 move() 메서드를 오버라이딩 📌
52
print("[공중 유닛 이동]")
53
self.fly(self.name, location)
54
55
56
# 호버 바이크: 지상 유닛, 기동성 좋음
57
hoverbike = AttackUnit("호버 바이크", 80, 20, 10) # 지상 이동 속도 10
58
59
# 우주 순양함: 공중 유닛, 체력도 굉장히 좋음, 공격력도 좋음
60
spacecruiser = FlyableAttackUnit("우주 순양함", 500, 25, 3) # 비행 속도 3
61
62
hoverbike.move("11시")
63
# spacecruiser.fly(spacecruiser.name, "9시")
64
spacecruiser.move("9시") # 오버라이딩한 move() 메서드 호출

4. 동작없이 넘어가기 - pass

1
class Unit:
2
def __init__(self, name, hp, speed): # speed 추가
3
self.name = name
4
self.hp = hp
5
self.speed = speed # 지상 이동 속도
6
7
def move(self, location): # 이동 동작 정의
8
print("[지상 유닛 이동]")
9
print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))
10
11
12
# 건물 유닛
13
class BuildingUnit(Unit):
14
def __init__(self, name, hp, location):
15
pass # pass : 아무것도 안하고 넘어간다
16
17
18
# 보급고: 건물 유닛, 1개 건물 유닛 = 8유닛
19
supply_depot = BuildingUnit("보급고", 500, "7시") # 체력 500, 생성 위치 7시
20
21
22
def game_start():
23
print("[알림] 새로운 게임을 시작합니다.")
24
25
26
def game_over():
27
pass
28
29
30
game_start()
31
game_over()

5. 부모 클래스 - super

1
class Unit:
2
def __init__(self, name, hp, speed): # speed 추가
3
self.name = name
4
self.hp = hp
5
self.speed = speed # 지상 이동 속도
6
7
def move(self, location): # 이동 동작 정의
8
print("[지상 유닛 이동]")
9
print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))
10
11
12
# 건물 유닛
13
class BuildingUnit(Unit):
14
def __init__(self, name, hp, location):
15
# Unit.__init__(self, name, hp, 0) # 지상 이동 속도 0, 건물은 지상 이동 불가
16
super().__init__(name, hp, 0) # 부모 클래스 접근, self 없이 사용
17
self.location = location

6. 게임완성

1
# 9.6.1
2
# 일반 유닛
3
class Unit:
4
def __init__(self, name, hp, speed):
5
self.name = name
6
self.hp = hp
7
self.speed = speed
8
print("{0} 유닛을 생성했습니다.".format(name)) # 안내 문구 출력
9
10
def move(self, location):
11
# print("[지상 유닛 이동]") # 출력문 삭제
12
print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))
13
14
def damaged(self, damage): # AttackUnit 클래스에서 Unit 클래스로 이동
15
print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
16
self.hp -= damage
17
print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
18
if self.hp <= 0:
19
print("{0} : 파괴됐습니다.".format(self.name))
20
21
22
# 공격 유닛
23
class AttackUnit(Unit):
24
def __init__(self, name, hp, damage, speed):
25
Unit.__init__(self, name, hp, speed)
26
self.damage = damage
27
28
def attack(self, location):
29
print(
30
"{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage)
31
)
32
33
"""
34
def damaged(self, damage): # Unit 클래스로 이동
35
print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
36
self.hp -= damage
37
print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
38
if self.hp <= 0:
39
print("{0} : 파괴됐습니다.".format(self.name))
40
"""
41
42
43
# 보병 유닛
44
class Soldier(AttackUnit): # AttackUnit 클래스 상속
45
def __init__(self):
46
AttackUnit.__init__(self, "보병", 40, 5, 1) # 이름, 체력, 공격력, 이동 속도
47
48
# 강화제 : 일정 시간 동안 이동 속도와 공격 속도 증가, 체력 10 감소
49
def booster(self): # 강화제 기능 메서드로 정의
50
if self.hp > 10:
51
self.hp -= 10 # 체력 10 소모
52
print("{0} : 강화제를 사용합니다. (HP 10 감소)".format(self.name))
53
else:
54
print("{0} : 체력이 부족해 기술을 사용할 수 없습니다".format(self.name))
55
56
57
# 탱크 유닛
58
class Tank(AttackUnit): # AttackUnit 클래스 상속
59
# 시즈 모드 : 탱크를 지상에 고정, 이동 불가, 공격력 증가
60
siege_developed = False # 시지 모드 개발 여부, 클래스 변수로 정의
61
62
def __init__(self):
63
AttackUnit.__init__(self, "탱크", 150, 35, 1) # 이름, 체력, 공격력, 이동 속도
64
self.siege_mode = False # 시지 모드(해제 상태), 인스턴스 변수로 정의
65
66
# 시즈 모드 설정
67
def set_siege_mode(self):
68
if Tank.siege_developed == False: # 시지 모드가 개발되지 않았으면 바로 반환
69
return
70
# 현재 일반 모드일 때
71
if self.siege_mode == False: # 시지 모드 여부 확인
72
print("{0} : 시지 모드로 전환합니다.".format(self.name)) # 시지 모드 전환
73
self.damage *= 2 # 공격력 2배 증가
74
self.siege_mode = True # 시지 모드 설정
75
# 현재 시지 모드일 때
76
else:
77
print("{0} : 시지 모드를 해제합니다.".format(self.name)) # 일반 모드 전환
78
self.damage //= 2 # 공격력 절반으로 감소
79
self.siege_mode = False # 시지 모드 해제
80
81
82
# 나는 기능
83
class Flyable:
84
def __init__(self, flying_speed):
85
self.flying_speed = flying_speed
86
87
def fly(self, name, location):
88
print(
89
"{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed)
90
)
91
92
93
# 공중 공격 유닛
94
class FlyableAttackUnit(AttackUnit, Flyable):
95
def __init__(self, name, hp, damage, flying_speed):
96
AttackUnit.__init__(self, name, hp, damage, 0)
97
Flyable.__init__(self, flying_speed)
98
99
def move(self, location):
100
# print("[공중 유닛 이동]") # 출력문 삭제
101
self.fly(self.name, location)
102
103
104
# 전투기 유닛
105
class Stealth(FlyableAttackUnit): # FlyableAttackUnit 클래스 상속
106
def __init__(self):
107
FlyableAttackUnit.__init__(self, "전투기", 80, 20, 5) # 부모 클래스 생성자로 기본 정보 설정
108
self.cloaked = False # 은폐 모드(해제 상태), 인스턴스 변수 정의
109
110
def cloaking(self): # 은폐 모드를 메서드로 정의
111
# 현재 은폐 모드일 때
112
if self.cloaked == True:
113
print("{0} : 은폐 모드를 해제합니다.".format(self.name))
114
self.cloaked = False # 은폐 모드 해제
115
# 현재 은폐 모드가 아닐 때
116
else:
117
print("{0} : 은폐 모드를 설정합니다.".format(self.name))
118
self.cloaked = True # 은폐 모드 설정
119
120
121
# 9.6.2
122
# 게임 시작
123
def game_start():
124
print("[알림] 새로운 게임을 시작합니다.")
125
126
127
# 게임 종료
128
def game_over():
129
print("Player : Good Game")
130
print("[Player] 님이 게임에서 퇴장했습니다.")
131
132
133
# 게임 시작
134
game_start()
135
136
# 보병 3기 생성
137
so1 = Soldier()
138
so2 = Soldier()
139
so3 = Soldier()
140
141
# 탱크 2기 생성
142
ta1 = Tank()
143
ta2 = Tank()
144
145
# 전투기 1기 생성
146
st1 = Stealth()
147
148
# 유닛 일괄 관리(생성된 모든 유닛 추가)
149
attack_units = []
150
attack_units.append(so1)
151
attack_units.append(so2)
152
attack_units.append(so3)
153
attack_units.append(ta1)
154
attack_units.append(ta2)
155
attack_units.append(st1)
156
157
# 전군 이동
158
for unit in attack_units:
159
unit.move("1시")
160
161
# 탱크 시지 모드 개발
162
Tank.siege_developed = True
163
print("[알림] 탱크의 시지 모드 개발이 완료됐습니다.")
164
165
# 공격 모드 준비(보병: 강화제, 탱크: 시지 모드, 전투기: 은폐 모드)
166
for unit in attack_units:
167
if isinstance(unit, Soldier): # Soldier 클래스의 인스턴스이면 강화제
168
unit.booster()
169
elif isinstance(unit, Tank): # Tank 클래스의 인스턴스이면 시지 모드
170
unit.set_siege_mode()
171
elif isinstance(unit, Stealth): # Stealth 클래스의 인스턴스이면 은폐 모드
172
unit.cloaking()
173
174
# 전군 공격
175
for unit in attack_units:
176
unit.attack("1시")
177
178
from random import *
179
180
# 전군 피해
181
for unit in attack_units:
182
unit.damaged(randint(5, 20)) # 피해는 무작위로 받음(5~20)
183
184
# 게임 종료
185
game_over()

6.1 게임 완성 리뷰

1
from random import *
2
3
4
# 일반 유닛
5
class Unit:
6
def __init__(self, name, hp, speed):
7
self.name = name
8
self.hp = hp
9
self.speed = speed
10
print("{0} 유닛을 생성했습니다.".format(name))
11
12
def move(self, location):
13
print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))
14
15
def damaged(self, damage):
16
print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
17
self.hp -= damage
18
print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
19
if self.hp <= 0:
20
print("{0} : 파괴됐습니다.".format(self.name))
21
22
23
# 공격 유닛
24
class AttackUnit(Unit):
25
def __init__(self, name, hp, damage, speed):
26
Unit.__init__(self, name, hp, speed)
27
self.damage = damage
28
29
def attack(self, location):
30
print(
31
"{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage)
32
)
33
34
35
# 보병 유닛
36
class Soldier(AttackUnit):
37
def __init__(self):
38
AttackUnit.__init__(self, "보병", 40, 5, 1) # 이름, 체력, 공격력, 이동 속도
39
40
# 강화제: 일정 시간 동안 이동 속도와 공격 속도 증가, 체력 10 감소
41
def booster(self):
42
if self.hp > 10:
43
self.hp -= 10 # 체력 10 소모
44
print("{0} : 강화제를 사용합니다. (HP 10 감소)".format(self.name))
45
else:
46
print("{0} : 체력이 부족해 기술을 사용할 수 없습니다".format(self.name))
47
48
49
# 탱크 유닛
50
class Tank(AttackUnit):
51
# 시지 모드 : 탱크를 지상에 고정, 이동 불가, 공격력 증가
52
siege_developed = False # 시지 모드 개발 여부
53
54
def __init__(self):
55
AttackUnit.__init__(self, "탱크", 150, 35, 1) # 이름, 체력, 공격력, 이동 속도
56
self.siege_mode = False # 시지 모드(해제 상태)
57
58
# 시지 모드 설정
59
def set_siege_mode(self):
60
if Tank.siege_developed == False: # 시지 모드가 개발되지 않았으면 바로 반환
61
return
62
# 현재 일반 모드일 때
63
if self.siege_mode == False:
64
print("{0} : 시지 모드로 전환합니다.".format(self.name))
65
self.damage *= 2 # 공격력 2배 증가
66
self.siege_mode = True # 시지 모드 설정
67
# 현재 시지 모드일 때
68
else:
69
print("{0} : 시지 모드를 해제합니다.".format(self.name))
70
self.damage //= 2 # 공격력 절반으로 감소
71
self.siege_mode = False # 시지 모드 해제
72
73
74
# 비행 기능
75
class Flyable:
76
def __init__(self, flying_speed):
77
self.flying_speed = flying_speed
78
79
def fly(self, name, location):
80
print(
81
"{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed)
82
)
83
84
85
# 공중 공격 유닛
86
class FlyableAttackUnit(AttackUnit, Flyable):
87
def __init__(self, name, hp, damage, flying_speed):
88
AttackUnit.__init__(self, name, hp, damage, 0)
89
Flyable.__init__(self, flying_speed)
90
91
def move(self, location):
92
self.fly(self.name, location)
93
94
95
# 전투기 유닛
96
class Stealth(FlyableAttackUnit):
97
def __init__(self):
98
FlyableAttackUnit.__init__(self, "전투기", 80, 20, 5)
99
self.cloaked = False # 은폐 모드(해제 상태)
100
101
# 은폐 모드
102
def cloaking(self):
103
# 현재 은폐 모드일 때
104
if self.cloaked == True:
105
print("{0} : 은폐 모드를 해제합니다.".format(self.name))
106
self.cloaked = False
107
# 현재 은폐 모드가 아닐 때
108
else:
109
print("{0} : 은폐 모드를 설정합니다.".format(self.name))
110
self.cloaked = True
111
112
113
# 게임 시작
114
def game_start():
115
print("[알림] 새로운 게임을 시작합니다.")
116
117
118
# 게임 종료
119
def game_over():
120
print("Player : Good Game")
121
print("[Player] 님이 게임에서 퇴장했습니다.")
122
123
124
# 실제 게임 진행
125
game_start() # 게임 시작
126
127
# 보병 3기 생성
128
so1 = Soldier()
129
so2 = Soldier()
130
so3 = Soldier()
131
132
# 탱크 2기 생성
133
ta1 = Tank()
134
ta2 = Tank()
135
136
# 전투기 1기 생성
137
st1 = Stealth()
138
139
# 유닛 일괄 관리(생성된 모든 유닛 추가)
140
attack_units = []
141
attack_units.append(so1)
142
attack_units.append(so2)
143
attack_units.append(so3)
144
attack_units.append(ta1)
145
attack_units.append(ta2)
146
attack_units.append(st1)
147
148
# 전군 이동
149
for unit in attack_units:
150
unit.move("1시")
151
152
# 탱크 시지 모드 개발
153
Tank.siege_developed = True
154
print("[알림] 탱크의 시지 모드 개발이 완료됐습니다.")
155
156
# 공격 모드 준비(보병: 강화제, 탱크: 시지 모드, 전투기: 은폐 모드)
157
for unit in attack_units:
158
if isinstance(unit, Soldier): # Soldier 클래스의 인스턴스이면 강화제
159
unit.booster()
160
elif isinstance(unit, Tank): # Tank 클래스의 인스턴스이면 시지 모드
161
unit.set_siege_mode()
162
elif isinstance(unit, Stealth): # Stealth 클래스의 인스턴스이면 은폐 모드
163
unit.cloaking()
164
165
# 전군 공격
166
for unit in attack_units:
167
unit.attack("1시")
168
169
# 전군 피해
170
for unit in attack_units:
171
unit.damaged(randint(5, 20)) # 피해는 무작위로 받음(5~20)
172
173
# 게임 종료
174
game_over()

7. 퀴즈. 부동산 프로그램

1
"""
2
Quiz) 주어진 코드를 활용하여 부동산 프로그램을 작성하시오.
3
4
(출력 예제)
5
총 3대의 매물이 있습니다.
6
강남 아파트 매매 10억 2010년
7
마포 오피스텔 전세 5억 2007년
8
송파 빌라 월세 500/50 2000년
9
"""
10
11
12
class House:
13
# 매물 초기화 : 위치, 건물 종류, 매물 종류, 가격, 준공연도
14
def __init__(self, location, house_type, deal_type, price, completion_year):
15
self.location = location
16
self.house_type = house_type
17
self.deal_type = deal_type
18
self.price = price
19
self.completion_year = completion_year
20
21
# 매물 정보 표시
22
def show_detail(self):
23
print(
24
self.location,
25
self.house_type,
26
self.deal_type,
27
self.price,
28
self.completion_year,
29
)
30
31
32
houses = []
33
house1 = House("강남", "아파트", "매매", "10억 원", "2010년")
34
house2 = House("마포", "오피스텔", "전세", "5억 원", "2007년")
35
house3 = House("송파", "빌라", "월세", "500/50만 원", "2000년")
36
37
houses.append(house1)
38
houses.append(house2)
39
houses.append(house3)
40
41
print("총 {0}가지 매물이 있습니다.".format(len(houses)))
42
for house in houses:
43
house.show_detail()