본문 바로가기
멋쟁이사자처럼 AI스쿨

클래스로 마린과 메딕 구현하기(파이썬 강의 Day4 Quiz)

by 헬푸밍 2023. 1. 6.

이 이야기는 슬픈이야기 입니다...

 

클래스, 상속, 데코레이터 공부를 하려고 강사님이 퀴즈를 내주셨으나...

 

코드 작성하다보니 조건문 공부만 하게된 이야기입니다... ㅎㄷㄷ

 

퀴즈는

# 스타크래프트
# - Marine : health(40), attack_pow(5), attack(상대체력감소)
# - Medic : health(60), heal_pow(6), heal(상대체력회복)
# 자유롭게 기능 추가

이렇게 마린과... 메딕을 간단히 구현해보는겁니다.

 

아래의 코드를 봅시다.

class Marine:
    def __init__(self, health=40):
        self.health = health

    def attack(self, attack_pow=5):
        print(f'상대체력을 {attack_pow}만큼 감소시킵니다.')

class Medic:
    def __init__(self, health=50):
        self.health = health

    def heal(self, heal_pow=5):
        print(f'마린체력을 {heal_pow}만큼 회복시킵니다.')

marine = Marine()
medic = Medic()

print(marine.health, medic.health)
marine.attack()
medic.heal()

이렇게 마린, 메딕 클래스를 선언하고...

marine, medic객체를 생성한 뒤

마린 메딕의 체력과 공격 메서드, 힐 메서드를 실행하면...

위 처럼 결과가 나옵니다.

 

근데 너무 빈약해 보여서... 상속이랑 데코레이터를 추가해서 공부하려고 시도를 했지만...

 

도저히 추가할 아이디어가 생각이 안나서...

 

적과 싸우는 모습을 구현해보기로 했습니다...

 

일단 적을 클래스로 만들면 큰일날것같아서...

 

딕셔너리로 아래와 같이 적을 만들었습니다!

enemy = {'health' : 30, 'attack_pow_enemy' : 9}

이렇게 아드레날린 저글링 마냥 체력적고 공격력쎈...놈을 만들었습니다.

 

그리고 적을 죽이고 메딕을 죽이고 마린을 죽이고...

 

적만 죽고, 마린만 죽고, 메딕만 죽고...

 

적과 마린이 같이죽고...

 

죽을때도 때리면서 죽고...

 

마린이 죽으면 메딕이 회복을 못시켜주고...

 

이런 기능들을 추가하니...

 

enemy = {'health' : 30, 'attack_pow_enemy' : 9}

class Marine:
    
    def __init__(self, health=40):
        self.health = health

    def attack(self, attack_pow=5):
        if (enemy['health'] > attack_pow) & (self.health > enemy['attack_pow_enemy']):
            enemy['health'] -= attack_pow
            self.health -= enemy['attack_pow_enemy'] #한대 칠때마다 한대 공격받음
            print(f'상대체력이 {attack_pow}만큼 감소합니다.')
            print('마린의 체력이', str(enemy['attack_pow_enemy']) + '만큼 감소합니다.')

        elif (enemy['health'] > attack_pow) & ((self.health > 0) & (self.health <= enemy['attack_pow_enemy'])):
            enemy['health'] -= attack_pow
            self.health -= enemy['attack_pow_enemy'] #한대 칠때마다 한대 공격받음
            print(f'상대체력이 {attack_pow}만큼 감소합니다.') #죽을 때도 때리고 죽음
            self.health = 0
            print('마린이 전사했습니다.')

        elif (enemy['health'] > attack_pow) & (self.health == 0):
            print('공격할 마린이 없습니다.')

        elif ((enemy['health'] > 0) & (enemy['health'] <= attack_pow)) & (self.health > enemy['attack_pow_enemy']):
            enemy['health'] = 0
            print('상대방을 물리쳤습니다.') 
            self.health -= enemy['attack_pow_enemy'] #한대 칠때마다 한대 공격받음
            print('마린의 체력이', str(enemy['attack_pow_enemy']) + '만큼 감소합니다.') #적도 죽을때 때리고 죽음
                         
        elif ((enemy['health'] > 0) & (enemy['health'] <= attack_pow)) & ((self.health > 0) & (self.health <= enemy['attack_pow_enemy'])):
            enemy['health'] = 0
            print('상대방을 물리쳤습니다.')
            self.health = 0
            print('마린이 전사했습니다.') #같이죽는 경우
            
        elif ((enemy['health'] > 0) & (enemy['health'] <= attack_pow)) & (self.health == 0):
            print('공격할 마린이 없습니다.')

        elif (enemy['health'] == 0) & (self.health > enemy['attack_pow_enemy']):
            print('공격할 적이 없습니다.')
        
        elif (enemy['health'] == 0) & ((self.health > 0) & (self.health <= enemy['attack_pow_enemy'])):
            print('공격할 적이 없습니다.')
        
        else:
            print('마린도 적도 없습니다.')

