D & D 5e HP 계산기


11

D & D 캐릭터를 레벨 업할 때해야 할 모든 것을 기억하는 데 어려움이 있습니다. 어떤 이유에서든 문제가되는 것 중 하나는 새로운 최대 HP 가치가 무엇인지 파악하는 것입니다. 이 문제를 해결하려면 올바른 값을 자동으로 계산하는 프로그램이나 함수를 작성하십시오.

술어

최대 HP를 계산하기 위해 알아야 할 첫 번째 사항은 "구성 수정 자"입니다. 각 DND 문자에는 헌법에 대한 점수를 포함하여 6 개의 정수 능력 점수가 있습니다. 이 도전에 필요한 유일한 지식은 헌법 능력 점수가 헌법 수정자인 다른 통계에 어떻게 영향을 미치는지입니다. 간단히 말해서 수정자는와 같습니다 floor( (ability_score - 10) / 2 ). 모험가는 1에서 20까지의 능력 점수 만 가질 수 있습니다. 코드는 해당 범위 밖의 점수를 처리 할 필요가 없습니다. 즉, -5보다 작거나 +5보다 큰 수정자를 처리 할 필요가 없습니다. 체질 수정자는 캐릭터 레벨이 올라감에 따라 변경 될 수 있지만 HP에 미치는 영향은 소급 적용되므로 현재 최대 HP를 계산하려면 현재 값만 필요합니다.

(이것은 도전과 무관하지만, 만약 당신이있는 거은 최대 HP에 미치는 영향에 대한 호기심 : 그 이후로 당신은 "힘든"묘기 HP 계산의 목적을 위해 캐릭터의 헌법 수정 2를 추가 가정 할 수 효과적으로 은 무엇 그것은 위업의 텍스트는 아니지만 수학은 정확히 똑같이 작동합니다. 답에서이 위업을 다룰 필요는 없습니다.)

다음으로 모든 클래스에는 HP 계산에 관련된 "히트 다이"유형이 할당되어 있습니다. 다음 표는 각 클래스의 히트 주사위 목록입니다.

Sorcerer:  d6
Wizard:    d6
Bard:      d8
Cleric:    d8
Druid:     d8
Monk:      d8
Rogue:     d8
Warlock:   d8
Fighter:   d10
Paladin:   d10
Ranger:    d10
Barbarian: d12

마지막으로 캐릭터의 레벨. 이것이 영향을 미치는 것은 다음 섹션에서 누적 합계에 값을 추가하는 횟수입니다. 캐릭터의 레벨이 1부터 20까지의 정수입니다 (포함) 1 . 코드는 해당 범위 밖의 레벨을 처리 할 필요가 없습니다. 레벨 n에 도달하기 위해 캐릭터는 레벨 1에서 시작하여 레벨 업 n-1시간입니다. 예를 들어, 레벨 3 캐릭터는 레벨 1 캐릭터가되고 레벨을 두 번 올리면 원래 위치에 도달합니다.

최대 HP를 계산하는 방법

캐릭터의 최대 HP는 레벨 1의 HP와 각 레벨에서받은 증가량의 합에 더해집니다.

레벨 1에서

레벨 1에서 캐릭터의 HP는 히트 다이에서 가능한 가장 높은 롤 (다이 이름이 6면 이상인 주사위에 익숙하지 않은 사람들을위한 숫자)과 체질 수정자를 합한 것과 같습니다. 이후 레벨에서 HP를 계산할 때 헌법이 변경 될 때마다 계산의이 부분이 다시 수행되므로 캐릭터의 헌법이 항상 동일하다고 가정 할 수 있습니다.

레벨 업할 때

캐릭터가 레벨을 올릴 때마다 두 가지 옵션이 있습니다. 적중 한 주사위 중 하나를 굴 리거나 그 주사위의 평균 굴림 (반올림)을 할 수 있습니다. 어느 쪽을 선택하든 구성 수정자가 결과에 추가됩니다. 이 합계는 HP가 증가하는 금액입니다. 이 문제의 경우 평균 롤이 항상 취해 지므로 출력이 결정적입니다. (6면이 넘는 주사위에 익숙하지 않은 경우 반올림 평균 롤을로 계산할 수 있습니다 (highest_possible_roll / 2) + 1.)

한 가지 눈에 띄는 예외가 있습니다. 캐릭터의 최대 HP는 항상 적어도 1가 레벨 업을 할 때마다 증가 2 . 위 단락의 지침으로 레벨을 올릴 때 0 이하로 증가하면 대신 1 씩 증가합니다.

도전

