-
[python] 스타크래프트 프로젝트python 2025. 5. 29. 13:25
스타크래프트 프로젝트
클래스, 멤버변수, 메소드, 상속, 다중상속, 메소드, 오버라이딩, pass, super를 활용한 예시 프로젝트
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, 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 Marine(AttackUnit): def __init__(self): AttackUnit.__init__(self, "마린", 40, 1, 5) # 스팀팩 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): # 시즈모드 seize_developed = False # 시즈 모드 개발 여부 def __init__(self): AttackUnit.__init__(self, "탱크", 150, 1, 35) self.seize_mode = 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 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) # 지상 스피드는 0 Flyable.__init__(self, flying_speed) def move(self, location): self.fly(self.name, location) # 레이스 class Wraith(FlyableAttackUnit): def __init__(self): FlyableAttackUnit.__init__(self, "레이스", 80, 20, 5) self.clocked = False # 클로킹 모드(해제 상태) def clocking(self): if self.clocked == True: print("{0} : 클로킹 모드 해제 합니다".format(self.name)) self.clocked = False else: # 클로킹 해제 -> 모드 설정 print("{0} : 클로킹 모드 설정 합니다".format(self.name)) self.clocked = True def game_start(): print("[알림] 새로운 게임을 시작합니다") def game_over(): print("Player : gg") print("[Player] 님이 게임에서 퇴장하셨습니다") # 실제 게임 시작 game_start() m1 = Marine() m2 = Marine() m3 = Marine() t1 = Tank() t2 = Tank() 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.clocking() # 전국 공격 for unit in attack_units: unit.attack("1시") # 전군 피해 for unit in attack_units: unit.damaged(randint(5, 20)) # 공격은 랜덤으로 받음(5~20) # 게임 종료 game_over()퀴즈
Quiz) 주어진 코드를 활용하여 부동산 프로그램을 작성하시오.
(출력 예제)
총 3대의 매물이 있습니다.
강남 아파트 매매 10억 2010년
마포 오피스텔 전세 5억 2007년
송파 빌라 월세 500/50 2000년class House: # 매물 초기화 def __init__(self, location, house_type, deal_type, price, completion_year): self.location = location self.house_type = house_type self.deal_type = deal_type self.price = price self.completion_year = completion_year # 매물 정보 표시 def show_detail(self): print(self.location, self.house_type, self.deal_type\ , self.price, self.completion_year) houses = [] house1 = House("강남", "아파트", "매매", "10억", "2010년") house2 = House("마포", "오피스텔", "전세", "5억", "2007년") house3 = House("송파", "빌라", "월세", "500/50", "2000년") houses.append(house1) houses.append(house2) houses.append(house3) print("총 {0}대의 매물이 있습니다.".format(len(houses))) for house in houses: house.show_detail()총 3대의 매물이 있습니다.
강남 아파트 매매 10억 2010년
마포 오피스텔 전세 5억 2007년
송파 빌라 월세 500/50 2000년퀴즈2
1.여러 개의 유사한 대상을 표현할 때, 각각 별도의 변수를 사용하는 것보다 클래스를 활용하는 것이 왜 더 효율적일까요?
코드의 중복을 줄이고 관리하기 쉬워져서
2. 객체를 생성할 때 자동으로 호출되어 초기 설정을 돕는 특별한 메서드의 이름은 무엇일까요?
`__init__` 메서드는 객체가 만들어질 때 필요한 초기 상태를 설정하는 역할을 해요.
객체 생성 시 자동으로 호출되는 약속된 이름입니다.
3. 클래스 내 메서드의 첫 번째 매개변수 `self`가 가리키는 것은 무엇인가요?
메서드를 호출한 객체 인스턴스
`self`는 클래스로부터 생성된 '자기 자신', 즉 현재 작업 중인 객체 인스턴스를 의미해요. 이를 통해 객체의 속성에 접근할 수 있죠.
4. 클래스로부터 생성된 객체의 멤버 변수(속성)에 접근하려면 객체 이름 뒤에 무엇을 사용해야 할까요?
마침표 `.`
객체 이름 뒤에 마침표(`.`)를 찍고 멤버 변수 이름을 쓰면 해당 객체의 멤버 변수 값에 접근하거나 변경할 수 있어요.
5. 클래스 안에 정의된 함수를 특별히 무엇이라고 부르나요?
메서드 (Method)
클래스 안에 정의되어 객체의 기능이나 행동을 나타내는 함수를 '메서드'라고 부릅니다. 클래스의 속성과 메서드는 밀접하게 관련 있어요.
6. 상속을 사용하는 가장 큰 목적은 무엇일까요?
코드 재사용성 증진 및 중복 감소
상속은 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 코드를 반복해서 작성할 필요 없게 해줘요.
이로써 코드 재사용성이 높아집니다.
7. 여러 개의 부모 클래스로부터 특징을 물려받는 것을 무엇이라고 할까요?
다중 상속
하나의 자식 클래스가 둘 이상의 부모 클래스로부터 속성과 메서드를 물려받는 프로그래밍 기법을 다중 상속이라고 합니다.
8. 자식 클래스에서 부모 클래스의 메서드와 동일한 이름으로 메서드를 다시 정의했을 때, 자식 객체에서 해당 메서드를 호출하면 어떤 메서드가 실행될까요?
자식 클래스에서 새로 정의한 메서드
자식 클래스에 부모와 같은 이름의 메서드가 있다면, 자식 객체에서는 자식 클래스의 메서드가 우선적으로 호출됩니다. 이것을 메서드 오버라이딩이라 해요.
9. Python에서 `pass` 문은 어떤 역할을 할까요?
아무것도 하지 않는 플레이스홀더 역할
`pass` 문은 문법적으로 코드가 필요하지만 실제로는 아무 동작도 하지 않고 그냥 넘어가는 역할을 해요. 임시로 코드를 비워둘 때 유용하죠.
10. 프로그램 실행 중에 어떤 객체가 특정 클래스 또는 그 자식 클래스의 인스턴스인지 확인하려면 어떤 함수를 사용해야 할까요?
`isinstance()`
`isinstance(객체, 클래스명)` 함수는 주어진 객체가 특정 클래스나 그 자식 클래스의 인스턴스인지 참/거짓으로 알려주는 내장 함수입니다.
'python' 카테고리의 다른 글
[python] finally (0) 2025.05.29 [python] 예외처리 (1) 2025.05.29 [python] super (0) 2025.05.28 [python] pass (0) 2025.05.28 *[python] 메소드 오버라이딩 (0) 2025.05.28