เครื่องคำนวณ HP D&D 5e


11

ฉันมีปัญหาในการจดจำทุกสิ่งที่ฉันต้องทำเมื่อปรับระดับตัวอักษร D & D ไม่ว่าด้วยเหตุผลใดก็ตามสิ่งหนึ่งที่ทำให้ฉันมีปัญหาก็คือการหาว่าค่า HP สูงสุดใหม่ของพวกเขาควรเป็นเท่าไหร่ สำหรับความท้าทายนี้คุณจะเขียนโปรแกรมหรือฟังก์ชันเพื่อคำนวณค่าที่ถูกต้องโดยอัตโนมัติ

คำศัพท์

สิ่งแรกที่คุณต้องรู้เกี่ยวกับการคำนวณ HP สูงสุดคือ "ตัวแก้ไขรัฐธรรมนูญ" อักขระ DND แต่ละตัวมีคะแนนความสามารถจำนวนเต็มหกคะแนนรวมถึงหนึ่งคะแนนสำหรับรัฐธรรมนูญ ความรู้ที่เกี่ยวข้องเฉพาะที่จำเป็นสำหรับการท้าทายนี้คือคะแนนความสามารถของรัฐธรรมนูญมีผลต่อสถิติอื่นซึ่งเป็นตัวแก้ไขรัฐธรรมนูญ floor( (ability_score - 10) / 2 )ในระยะสั้นปรับปรุงมีค่าเท่ากับ นักผจญภัยสามารถมีคะแนนความสามารถได้ตั้งแต่ 1 ถึง 20 เท่านั้น รหัสของคุณจะไม่ต้องจัดการกับคะแนนนอกช่วงดังกล่าวซึ่งหมายความว่าจะไม่ต้องจัดการกับตัวปรับแต่งที่ต่ำกว่า -5 หรือมากกว่า +5 แม้ว่าตัวดัดแปลงรัฐธรรมนูญสามารถเปลี่ยนแปลงได้ตามระดับตัวละคร แต่เอฟเฟกต์ของ HP จะมีผลย้อนหลังดังนั้นจึงจำเป็นต้องใช้ค่าปัจจุบันเพื่อการคำนวณค่า HP สูงสุดในปัจจุบัน

(นี่คือทั้งหมดที่ไม่เกี่ยวข้องกับความท้าทาย แต่ถ้าคุณอยากรู้เกี่ยวกับวิธีการที่จะส่งผลกระทบต่อ HP สูงสุด: คุณสามารถสันนิษฐานได้ว่า "ยาก" feat เพิ่ม 2 ถึงตัวละครตัวแก้ไขรัฐธรรมนูญเพื่อวัตถุประสงค์ในการคำนวณ HP ตั้งแต่ที่มีประสิทธิภาพสิ่งที่มันไม่ นั่นไม่ใช่ข้อความของเพลง แต่คณิตศาสตร์ก็ออกมาเหมือนกันคุณไม่ต้องจัดการเพลงนี้ในคำตอบของคุณ)

ถัดไปทุกคลาสจะมีประเภท "hit ตาย" ที่ได้รับมอบหมายซึ่งเกี่ยวข้องกับการคำนวณ 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 สูงสุดของตัวละครเท่ากับ HP ที่ระดับ 1 บวกกับจำนวนการเพิ่มที่ได้รับในแต่ละระดับ

ที่ระดับ 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, ทวีมีนาคม 2015 นี่ไม่ใช่วิธีที่คุณสามารถโต้เถียงทวีตจากนักพัฒนากฎตะกั่วเจเรมีครอว์ฟอร์ด แต่มันก็เป็นหลักฐานว่ามันเป็นสิ่งที่พวกเขาตั้งใจดังนั้นฉันจะใช้มันสำหรับความท้าทายนี้


คลาสต้องได้รับเป็นสตริงหรือสามารถกำหนดเป็นจำนวนของ Hit ตายได้เนื่องจากเป็นข้อมูลที่เกี่ยวข้องสำหรับคลาสเท่านั้น มิฉะนั้นคนก็จะต้องมีตารางทั่วไป "ถ้าชั้นเรียนเหล่านี้แล้วตายนี้ถ้าชั้นเรียนเหล่านี้แล้วตายนี้" ฯลฯ
Skidsdev

นอกจากนี้ยังมีระดับและรัฐธรรมนูญผ่านเป็นจำนวนเต็มหรือเป็นสตริงที่พูดว่า "ระดับ xth" และ "y CON"
Skidsdev

1
เอ้ยฉันแก่แล้วฉันยังจำตารางนี้ได้: ancientscrossroads.com/adnd_tools/con_table.htm
Neil