프로그램이나 기능은 세 가지 입력 을받습니다 :

  • 캐릭터 클래스, 캐릭터 라인
  • 캐릭터의 레벨
  • 캐릭터의 헌법 능력 점수 ( 하지 수정)

그것은 것이다 출력 단 한 가지를 : 캐릭터의 현재 최대 HP.

이 링크에서 가능한 모든 입력 및 관련 출력 조합을 찾을 수 있습니다. 이 페이지에서 살펴볼 내용을 위해 30 가지 테스트 사례를 무작위로 선택했습니다.

Barbarian, 15th level, 13 CON: 125
    Rogue, 10th level, 18 CON: 93
   Wizard, 15th level, 18 CON: 122
   Wizard, 16th level,  1 CON: 16
Barbarian, 15th level,  7 CON: 80
  Warlock, 15th level,  3 CON: 18
   Ranger, 14th level,  1 CON: 18
  Warlock,  3rd level, 14 CON: 24
    Druid,  3rd level,  4 CON: 9
   Cleric, 11th level,  5 CON: 25
     Bard, 20th level, 11 CON: 103
Barbarian, 11th level, 13 CON: 93
     Bard,  8th level, 19 CON: 75
     Bard, 16th level, 17 CON: 131
  Fighter, 10th level,  6 CON: 44
     Monk, 10th level,  2 CON: 13
   Cleric, 14th level, 17 CON: 115
   Cleric,  6th level,  5 CON: 15
    Rogue,  7th level, 13 CON: 45
   Cleric,  4th level, 14 CON: 31
    Rogue, 19th level, 15 CON: 136
  Paladin, 13th level, 13 CON: 95
   Cleric, 13th level, 15 CON: 94
     Bard,  8th level,  5 CON: 19
     Monk, 20th level, 11 CON: 103
Barbarian,  8th level, 20 CON: 101
     Monk,  1st level,  4 CON: 5
     Bard,  5th level, 17 CON: 43
     Monk, 18th level,  7 CON: 57
   Wizard, 17th level,  5 CON: 19

1. 엄밀히 말하면, 20이 최대 수준이라고 말하는 규칙은 없다고 생각합니다. 그러나 21은 책에 테이블이 없어서 규칙에 도달하기 위해 필요한 경험의 양을 포함하여 규칙의 다양한 숫자 중 일부를 알려줍니다. 그것은 저에게 충분한 레벨 캡입니다.

2. 실제로 이것이 RAW에서는 사실이라고 생각하지 않습니다. 나는 rpg.se에 물었고 그런 것은 어디에도 쓰여 있지 않은 것으로 보입니다. 그러나 D & D의 수석 설계자 인 Mike Mearls는 2015 년 3 월에 트윗했습니다 . 이것은 제레미 크로포드 (Jeremy Crawford)의 리드 룰 (Lead Rule) 개발자로부터 트윗을 주장 할 수있는 권위있는 방법은 아니지만 이것이 의도 한 증거이므로이 도전에 사용할 것입니다.


클래스가 문자열로 제공되어야합니까, 아니면 클래스에 대한 유일한 관련 정보 인 경우 히트 다이의 수로 제공 될 수 있습니까? 그렇지 않으면 사람들은 "이 클래스가 죽으면이 클래스가 죽으면이 죽으면"등의 일반적인 표가 필요할 것입니다.
Skidsdev

또한 수준과 구성이 정수로 전달되거나 "xth level"및 "y CON"이라는 문자열로 전달됩니까?
Skidsdev

1
세상에, 나는 나이가 들었다, 나는 아직도이 테이블을 기억한다 : ancientscrossroads.com/adnd_tools/con_table.htm
Neil

@Mayube 아마 질문을하지 말아야하고 즉시 피자를 보러 갔을 것입니다. : P 클래스는 문자열이어야합니다. 문자열에 테이블을 짧게하는 패턴을 찾기에 충분한 데이터가 있다고 생각하기 때문입니다 (지금까지 나온 답변을 바탕으로 경우에 해당합니다). 수준과 헌법은 정수입니다.
undergroundmonorail

3
나는 나에게 던져지는 모든 정보에서 관련 정보를 파싱하는 것이 매우 어렵다는 것을 알았습니다.
Jonathan Allan

답변:


2

젤리 , 34 바이트

OSị“#®Ʋ?[’ṃ6¤ð+‘»1×⁵’¤+⁸Ḥ¤+ð⁹_10:2

클래스, 점수, 레벨의 세 가지 명령 줄 인수를 사용하는 전체 프로그램.

온라인으로 사용해보십시오!

어떻게?

