관리 메뉴

프로그래밍 삽질 중

[유투브]나도코딩 : 파이썬 코딩 무료 강의(기초편) 3 본문

과거 프로그래밍 자료들/python

[유투브]나도코딩 : 파이썬 코딩 무료 강의(기초편) 3

평부 2021. 6. 9. 23:25

※ 강의를 선택한 이유 : 파이썬에 대해 기초부터 알려주는 강의 중 평가가 좋아서

※ 학습 중간중간에 예제(문제풀의)도 같이 있는데, 예시가 이해하기 쉬웠음

※ 6/9 현재 6시간 강의 중 5시간 동안 들음

※ 해당 강의 학습 후 웹 크롤링 관련 강의를 들을 예정

 https://www.youtube.com/watch?v=kWiCuklohdY&t=14455s (참고 출처)

※ 모든 코드의 저작권은 나도코딩님에게 있으며, 문제가 될 경우 삭제하겠습니다 

 

[starcraft_project.py]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
from random import *
 
#일반 유닛
class Unit:  #지상 유닛에 speed 추가
    def __init__(self, name, hp, speed): #스피드 추가
        self.name = name
        self.hp = hp
        self.speed = speed
        print("{0} 유닛이 생성되었습니다.".format(name)) #self.name도 가능
    
    def move(self, location):
        print("[지상 유닛 이동]")
        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): #(Unit)이라는 class 상속받음
    def __init__(self, name, hp, speed, damage):
        Unit.__init__(self, name, hp, speed)
        #self.name, self.hp 모두 일반 유닛과 겹칩 -> 상속받을 수 있음
        self.damage = damage
 
    def attack(self, location): #location은 전달받은 값을 사용
        print("{0} : {1} 방향으로 적군을 공격합니다. [공격력 {2}]"\
            .format(self.name, location, self.damage))
 
#마린 클래스
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):
    #시즈 모드 : 탱크를 지상에 고정시켜, 더 높은 파워로 공격 가능. 이동 불가
    seize_developed = False #시즈모드 개발여부
    def __init__(self):
        AttackUnit.__init__(self"탱크"150135)
        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)
    #움직이는 모든 것은 move로 정의하기 위함
    def move(self, location):
        print("[공중 유닛 이동]")
        self.fly(self.name, location)
 
#레이스 : 공중유닛
class Wraith(FlyableAttackUnit):
    def __init__(self):
        FlyableAttackUnit.__init__(self"레이스"80205)
        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()
 
#마린 3개 생성
m1 = Marine()
m2 = Marine()
m3 = Marine()
 
# 탱크 2개 생성
t1 = Tank()
t2 = Tank()
 
#레이스 1개 생성
w1 = Wraith()
 
#유닛 일괄 관리(생성된 모든 유닛 append)
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:
#instance : 어떤 객체가 인스턴스인지 서로 확인해서 처리하는 것이 필요
    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(521)) #공격은 랜덤으로 받음(5 ~ 20)
 
#게임 종료
game_over()
cs

[practice3.py]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#super 관련 다중상속의 경우 = 순서 상의 맨 마지막에 상속받는 경우만 상속받음
# 따라서 초기화 할 때 2번 초기화를 함 
 
class Unit:
    def __init__(self):
        print("Unit 생성자")
    
class Flyable:
    def __init__(self):
        print("Flyable 생성자")
#1번
class FlyableUnit(Unit, Flyable):
    def __init__(self):
        super().__init__()
 
#2번 : 만약 Flyable을 Unit보다 먼저 상속 받는다면?
class FlyableUnit(Flyable, Unit):
    def __init__(self):
        super().__init__()
 
#해결법 : 1, 2번의 문제점 해결하기 위한 방법
class FlyableUnit(Flyable, Unit):
    def __init__(self):
        #super().__init__() = 사용x
        Unit.__init__(self)
        Flyable.__init__(self)
 
#드랍쉽 
dropship = FlyableUnit() #1번 결과 : Unit 생성자
dropship = FlyableUnit() #2번 결과 : Flyable 생성자
dropship = FlyableUnit() #해결법 : Unit, Flyable 생성자 둘 다 생성됨
 
#퀴즈
#3개의 매물 존재
#강남 아파트 매매 10억 2010년
#마포 오피스텔 전세 3억 20007년
#송파 빌사 월세 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()
 
cs