@Mayube อาจไม่ควรถามคำถามและออกไปหาพิซซ่าทันทีใช่มั้ย? : P คลาสจะต้องเป็นสตริงเพราะฉันคิดว่ามีข้อมูลเพียงพอในสตริงเหล่านั้นเพื่อค้นหารูปแบบเพื่อทำให้ตารางสั้นลง (ซึ่งดูเหมือนจะเป็นกรณีนี้ ระดับและรัฐธรรมนูญเป็น ints
undergroundmonorail

3
ฉันพบว่ามันค่อนข้างยากที่จะแยกวิเคราะห์ข้อมูลที่เกี่ยวข้องจากข้อมูลทั้งหมดที่ส่งถึงฉัน
Jonathan Allan

คำตอบ:


2

เยลลี่ 34 ไบต์

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

โปรแกรมเต็มรูปแบบรับอาร์กิวเมนต์บรรทัดคำสั่งสามข้อ: คลาส, คะแนน, ระดับ

ลองออนไลน์!

อย่างไร?

จุดกึ่งกลางของรหัสคั่นด้วยðs คือลิงก์ dyadic ซึ่งคำนวณผลลัพธ์จากค่าที่คำนวณก่อนหน้านี้บางส่วน:

+‘»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 ช่วยให้การค้นหาโดยใช้การจัดทำดัชนี modular วุ้นกับ การบีบอัดรายการเป็นหมายเลขฐาน 6 พร้อมกับการ6แทนที่ด้วย a 0คือไบต์ที่สั้นกว่าทางเลือกของการบีบอัดฐาน 7 หรือการบีบอัดฐาน 4 และการเพิ่มค่า . ฐาน 6, มากกว่า 7, การคลายการบีบอัดทำได้โดยการใช้ความจริงที่การคลายการบีบอัดฐาน(แทนที่จะเป็นการแปลงพื้นฐานb), มีการสร้างช่วงโดยปริยายเมื่อมีการโต้แย้งที่ถูกต้อง,rเป็นจำนวนเต็มซึ่งหมายความว่าเป็นเหมือนการแปลงฐานrแล้วเปลี่ยน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

การจัดเรียงใหม่ไปยังรายการแปลง 6 ที่ดัชนี 13 เป็นศูนย์และทำให้น้อยที่สุดในฐาน 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

JavaScript (ES6), 81 78 76 74 ไบต์

จะเข้าเป็น(ชั้นระดับ 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 = ลูกเต๋า / 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ที่ตำแหน่งที่สอดคล้องกันลงในสตริงและ padding สล็อตที่ไม่ได้ใช้ด้วยค่าศูนย์เราจะได้รับ:

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

ดังนั้นสูตรสุดท้าย:

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

เมื่อเรามีdเราจะคำนวณ:

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

ซึ่งเป็นจำนวนคะแนนทางทฤษฎีที่ได้รับในแต่ละระดับขึ้น

ถ้าhเป็นค่าบวกเราก็คำนวณ:

h * l

ถ้าไม่เราต้องคำนึงถึงความจริงที่ว่าได้รับอย่างน้อย 1 จุดในแต่ละระดับ ดังนั้นเราจึงคำนวณแทน:

h + l - 1

ในทั้งสองกรณีเราปรับผลโดยการเพิ่มd - 2เพื่อให้จำนวนจุดเริ่มต้นถูกรวมอย่างถูกต้อง

กรณีทดสอบ


มีบางอย่างผิดพลาดกับรหัสของคุณ Bard ที่มีค่า CON 1 หรือ Wizards ที่มีค่า CON 2 หรือ 3 จะได้รับจำนวน Hit points เท่ากันทุกระดับ
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 สามารถคำนวณได้เป็น (HP ที่ระดับ 1) + (ระดับ - 1) + นาที (HP เพิ่มเติมต่อระดับ 0) * (ระดับ - 1) ค่า HP ต่อระดับที่เพิ่มขึ้นคือครึ่งหนึ่งของค่าพลังชีวิตและค่าโมดิฟายเออร์ คลาสส่วนใหญ่ใช้ d8 ดังนั้นสิ่งนี้จึงกลายเป็นรัฐธรรมนูญน้อยกว่าครึ่งหนึ่ง ( %3/2-1) ในขณะที่ HP ที่ระดับ 1 มากกว่า 3 HP เพิ่มเติมต่อระดับและ HP ที่ระดับ 1 จะถูกปรับสำหรับหกคลาสที่ไม่ใช้ d8 HP ต่อระดับที่เพิ่มขึ้นจะถูก จำกัด ไว้ที่ 0 (ซึ่งจริง ๆ แล้วใช้ค่าลบเนื่องจากมันเป็นนักกอล์ฟน้อยกว่าด้วยวิธีนี้)


2

R, 181 163 ไบต์

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)ทำงานเป็น

คำอธิบาย: สร้างเวกเตอร์สำหรับคลาสsเพื่อลูกเต๋าสูงสุดdโดยใช้ตัวอักษรที่ 3 และ 4 ในชื่อคลาส (การแม็พที่ไม่ซ้ำกันที่เล็กที่สุดที่ฉันพบ)

CON mod 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.