ðs로 구분 된 코드 중간은 이전에 계산 된 일부 값에서 결과를 계산하는 2 진 링크입니다.

+‘»1×⁵’¤+⁸Ḥ¤+ - maxHitPoints(halfDieValue, modifier)
+             - add: halfDieValue + modifier
 ‘            - increment
  »1          - maximum of that and 1: this is the level-up delta
       ¤      - nilad followed by links as a nilad:
     ⁵        -   program's 3rd argument, level (5th command line argument)
      ’       -   decrement: this is the number of level-ups
    ×         - multiply: level-ups * level-up delta
           ¤  - nilad followed by links as a nilad:
         ⁸    -   link's left argument: halfDieValue
          Ḥ   -   double: dieValue
        +     - add: level-ups * level-up delta + dieValue
            + - add: level-ups * level-up delta + dieValue + modifier

수정자는 오른쪽에서 계산됩니다.

⁹_10:2 - getModifier(class, score)
⁹      - link's right argument, the 2nd argument, the score
 _10   - minus 10
    :2 - integer divide by 2

다이 값의 절반은 왼쪽에서 계산됩니다.

OSị“#®Ʋ?[’ṃ6¤ - getHalfDieValue(class)
O             - cast to ordinals
 S            - sum
            ¤ - nilad followed by link(s) as a nilad:
   “#®Ʋ?[’    -   base 250 literal 140775266092
          ṃ6  -   convert to base 6 but with 6s in place of 0s
  ị           - index into (1-indexed and modular)

클래스 이름의 서수 합을 모듈로로하여 최소 로 분류하는 m것을 고려 m하면서 (다이에 의한) 분류가 충돌 수율을 유지하지 않도록합니다 m=15. 길이가 15 인 목록에 해당 색인에 필요한 값 (반다이 롤)을 배치하면 Jelly의 모듈 형 색인을 사용하여 조회 할 수 있습니다 . 론을 a 6로 대체 하여 목록을 기본 6 숫자로 압축 하는 0것은 base-7 압축 또는 base-4 압축의 대안보다 짧은 바이트이며 값을 증가시킵니다 (체인에서 여분의 nilad를 사용하는 것과 관련된 바이트 오버 헤드 사용) . 7이 아닌 기본 6의 압축 해제는 (기본 변환이 아닌) 기본 압축 해제 b가 올바른 인수 일 때 암시 적 범위 구성을 가지고 있다는 사실을 사용하여 달성됩니다 .r, 정수입니다. 즉, base로 변환 r한 다음 한 번에 any 0로 변경하는 것과 같습니다 r.

그건:

         class: Sorcerer,Wizard,Bard,Cleric,Druid,Monk,Rogue,Warlock,Fighter,Paladin,Ranger,Barbarian
   Ordinal sum: 837,     625,   377, 594,   504,  405, 514,  723,    713,    697,    607,   898
        mod 15:  12,      10,     2,   9,     9,    0,   4,    3,      8,      7,      7,    13
required value:   3,       3,     4,   4,     4,    4,   4,    4,      5,      5,      5,     6

목록 13을 다시 정렬하여 인덱스 13의 6을 0으로 변환하고 기본 6에서 최소로 만듭니다.

mod 15:    2   3   4           7   8   9  10      12  13      0  
 value: 1, 4,  4,  4,  0,  0,  5,  5,  4,  3,  0,  3,  0,  0,  4

코드 만들기

                list: [1,4,4,4,0,0,5,5,4,3,0,3,0,0,4]
         from base 6: 140775266092
         to base 250: [36,9,154,64,92]
code page characters:   # ®   Ʋ  ?  [
          final code: “#®Ʋ?[’ṃ6

8

자바 스크립트 (ES6), 81 78 76 74 바이트

입력을 (class, level, constitution_ability_score) 로 가져옵니다 . 클래스는 대소 문자를 구분하지 않습니다.

(c,l,s,h=(d=parseInt(c,34)*59.9%97%77%6|4)+(s-10>>1))=>(h>0?h*l:h+l-1)+d-2

이것은 본질적으로 초기 버전과 동일한 수학을 사용하지만 이제는 조회 테이블없이 d 가 계산됩니다.

테스트 사례


초기 버전, 87 84 바이트

(c,l,s,h=(d=+'55654607554506'[parseInt(c,35)%24%15])+(s-10>>1))=>(h>0?h*l:h+l-1)+d-2

작동 원리

까다로운 부분은 클래스 문자열 c 를 해당 히트 주사위로 변환하는 것 입니다. 보다 정확하게, 우리가 저장할 값은 d = dice / 2 + 1 입니다.

