IT/프로그래밍

[파이썬] 파이썬 클래스 최종 [패스트 캠퍼스 챌린지 36일]

뜻밖의 행복 2022. 2. 28. 12:04
반응형

안녕하세요? 뜻밖의 행운입니다.

패스트 캠퍼스 도전 36일차

파이썬 중급 클래스 최종 입니다.

다음에 또 고급 클래스가 있을까요?

오늘은 좀 뜻깊은 실습을 했습니다.

 

바로 고전 게임 스타크래프트 ㅎ

민속놀이라고도 하죠 그런 전략 시뮬레이션 게임

유닛 생성과 관련된 실습 문제를 풀어봤는데 재미 있었습니다.

 

무엇보다 이제는 외계어 같은 개발언어를 읽고 이해 할 수 있는 수준까지는 

되어서 ㅎ

 

재미가 있네요

문제는 아래와 같습니다.

 

1) Player 클래스를 구현
속성 : 닉네임, 미네랄, 가스, 유닛리스트

2) 메서드 : 생산하기 구현
produce(이름, 미네랄, 가스, 체력, 방어막, 공격력)

Player의 미네랄과 가스가 충분한 경우
-> 유닛 객체를 생성하고 유닛리스트에 추가한다.
Player의 미네랄이 부족한 경우
-> "미네랄이 부족합니다"를 출력
Player의 가스가 부족한 경우 
-> "가스가 부족합니다"를 출력

 

그렇다면 이것을 구현한다면?

 

우선 클래스는 2개를 정의 해야 합니다. 

Player와 Plaer가 생산한 unit 클래스 

그전부터 unit 클래스는 구현 했으니 

상속이 아닌 이런 관계를 has-a 관계라고 한다고 합니다.

 

# 유닛 클래스
class Unit:
    """
    속성 : 이름, 체력, 방어막, 공격력
    """
    def __init__(self, name, hp, shield, demage):
        self.name = name
        self.hp = hp
        self.shield = shield
        self.demage = demage

# 플레이어 클래스
class Player:
    """
    속성 : 닉네임, 미네랄, 가스, 유닛리스트
    메서드 : 유닛 생산 하기
    """
    def __init__(self, nickname, mineral, gas, unit_list=[]):
        self.nickname = nickname
        self.mineral = mineral
        self.gas = gas
        self.unit_list = unit_list
    # 생산 하기
    def produce(self, name, mineral, gas, hp, shield, demage):
        if self.mineral - mineral < 0:
            print("미네랄이 부족합니다.")
        elif self.gas - gas < 0:
            print("가스가 부족합니다.")
        else:
            self.mineral -= mineral
            self.gas -= gas
            unit = Unit(name, hp, shield, demage)
            self.unit_list.append(unit)
            print(f"[{name}]을(를) 생산합니다.")

클래스 구현은 위처럼 합니다.

Unit은 별 다를거 없구요 Player는 이번에 처음 구현 한거니까 살펴보면

nickname은 유저 ID로 보시면 되고 

생산을 해야 하니까 미네랄과 가스가 있어야 겠죠?

그리고 unit 리스트의 경우는 생성할 unit 리스트를 받아 오는 것입니다.

여기서 눈여겨 볼부분은 생산 매서드죠 

self.mineral - mineral이 핵심입니다. self는 Player 객체가 가지고 있는것

그리고 - mineral은 유닛 생성시에 필요한 mineral 입니다.

아래 gas도 마찬가지구요 이것으로 생산이 가능한지 여부를 판단해야 하니까요

 

그리고 생성할 유닛 정보는

 

# 유닛 정보
unit_info = {
    "probe" : {
        "name" : "프로브",
        "mineral" : 50,
        "gas" : 0,
        "hp" : 20,
        "shield" : 20,
        "demage" : 5
    },
    "zealot" : {
        "name" : "질럿",
        "mineral" : 100,
        "gas" : 0,
        "hp" : 100,
        "shield" : 60,
        "demage" : 16
        
    },
    "dragoon" : {
        "name" : "드라군",
        "mineral" : 125,
        "gas" : 50,
        "hp" : 100,
        "shield" : 80,
        "demage" : 20
    }
}

그렇다면 잘동작하는지 봐야겠죠?

 

내 플레이어가 가지고 있는 미네랄 400, 가스 50으로 

유닛들이 잘 생산되는 것이 보입니다.

 

저는 몇번 계속 복습하면서 완전히 제것으로 만들어야 겠네요

 

 

 

반응형