코딩한걸음
article thumbnail
728x90
반응형

Today I Learned


어떤 문제가 있었는지

개인과제중에 회피율을 적용하고 공격 시 랜덤으로 회피하게 만들고 싶었음

1) 회피 확률을 정의

2) 공격 성공 결과값 정의 - 랜덤으로 True, False 출력

3) 결과값이 True면 공격, False면 공격실패


내가 시도해 본 것들

1) 회피확률을 먼저 정의를 해봤다.

일단 기존에 선후공을 정하던 speed를 활용해서 코드를 짜봄

miss = max((other.speed-self.speed*2)/20,0)

max를 활용하면 최저값을 정할 수 있다. 여기서 최저값은 0으로 설정했는데, 확률은 음수가 없기때문

수치는 밸런스 생각안하고 그냥 무지성으로 정함

 

2) 공격 성공 결과값 정의 - 랜덤으로 True, False 출력

result = random.choices(range(0,1), weights = [miss, 1-miss])

처음에 정의한 결과값. random.choices와 range(0,1)을 사용했는데 오류가 뜬다


어떻게 해결 했는지

먼저 오류 메세지를 확인하면 대부분의 오류는 고칠 수 있다

ValueError를 보면 weights의 수와 일치하지 않는다고 뜬다

 

첫번째 실수는 range 범위를 (0,1)로 잡은것.. 이렇게하면 무조건 range = [0] 이다

range 안의 요소와 weights의 요소 갯수가 맞지 않다는 뜻

 

    def attack(self, other):
        miss = max((other.speed-self.speed*2)/20,0)
        result = random.choices(range(0,2), weights =[miss,1-miss])
        if result == 1:
            damage = random.randint(self.power -3, self.power +3)
            # self.speed()
            other.hp = max(other.hp - damage, 0)
            text = [f"{self.name}의 공격! {other.name}에게 {damage}의 데미지를 입혔습니다."]
            if other.hp == 0:
                text.append(f"{other.name}이(가) 쓰러졌습니다.")
        else :
            text = ["이런 !! 당신의 공격을 몬스터가 피했습니다"]
        return text

이렇게 수정했더니 에러는 뜨지 않는다.

 

3) 결과값이 True면 공격, False면 공격실패

근데 이상하다

여러번 반복했지만 유저와 몬스터 모두 회피만한다 ㅋㅋㅋ 수치가 이상한가? 싶다가

random.choices의 return값을 확인해보니 리스트였다..

if result == 1: 여기서 리스트라 무조건 False가 뜬 것...

if result == [1]로 수정 후 정상 작동했다


무엇을 새롭게 배웠는지

random.choices의 사용법을 확실히 알았다.

range를 정해주고 weights로 가중치를 정해줄 수도 있다.

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!