캡으로 단순 감소 리턴


19

문제

플레이어는 레벨 당 최대 400 점으로 레벨 당 5 점을 얻습니다. 분배 할 스탯은 5 개이며 스탯에 추가 할 수있는 최대 한도는 없습니다.

  • 지구력
  • 지성
  • 민첩
  • 행운-치명타 및 치명타

Luck에 대해 감소하는 반환 방정식을 구현하고 싶습니다. 치명타 확률로 플레이어가 치명타 확률 100 %를 달성하기를 원하지 않습니다.

점점 증가하는 성장이 추가 된 포인트 당 0에 도달함에 따라 도달 할 한도가있을 것입니다.

예를 들어 플레이어가 가질 수있는 최대 치명타 확률이 40 % 인 경우, 각 행운은 치명타 확률이 약 40 %에이를 때까지 점점 낮아집니다. 이로 인해 1 행운은 매우 작은 양을 줄 것입니다.

어떤 솔루션? 감사합니다. 도와 주셔서 감사합니다!



@BlueRaja 나는 그것이 중복이 아니라고 생각합니다. 이 질문은 일반적으로 반환 계산 기능을 감소시키는 것입니다. 손상 계산에 관한 것입니다. 그것이 일어날 때, 그에 대한 대답은 주로 감소 반환 기능에 대해 논의했지만 질문은 여전히 ​​명확하게 다르다고 생각합니다.
Anko

답변:


30

점근 기능으로 시작하려고합니다. 즉, 숫자에서 시작하여 a다른 숫자에 접근 b하지만 실제로는 도달하지 않습니다. 아마도 a = 0and 가 가장 쉬울 것 b = 1입니다. 이 방정식을 사용하여 캐릭터가 가진 스탯 포인트 수 (럭 포인트)를 입력하고 실제 스탯 값 (치명 확률)을 출력으로 가져옵니다.

매우 간단한 예는 양의 상수 가 y = x / (x + n)있는 곳 n입니다. 여기 x에 당신의 입력이 있으며, 당신은 스탯 포인트의 수를 입력 y하고 최종 스탯 값을 얻는 출력입니다.

들어하는 것은 n = 5그것이 어떻게 생겼는지 체크 아웃 :

[0,100]에서 x에 대한 y = x / (x + 5) 플롯

당신이 피드 x = 0를 얻을 때, 당신 y = 0이 얼마나 큰 x넣어도 y절대 도달하지 않습니다 1. 완벽합니다.

지금, 당신은 당신의 마음 원하는대로 이것을 조정할 수 있습니다. '캡'을 원하는대로 설정하기 위해 스케일 팩터를 곱할 수 있습니다. y = a * x / (x + 5). 상한을 40 %로하려면 .4를 곱하십시오. y = .4 * x / (x + n). 당신이 공급되면 지금 x의 ' y증가하지만, 꽤 0.4에 도달하지 않습니다.

조정 n얼마나 빨리 설정하거나 방정식 경사로 둔화. n = 100다음보다 훨씬 느리게 증가합니다 n = 5.

[0,400]에서 x에 대한 y = x / (x + 100) 플롯

n특정 수치 스탯 포인트에 도달하려는 스탯 값을 원하는 경우이 방정식을 풀 수 있습니다 . 캐릭터가 행운 100 포인트에서 치명타 확률이 35 % 여야한다고 가정합니다. 해결 .35 = .4 * 100 / (100 + n)을위한 n수율 n = 14.29.

이 숫자는 원시 상수 일 필요는 없습니다. 다른 통계는의 값을 계산할 수 있습니다 n. 어쩌면 일부 캐릭터의 특성이 다르기 n때문에 '선호'통계에서 더 잘 확장 될 수 있습니다.

모양이 다르거 나 더 복잡한 곡선을 원할 경우 사용할 수있는 점근 기능의 다른 예가 많이 있습니다. 원하는대로 탐색하도록하겠습니다.


3
내가 가장 좋아하는 곡선은 지수 곡선입니다. 각 레벨마다 나머지 풀의 고정 비율을 가져 가십시오.
존 드보락

