[WIL-3] 팀 프로젝트 회고

우소라·2023년 4월 3일
0
  1. setattr, getattr 활용
    1) setattr: object에 할당하고 싶은 특성에 어떠한 값을 정해줄 때, Java의 set이랑 비슷한 것 같다.
    2) getattr: object의 특성에 어떠한 값을 출력, 가져오고 싶을 때 쓰임

ex)

def change_status(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, f"_{key}", value)

def get_status(self, *args):
        args_list = [getattr(self, f"_{arg}") for arg in args]
        return args_list

앞에 클래스 선언되어 있음
-> 위의 코드에선 본인 클래스의 key값에 value값을 지정해 준다음, 출력하는 형식
args, kwargs는 함수를 선언할 때, 입력하는 사람이 어떤 인자를 입력할지 모를 때 사용하고 차이는 키워드 유무로 나뉨
따라서, 입력하는 사람이 입력한 인자를 자신의 클래스의 attribute에 value로 지정하고 출력해주겠다는 뜻의 함수

  1. if/else, if not 한줄로 쓰기
is_critical = True if random.random() < self._level * 0.05 else False

damage = damage_ if not is_critical else int(damage_ * 1.5)

-> 첫번째 예시는 랜덤값이 레벨보다 작으면 T, 같거나 크면 레벨에 0.05 곱하기
-> 두번째 예시: is_critical이 아니라면 damage값으로, 그 외엔 damage의 1.5 곱해서 출력

  1. 반환값을 리스트에 넣기
 # 공격할 때 쓰는 함수
    def attack(self):
        # 플레이어/몬스터가 일반공격 시도 (레벨 1:85%/ 레벨2: 90%/ 레벨3: 95% 확률로 공격 성공, 레벨별 5%/10%/15% 확률로 공격 대성공(원래 데미지에 1.5배 큼))
        print(f'{self._name}의 공격!!!')
        level_luck = (self._max_level - self._level + 1) * 0.05
        if random.random() > level_luck:
            is_critical = True if random.random() < self._level * 0.05 else False
            damage_ = random.randint(
                int(self._power * 0.8), int(self._power * 1.2))
            damage = damage_ if not is_critical else int(damage_ * 1.5)
            return [True, False, damage, is_critical]
        return [False, False, 0, False]
        
# attack_info = [is_attack_success, is_area_attack, damage, is_critical]

-> return값을 attack_info에 담고, 리스트에 저장하는 걸 실행 코드에 써준다음

 def attacked(self, attack_info: list):
        # attack_info = [is_attack_success, is_area_attack, damage, is_critical]
        if self._is_alive:
            if attack_info[0]:
                if attack_info[3]:
                    print(
                        f"{self._name}이(가) 기습 공격을 당해 {attack_info[2]}의 데미지를 입었습니다.")

리스트에 있는 attack_info값을 조건문에서 사용

  1. 딕셔너리를 리스트 안에 저장하기
dict_monster_rank1 = {
    "1": Monster("좀비", 1, "저주"), "2": Monster("구울", 1, "광신"), "3": Monster("황혼의 유령", 1, "축복받은 조준"),
    "4": Monster("가시 마귀", 1, "가시폭풍"), "5": Monster("가시 야수", 1, "서슬퍼런 칼날"), "6": Monster("서슬 가시", 1, "위세"),
    "7": Monster("가시 박쥐", 1, "맹공"), "8": Monster("어둠의 사냥꾼", 1, "암흑 화살")
}
dict_monster_rank2 = {
    "1": Monster("미라", 2, "암흑 최면"), "2": Monster("발굴된 시체", 2, "독"), "3": Monster("망자", 2, "암흑 주술"),
    "4": Monster("카데바", 2, "감염"), "5": Monster("지네", 2, "근접"), "6": Monster("모래 구더기", 2, "스톤 스킨")
}
dict_monster_rank3 = {
    "1": Monster("거대 거미", 3, "멀티플 샷"), "2": Monster("저승 꼭두각시", 3, "순간 이동"), "3": Monster("황혼의 영혼", 3, "암흑 혼령")
}

이렇게 딕셔너리를 여러개 생성해야할 때, 효율적으로 관리 하는 방법은 리스트 안에 저장하는 것

monster_dict = [
    {
        "1": Monster("좀비", 1, "저주"), "2": Monster("구울", 1, "광신"), "3": Monster("황혼의 유령", 1, "축복받은 조준"),
        "4": Monster("가시 마귀", 1, "가시폭풍"), "5": Monster("가시 야수", 1, "서슬퍼런 칼날"), "6": Monster("서슬 가시", 1, "위세"),
        "7": Monster("가시 박쥐", 1, "맹공"), "8": Monster("어둠의 사냥꾼", 1, "암흑 화살")
    },
    {
        "1": Monster("미라", 2, "암흑 최면"), "2": Monster("발굴된 시체", 2, "독"), "3": Monster("망자", 2, "암흑 주술"),
        "4": Monster("카데바", 2, "감염"), "5": Monster("지네", 2, "근접"), "6": Monster("모래 구더기", 2, "스톤 스킨")
    },
    {
        "1": Monster("거대 거미", 3, "멀티플 샷"), "2": Monster("저승 꼭두각시", 3, "순간 이동"), "3": Monster("황혼의 영혼", 3, "암흑 혼령")
    },
]

그리고 호출할 때

# 2. 몬스터 생성
        def create_monster_list_with_name_list(_monster_dict: dict):
            def func(__monster_dict: dict, __monster_list: list, __monster_name_list: list, round: int):
                already_used_monster_number_list = []

                for _ in range(round):
                    length = len(__monster_dict)
                    monster_number = random.randint(1, length)

0개의 댓글

관련 채용 정보