우리는 다음과 같은 공식 parseInt(c, 35) % 24 % 15을 사용합니다.

Class       | Base 35 -> decimal | MOD 24 | MOD 15 | d
------------+--------------------+--------+--------+---
"Sorcerer"  |      1847055419467 |     19 |      4 | 4
"Wizard"    |               1138 |     10 |     10 | 4
"Bard"      |             484833 |      9 |      9 | 5
"Cleric"    |          662409592 |     16 |      1 | 5
"Druid"     |           20703143 |     23 |      8 | 5
"Monk"      |             973475 |     11 |     11 | 5
"Rogue"     |           41566539 |      3 |      3 | 5
"Warlock"   |        59391165840 |      0 |      0 | 5
"Fighter"   |        28544153042 |      2 |      2 | 6
"Paladin"   |        46513817828 |     20 |      5 | 6
"Ranger"    |         1434103117 |     13 |     13 | 6
"Barbarian" |     25464249364423 |      7 |      7 | 7

해당 위치 의 d 값을 문자열에 삽입하고 사용하지 않는 슬롯을 0으로 채우면 다음과 같은 결과를 얻습니다.

00000000001111
01234567890123
--------------
55654607554506

따라서 최종 공식 :

d = +'55654607554506'[parseInt(c, 35) % 24 % 15]

우리가하면 거라고 , 우리는 계산 :

h = d + ((s - 10) >> 1))

이는 각 레벨 업에서 얻는 이론적 인 포인트 수입니다.

만약 h 긍정적이고, 우리는 단순히 계산 :

h * l

그렇지 않다면, 우리는 각 레벨 업에서 적어도 1 점을 얻는다는 사실을 고려해야합니다. 따라서 대신 계산합니다.

h + l - 1

두 경우 모두 다음을 추가하여 결과를 조정합니다. 초기 포인트 수가 올바르게 통합되도록 d-2.

테스트 사례


코드에 문제가있는 것 같습니다. CON이 1 인 바드 또는 CON이 2 또는 3 인 마법사는 레벨에 관계없이 같은 수의 체력을 얻습니다.
Neil

1
@Neil 감사합니다. 나는 이것이 고정되어 있다고 생각 합니다.
Arnauld

3

배치, 172 바이트

@set/aa=1-%3/2,h=4-a
@for %%c in (-1.Sorcerer -1.Wizard 1.Fighter 1.Paladin 1.Ranger 2.Barbarian)do @if %%~xc==.%1 set/aa-=c=%%~nc,h+=c*2
@cmd/cset/a"a*=(a>>9),-~a*~-%2+h

클래스, 레벨 및 구성을 명령 행 인수로 사용합니다. 설명 : HP는 (레벨 1의 HP) + (레벨-1) + 최소 (레벨 당 HP는 0) * (레벨-1)로 계산할 수 있습니다. 레벨 당 추가 HP는 히트 다이의 절반에 체질 수정 제를 더한 값입니다. 대부분의 클래스는 d8을 사용하므로 체질의 절반 ( %3/2-1) 보다 절반이 적지 만 레벨 1의 HP는 3보다 높습니다. 레벨 당 추가 HP와 레벨 1의 HP는 d8을 사용하지 않는 6 개의 클래스에 맞게 조정됩니다. 레벨 당 추가 HP는 0으로 제한됩니다 (이 방법은 약간 골퍼하기 때문에 실제로 음의 값을 사용합니다).


2

R, 181163 바이트

function(s,n,t){a=Hmisc::Cs(rc,za,rd,er,ui,mk,gu,rl,gh,la,ng,rb)
b=c(6,6,rep(8,6),rep(10,3),12)
d=b[a == substr(s,3,4)]
m=floor((t-10)/2)
d+m+(n-1)*max(d/2+1+m,1)}

익명의 기능. 로 실행됩니다 f(class, level, CON).

설명 : 클래스 이름의 3 번째 및 4 번째 문자 (내가 찾은 가장 작은 고유 한 맵핑)를 사용하여 클래스에 s대해 주사위를 위한 벡터를 d작성합니다.

CON 모드 m는 사양과 동일하며 HP = 첫 번째 수준 ( d + m) + 나머지 수준 ( (n-1) * max(average_die + m, 1).

> f("Barbarian", 15, 13)
[1] 125
> f("Rogue", 10, 18)
[1] 93
> f("Wizard", 15, 18)
[1] 122
> f("Wizard", 16, 1)
[1] 16
> f("Barbarian", 15, 7)
[1] 80
> f("Warlock", 15, 3)
[1] 18
> f("Ranger", 14, 1)
[1] 18
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.