완전성을 위해 @JanDvorak, 예를 들어 줄 수 있습니까? 지수 곡선이 많으며 독자는 이전 의견의 제안 만 적용하는 방법을 모를 수 있습니다.
아담

이것은 좋은 출발점이며 수학은 잘 설명되어 있지만, 좋아 보이는 기능을 선택할 수는 없습니다. 이 문제는 신중한 고려와 많은 조정이 필요합니다. 예를 들어,이 방법의 단점 중 하나는 전문화에 대한 실망입니다. 5 개의 스탯이 모두 똑같이 실행 가능한 경우 가장 적게 개발 된 스탯에 소비 된 포인트가 가장 가치가 있습니다 (가장 발달 한 스탯이 가장 낮음). 이상적인 빌드는 포인트의 균등 한 분배 일 것이므로 플레이어가 포인트를 덜 소비하는 방법을 선택할 수 있습니다.
마르크스 토마스

@MarcksThomas 속성간에 시너지 효과가 없거나 속성을 전술적으로 격리하고 "승리"하는 능력이 없다고 가정합니다. 예를 들어, 적들이 죽기 전까지 민첩성을 높이는 놀라운 궁수를 상상해보십시오. 민첩성이 효과가 떨어지더라도 선택한 전술은 다른 특성을 중요하지 않게 만듭니다. 힘을 수반하는 또 다른 전술은 똑같이 효과적 일 수 있으므로 특성은 "동일한 가치"이지만 전술은 종종 전문화가 지배적이라는 것을 의미합니다. 당신의 속성 시스템이 전문화에 대해서도 보상한다면, 게임은 다양합니다.
Yakk

나는 이것을 "가방에서 돌을 뽑아"시스템이라고 부른다. 값 P = x/(x+n)은 n 개의 검은 색 돌과 x 개의 흰색 돌이있는 가방을 고려할 때 가방 블라인드에서 흰색 돌을 그릴 확률입니다. 당신이 할 수있는 한 가지 접근 방식은 치명타를 X = 당신의 행운으로, N = 그들의 행운을 설정하는 것입니다. 적과 같은 운이 있다면 치명타 확률은 50 %입니다. 기본 확률을 10 %로하려면 X = 운, N = 9 배입니다.
Yakk

10

좋은 밑변은 arctan원점을 통과하고 수평 점근선을 나타 내기 때문에 와 같은 함수 입니다.

아크 탄

그것을 기준으로 확장 40 / (pi/2), 또는 80/pi원하는 한도에 따라 를 조정하십시오. 그런 다음 luck원하는 곡선 가파른 각도로 변환 하십시오.

critical = 80/pi * arctan(f(luck))

8

Souls 게임이이 문제를 해결하는 방식이 정말 마음에 듭니다. 각 스탯이 제안 된대로 연속 기능을 기반으로 보너스를 제공하는 대신, 부분 선형 함수로 보너스를 제공합니다.

머리 꼭대기에서 정확한 숫자를 기억할 수는 없지만 기능은 다음과 같습니다 (각 통계에는 고유 한 상수가 있음)

{0 <= x <20 : y = 4x, 20 <= x <30 : y = 3x + 20, 30 <= x <40 : y = 2x + 50, 40 <= x <60 : y = 1x + 90 , 60 <= x : y = 0.5x + 120}

음모

이 방법은 디자이너와 플레이어에게 많은 이점을 제공합니다. 디자이너는 스킬에서 포인트 당 정확한 혜택을 상당히 사소하게 조정할 수 있으며 혜택은 레벨에서 레벨까지 얼마나 많은 혜택을 볼 수 있는지 정확하게 알기 때문에 혜택을줍니다.

연속 기능의 경우 일부 레벨은 측정 앨리어싱으로 인해 숫자에 반영되지 않는 이점을 제공 할 수 있습니다. 마지막 레벨에서 보너스 XYZ는 0.9 증가했지만 실제 값은 23.52에서 24.42로 증가했으며 표시하기 전에 숫자를 반올림했기 때문에 플레이어는 무언가 변경된 것을 인식하지 못합니다.

UX 관점에서, 나는 부분적으로 선형 함수를 사용하는 것이 좋습니다. 그러나 연속 기능을 사용하면 플레이어가 라운드 상수에 연결되지 않으므로 나중에 라인을 더 쉽게 조정할 수 있습니다.