class Medic:
    
    def __init__(self, health=50):
        self.health = health
    
    def heal(self, heal_pow=6):
        if ((marine.health + heal_pow) >= 40) & (self.health > enemy['attack_pow_enemy']):
            marine.health = 40
            print('마린이 풀피입니다.')
            self.health -= enemy['attack_pow_enemy']    # 회복 시도 1번당 1대 맞음
            print('메딕의 체력이', str(enemy['attack_pow_enemy']) +'만큼 감소합니다.')
            
        elif (marine.health > 0) & (self.health > enemy['attack_pow_enemy']):
            marine.health += heal_pow
            print(f'마린의 체력을 {heal_pow}만큼 회복합니다.')
            self.health -= enemy['attack_pow_enemy']    # 회복 시도 1번당 1대 맞음
            print('메딕의 체력이', str(enemy['attack_pow_enemy']) +'만큼 감소합니다.')
            
        elif (marine.health == 0) & (self.health > enemy['attack_pow_enemy']):
            print('회복할 마린이 없습니다.')
            self.health -= enemy['attack_pow_enemy']    # 회복 시도 1번당 1대 맞음
            print('메딕의 체력이', str(enemy['attack_pow_enemy']) +'만큼 감소합니다.')
        
        elif ((marine.health + heal_pow) >= 40) & ((self.health > 0) & (self.health <= enemy['attack_pow_enemy'])):
            marine.health = 40
            print('마린이 풀피입니다.') # 죽을때도 회복하다 죽음
            self.health = 0    # 메딕 사망
            print('메딕이 전사했습니다.')

        elif (marine.health > 0) & ((self.health > 0) & (self.health <= enemy['attack_pow_enemy'])):
            print(f'마린의 체력을 {heal_pow}만큼 회복합니다.') # 죽을때도 회복하다 죽음
            self.health = 0    # 메딕 사망
            print('메딕이 전사했습니다.')
        
        elif (marine.health == 0) & ((self.health > 0) & (self.health <= enemy['attack_pow_enemy'])):
            print('회복할 마린이 없습니다.')
            self.health = 0    # 회복 시도 1번당 1대 맞음
            print('메딕의 전사했습니다.')
        
        elif ((marine.health + heal_pow) >= 40) & (self.health == 0):
            print('메딕이 죽고 없습니다.')

        elif (marine.health > 0) & (self.health == 0):
            print('메딕이 죽고 없습니다.')
        else:
            print('회복할 마린이 없습니다.')
            print('메딕이 죽고 없습니다.')

marine = Marine()
medic = Medic()

이런 망할 코드가... 나왔습니다...

 

보기만해도 어질어질하네여...

 

암튼 코드를 만들었으니... 한 번 실행해 보기로 합시다...

 

이렇게 먼저 풀피 상태의 적, 마린, 메딕의 체력을 확인합니다.

enemy['health'], marine.health, medic.health

결과는...

잘 나오군요!

 

그럼 마린이 한번 공격 해봅시다(공격할 때 적한테 한대 맞음)

marine.attack()
enemy['health'], marine.health, medic.health

주고 받았군요...

 

마린을 죽여봅시다!

marine.attack()
marine.attack()
marine.attack()
marine.attack()
enemy['health'], marine.health, medic.health

위와 같이 4번 더 공격합니다..

그럼...

마린이 죽었군요...

 

죽은 상태에서 공격을 해봅시다...

marine.attack()
enemy['health'], marine.health, medic.health

결과는...?

마린은 죽고 없군요... 체력바는 그대로입니다...(마린이 죽으면 적이 메딕을 공격하는 것 까지는 무리였네여...)

 

그럼 마린이 죽은 상태에서 메딕이 힐을 해봅시다!

 

medic.heal()
enemy['health'], marine.health, medic.health

마린이 없어 회복 못하고, 회복시도를 해서 한대 맞은 모습입니다.

 

이제 적을 죽여봅시다.

 

다시 모두 풀피로 만들고...

 

힐 회복을 적당히 해서 적을 죽입니다.

marine.attack()
marine.attack()
medic.heal()
marine.attack()
medic.heal()
marine.attack()
medic.heal()
marine.attack()
marine.attack()
enemy['health'], marine.health, medic.health

실행결과를 과정으로 보면...

이렇게 피가 4 남고 죽였군요... 혈전이었네여...

 

이제 메딕을 죽여봅시다!

medic.heal()
medic.heal()
medic.heal()
medic.heal()
medic.heal()
medic.heal()
enemy['health'], marine.health, medic.health

이렇게 힐만 하다가...

힐만 하다가.... 죽은... 불쌍한 메딕... 입니다!

 

마지막으로 적과 마린이 동시에  죽는 일기토를 하게 실행해봅시다!

marine.attack()
marine.attack()
medic.heal()
marine.attack()
medic.heal()
marine.attack()
marine.attack()
marine.attack()
enemy['health'], marine.health, medic.health

이렇게 힐을 두번만 주고 나머지 어택을 때리면...

싸우다가 둘다 죽는... 슬픈 모습이네여...


오늘은 스타크래프트의 마린과 메딕으로 적과 싸우는 코드를 만들어봤네여...

 

저는 스타보단 롤이긴 해요... ㅋㅋㅋ

 

근데 수업을 듣고 나니 강사님이 원하는 방향은 아니었네여...

 

저는 그럼 이만...

댓글