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로 지정하고 출력해주겠다는 뜻의 함수
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 곱해서 출력
# 공격할 때 쓰는 함수
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값을 조건문에서 사용
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)