1
많은 수학이 필요없고 변경하기 쉬운 곡선의 근사치. 나는 그것을 좋아한다. :)
Casey Kuball 18.36.

> 당신이 이전에 그것을 표시하는 숫자를 반올림 보상 => 한 가지 방법이다 증가 금액 에 추가하기 전에, 만 스탯 레벨을 정수 할 수 있습니다. 또는 다음 소프트 캡을 통해 갈 실수 방지 할 수 있습니다. ceilfloorx <= 0: x = 1
Bob

1
여전히 조각 별 기능을 수행 할 수는 있지만 여기서 원하는 효과는 없습니다. 행운 값은 최대 400 등급의 백분율입니다. 이것은 100 % 운이있는 선형 함수 일지라도 모든 등급이 1 % 이하의 값을 가져야 한다는 것을 의미 합니다 . 트릭은 y (399)가 y (400)과 다른 충분한 소수점을 보여줍니다. 함수는 y를 매우 크게 키워서 같은 일을하므로 항상 증가 할 수 있습니다. x = 40에서 y는 x 값의 4 배입니다.
MichaelS

@MichaelS 저는 Dark Souls에서 사용되는 기능 유형의 예를 보여주었습니다. 적용되는 상황에 따라 다르게 균형을 맞출 필요가 있지만, 내 요점은 플레이어가 아크 탄젠트 커브 또는 원뿔 섹션보다 조각 선형 함수의 효과를 훨씬 더 쉽게 이해할 것이라는 점입니다.
Kaslai

3

Jan Dvorak은 주석에서 지수 함수를 지적합니다. 여기에 설명하겠습니다.

지수 연산 및 삼각 연산은 기본 수학보다 훨씬 나쁜 제곱근 연산보다 훨씬 계산 비용이 많이 들기 때문에 초당 계산을 여러 번 수행하는 경우 Adam의 접근 방식을 사용하는 것이 좋습니다. . 플레이어 레벨, 장비 등을 변경할 때 값을 계산하는 경우 속도가 중요하지 않으므로 최상의 곡선을 제공하는 것을 사용하십시오.

지수 함수는 일부 밑 ( B) 과 거듭 제곱 ( x ) y=B^x입니다. 수학자들은 일반적으로 e (~ = 2.718) 의 밑을 사용 하지만 원하는 경우 2 또는 10을 사용할 수 없습니다.

y=e^x 다음과 같이 보입니다 : y = e ^ x

왼쪽이 비대칭 적으로 0으로 이동하는 것을 알 수 있습니다. 따라서 y=e^(- 를 수행하여 x 축을 뒤집을 수는 x)있지만 여전히 1에서 0으로 내림차순으로 올라 가기를 원합니다. 따라서 y=-로 y 축을 가로 질러 뒤집을 수 있습니다 e^(-x). 이제 -1에서 0으로 그것의 상승은 우리가 얻을 수 1을 추가 할 수 있습니다 y=1- e^(-x) 는 0에서 1까지 상승합니다.

y = 1-e ^ (-x)

여기에서 세로 및 가로로 크기를 조정하는 것입니다. 우리는 전체 값에 어떤 값을 곱할 수 있습니다. A 이라고 부르면 점근 적 한계를 설정합니다. 그런 다음 x 에 변화율 값 k를 곱하여 한계에서 얼마나 빨리 닫히는지를 조정할 수 있습니다.

이것은 우리에게 최종 방정식을 제공 y=A*(1 - e^(-k*x))합니다. k=0.012and 값을 사용 A=0.5하여 한계를 50 %로 설정하고 그 한계에 거의 근접하게 할 수 있습니다 x=400.

y = 0.5 * (1-e ^ (-0.012 * k))

이제 몇 가지를 조정할 수 있습니다. 내가 한 조정은로 변경 A=0.5041되었으므로 소수점 이하 두 자릿수 (예 : 32.23 %), y (399) = 49.99 % 및 y (400) = 50.00 %로 반올림합니다. y (347)부터 0.01 %의 변화를 얻기 위해 두 점이 필요한 여러 곳이 있습니다. 그러나 마지막 가능한 지점은 여전히 ​​(거의) 실질적인 이점을 제공하며 50 %까지 가져옵니다.

또는 k비슷한 효과를 내기 위해 값을 조정할 수 있습니다. 에서 k=0.02305값은에서 49.99 %,에서 y=39950.00 %로 반올림됩니다 y=400. 그러나,이 그래프가하는 문제가 매우 끝에 얕은을 - 그것은 (에서 퍼센트의 마지막 백을 얻기 위해 48 포인트를 필요 y(352)=49.99%y(399)=49.99%하는 y(400)=50.00%) 마지막 1 %의 치명타 확률 (에서 무려 230 점을 필요 y(170)=49.01%y(400)=50.00%) 아마 수익률이 약간 줄어들 것입니다.

원하는 경우 A와 k를 모두 조정하여 더 느린 속도로 약간 더 높은 한계로 감소하여 선형과 지수 붕괴 사이에 무언가를 줄 수 있습니다. 을하면 다음 y=0.6*(1-e^(-0.00447*x))과 같이 끝납니다. y = 0.6 * (1-e ^ (-0.00447 * x))

곡선은 50 %를 초과하지만, 400 등급의 하드 한계가 있기 때문에 플레이어는 해당 지점을 통과 할 수 없습니다 (그리고 통과 할 경우 여전히 60 % 치명타가 있습니다). 이 방정식을 사용하면 소수점 이하 자릿수 1을 사용할 수 있으며 2에서 3 포인트마다 게인을 확인할 y(399)=49.9%수 있습니다.y(400)=50.0% 있습니다.

수학적으로, 초기 방정식은 실제로 50 %에 접근하기 때문에 더 좋아 보일 수 있지만 개인적으로 두 점마다 0.1 %의 이득은 0.01 %의 이득보다 기분이 더 좋다고 생각합니다. 심지어로 A=0.05041하고 k=0.012, 그것은에서 이동 102 포인트를 필요 y(298)=49.00%y(400)=50.00%. 점수의 25 %가 치명타의 2 %를 소비합니다. 60 % 방정식은 마지막 퍼센트에 대해 20 포인트 만 취합니다 (첫 번째 퍼센트에 필요한 4 포인트보다 여전히 5 배 높음).

이 마지막 여러 방정식을 사용하여 방정식을 스프레드 시트에 연결하고 값이 좋아질 때까지 수동으로 값을 조정했습니다. 다른 모자를 원한다면 비슷한 것을해야합니다.


2
수학 연산의 상대 속도에 대한 메모는 정확하지만 플레이어 통계에는 관련이 없습니다. 현대 게임의 병목 현상은 일반적으로 프레임 당 수천 개의 항목 (예 : 물리 및 렌더링)을 처리하는 요소입니다. 아마도 프레임 당 수십 번 실행되는 게임 플레이 스크립트는 이것과 관련이 없을 것 같으며 일반적으로 캐시 미스로 가득 차서 CPU에 많은 시간을 투자하여 원하는 수학을 할 수 있습니다. tl; dr : 셰이더 나 거대한 배치를 실행해야하는 다른 물건을 작성하지 않는 한 값 비싼 작전을 피하라는 압력을받지 마십시오.
DMGregory

-1

매우 간단한 해결책을 위해 제곱근 x 2는 어떻습니까?

400의 제곱근 (최대 가능)은 20, 20 * 2 = 40입니다.


왜 다운 투표? 그것은 묻는 질문을 해결하고 요청한 것도 간단합니다.
Catwood

1
나는 downvoter 아니지만, 당신의 대답은 지나치게 특정 이미 제공되지 않은 정보를 제공하지 않기 때문에 아마이었다 (제곱근은의 힘에 불과 지수입니다 1/2) 당신은 설명하지 않는다 이것이 유용한 이유.
Kaslai

나는 downvote하지 않았지만 이것이 매우 유연하지 않기 때문에 이것이 좋은 대답이라고 생각하지 않습니다. 제곱근은 점근 적이 지 않으므로 최대 수준이 변경되면 최대를 유지하기 위해 수식을 변경해야합니다 같은 통계.
BlueRaja-대니 Pflughoeft
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.