Máy tính HP D & D 5e


11

Tôi gặp khó khăn trong việc ghi nhớ mọi thứ tôi phải làm khi tăng cấp cho nhân vật D & D. Vì bất kỳ lý do gì, một trong những điều khiến tôi gặp rắc rối là tìm ra giá trị HP tối đa mới của họ là bao nhiêu. Đối với thử thách này, bạn sẽ viết một chương trình hoặc hàm để tính toán giá trị chính xác một cách tự động.

Thuật ngữ

Điều đầu tiên bạn cần biết để tính HP tối đa là "Công cụ sửa đổi hiến pháp". Mỗi nhân vật DND có sáu điểm khả năng số nguyên, bao gồm một điểm cho Hiến pháp. Kiến thức liên quan duy nhất cần có cho thử thách này là cách điểm số khả năng của Hiến pháp ảnh hưởng đến một chỉ số khác, đó là công cụ sửa đổi Hiến pháp. Nói tóm lại, công cụ sửa đổi bằng floor( (ability_score - 10) / 2 ). Các nhà thám hiểm chỉ có thể có điểm khả năng từ 1 đến 20, bao gồm. Mã của bạn sẽ không bao giờ phải xử lý điểm ngoài phạm vi đó, điều đó cũng có nghĩa là nó sẽ không bao giờ phải xử lý một công cụ sửa đổi thấp hơn -5 hoặc lớn hơn +5. Mặc dù công cụ sửa đổi Hiến pháp có thể thay đổi khi tăng ký tự, nhưng hiệu ứng của nó đối với HP được áp dụng hồi tố, do đó chỉ cần giá trị hiện tại của nó là cần thiết để tính HP tối đa hiện tại.

(Điều này là hoàn toàn không liên quan đến các thách thức, nhưng nếu bạn đang tò mò về cách nó ảnh hưởng đến HP tối đa: Bạn có thể giả định "Tough" kỳ công thêm 2 đến Hiến pháp sửa đổi của một nhân vật cho mục đích tính HP, vì đó là một cách hiệu quả những gì nó làm . Đó không phải là văn bản của kỳ tích nhưng toán học hoạt động hoàn toàn giống nhau. Bạn không cần phải xử lý chiến công này trong câu trả lời của mình.)

Tiếp theo, mỗi lớp có một loại "hit die" được chỉ định, có liên quan đến việc tính toán HP. Bảng sau liệt kê súc sắc nhấn cho mỗi lớp.

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

Cuối cùng, cấp độ của nhân vật. Tất cả những gì điều này ảnh hưởng là số lần thêm một giá trị vào tổng số đang chạy trong phần sau. Cấp độ của một ký tự là một số nguyên từ 1 đến 20, bao gồm 1 . Mã của bạn sẽ không bao giờ phải xử lý một mức ngoài phạm vi đó. Để đạt cấp n, một nhân vật bắt đầu ở cấp 1 và tăng cấp n-1lần. Ví dụ, một nhân vật cấp 3 đã đến nơi họ đang ở bằng cách trở thành một nhân vật cấp 1 và tăng cấp hai lần.

Cách tính HP tối đa

HP tối đa của một nhân vật bằng với HP của họ ở cấp 1 cộng với tổng mức tăng họ nhận được ở mỗi cấp.

Ở cấp 1

Ở cấp 1, HP của một nhân vật bằng với điểm lăn cao nhất có thể trong lần chết của họ (số trong tên của con súc sắc, đối với những người không quen với súc sắc có nhiều hơn 6 mặt) cộng với công cụ sửa đổi Hiến pháp của họ. Hãy nhớ rằng khi tính toán HP ở cấp độ sau, bạn có thể cho rằng Hiến pháp của một nhân vật luôn giống nhau, vì phần tính toán này được thực hiện lại mỗi khi Hiến pháp thay đổi.

Khi lên cấp

Mỗi khi một nhân vật lên cấp, họ có hai lựa chọn. Họ có thể tung một con xúc xắc của mình hoặc lấy con lăn trung bình của con súc sắc đó (làm tròn lên). Cho dù họ chọn, công cụ sửa đổi Hiến pháp của họ sẽ được thêm vào kết quả. Tổng số này là số tiền mà HP của họ tăng lên. Đối với thử thách này, cuộn trung bình luôn được thực hiện, do đó đầu ra là xác định. (Một lần nữa, nếu bạn không quen với xúc xắc> 6 mặt, bạn có thể tính toán cuộn trung bình được làm tròn là (highest_possible_roll / 2) + 1.)

Có một ngoại lệ đáng chú ý. HP tối đa của một nhân vật luôn tăng ít nhất 1 mỗi lần họ tăng cấp 2 . Nếu các hướng dẫn trong đoạn văn trên sẽ dẫn đến tăng 0 hoặc ít hơn khi tăng cấp, thay vào đó, nó sẽ tăng thêm 1.

Các thách thức

Chương trình hoặc chức năng của bạn sẽ có ba đầu vào :

  • Lớp nhân vật, như một chuỗi
  • Cấp độ của nhân vật
  • Điểm khả năng Hiến pháp của nhân vật ( không phải sửa đổi)

Nó sẽ chỉ xuất ra một thứ: HP tối đa hiện tại của nhân vật.

Ví dụ

Mọi sự kết hợp có thể có của đầu vào và đầu ra liên quan của chúng có thể được tìm thấy tại liên kết này. Để có cái gì đó để xem trên trang này, đây là 30 trường hợp thử nghiệm được chọn ngẫu nhiên:

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. Nói đúng ra, tôi không nghĩ có một quy tắc nói 20 là mức tối đa. Tuy nhiên, 21 là điểm dừng lại trong các bảng trong cuốn sách để cho bạn biết một số số khác nhau trong các quy tắc nên bao gồm số lượng kinh nghiệm bạn cần có để đạt được nó. Đó là một mức độ đủ tốt cho tôi.

2. Tôi thực sự không nghĩ điều này đúng với RAW. Tôi đã hỏi trên rpg.se và một điều như vậy dường như không được viết ra ở bất cứ đâu. Tuy nhiên, Mike Mearls, nhà thiết kế chính của D & D, đã tweet nó vào tháng 3 năm 2015 . Đây không phải là cách mà bạn có thể tranh luận về một tweet từ nhà phát triển quy tắc chính Jeremy Crawford, nhưng đó là bằng chứng cho thấy đó là những gì họ dự định, vì vậy tôi sẽ sử dụng nó cho thử thách này.


Lớp có phải được cung cấp dưới dạng một chuỗi hay có thể được cung cấp dưới dạng số lần chết, với điều đó là thông tin liên quan duy nhất cho một lớp. Nếu không, mọi người sẽ chỉ cần một bảng chung "Nếu các lớp này thì chết, nếu các lớp này thì chết", v.v.
Skidsdev

Ngoài ra, cấp độ và hiến pháp được thông qua dưới dạng số nguyên hay chuỗi có nội dung "cấp xth" và "y CON"?
Skidsdev

1
Trời ạ, tôi đã già, tôi vẫn còn nhớ bảng này: ancentscrossroads.com/adnd_tools/con_table.htmlm
Neil

@Mayube Có lẽ không nên hỏi một câu hỏi và ngay lập tức đi ăn pizza, phải không? : P Lớp phải là một chuỗi, vì tôi nghĩ rằng có đủ dữ liệu trong các chuỗi đó để tìm các mẫu để rút ngắn bảng (dường như là trường hợp, dựa trên các câu trả lời đã có từ trước đến nay). Cấp độ và hiến pháp là ints.
undergroundmonorail

3
Tôi thấy khá khó khăn để phân tích các thông tin liên quan từ tất cả các thông tin được ném vào tôi.
Jonathan Allan

Câu trả lời:


2

Thạch , 34 byte

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

Chương trình đầy đủ lấy ba đối số dòng lệnh: lớp, điểm, cấp độ.

Hãy thử trực tuyến!

Làm sao?

Phần giữa của mã, được phân tách bằng ðs là một liên kết dyadic tính toán kết quả từ một số giá trị được tính toán trước đó:

+‘»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

Công cụ sửa đổi được tính ở phía bên tay phải:

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

Một nửa giá trị khuôn được tính ở phía bên trái:

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)

Xem xét các tổng thứ tự của các tên lớp modulo msao cho mtối thiểu trong khi giữ cho các phân loại (bằng cách chết) không bị va chạm với năng suất m=15. Đặt các giá trị bắt buộc (cuộn nửa chết) vào các chỉ mục đó trong danh sách có độ dài 15 cho phép tra cứu bằng cách lập chỉ mục mô-đun của Jelly với . Nén danh sách dưới dạng số 6 cơ bản với số đơn được 6thay thế bằng một 0byte ngắn hơn so với các lựa chọn thay thế của nén cơ sở 7 hoặc nén cơ sở 4 & tăng các giá trị (với chi phí byte được liên kết với việc sử dụng thêm một nilad trong chuỗi) . Cơ sở 6, chứ không phải 7, giải nén đạt được bằng cách sử dụng thực tế là giải nén cơ sở, (chứ không phải chuyển đổi cơ sở b), đã xây dựng phạm vi ngầm khi nó là đối số đúng,r, là một số nguyên, có nghĩa là giống như chuyển đổi sang cơ sở rvà sau đó thay đổi bất kỳ 0thành rtất cả trong một lần.

Đó là:

         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

Sắp xếp lại danh sách, chuyển đổi 6 ở chỉ số 13 thành 0 và làm cho nó tối thiểu trong cơ sở 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

Làm mã

                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 byte

Lấy đầu vào là (lớp, cấp, constlation_ability_score) . Lớp học không phân biệt chữ hoa chữ thường.

(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

Điều này về cơ bản là sử dụng toán học giống như phiên bản ban đầu của tôi, nhưng d hiện được tính mà không có bảng tra cứu.

Các trường hợp thử nghiệm


Phiên bản ban đầu, 87 84 byte

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

Làm thế nào nó hoạt động

Phần khó khăn là chuyển đổi chuỗi lớp c thành xúc xắc tương ứng. Chính xác hơn, giá trị mà chúng tôi sẽ lưu trữ là d = dice / 2 + 1 .

Chúng tôi sử dụng công thức parseInt(c, 35) % 24 % 15cho:

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

Bằng cách chèn các giá trị của d tại các vị trí tương ứng vào một chuỗi và đệm các vị trí không sử dụng bằng số 0, chúng tôi nhận được:

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

Do đó công thức cuối cùng:

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

Khi chúng ta có d , chúng ta tính toán:

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

đó là số điểm lý thuyết đạt được ở mỗi lần tăng cấp.

Nếu h dương, chúng ta chỉ cần tính toán:

h * l

Nếu không, chúng ta cần tính đến thực tế là có ít nhất 1 điểm đạt được ở mỗi lần tăng cấp. Vì vậy, chúng tôi tính toán thay thế:

h + l - 1

Trong cả hai trường hợp, chúng tôi điều chỉnh kết quả bằng cách thêm d - 2 , để số điểm ban đầu được tích hợp chính xác.

Các trường hợp thử nghiệm


Một cái gì đó dường như là sai với mã của bạn; Bards có CON là 1 hoặc Wizard có CON là 2 hoặc 3 sẽ có cùng số điểm đánh bất kể cấp độ của chúng.
Neil

1
@Neil Cảm ơn bạn đã chú ý. Tôi nghĩ rằng điều này là cố định.
Arnauld

3

Mẻ, 172 byte

@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

Lấy lớp, cấp độ và hiến pháp làm đối số dòng lệnh. Giải thích: HP có thể được tính là (HP ở cấp 1) + (cấp - 1) + phút (HP tiếp theo mỗi cấp, 0) * (cấp - 1). HP mỗi cấp tiếp theo là một nửa số điểm chết cộng với công cụ sửa đổi hiến pháp. Hầu hết các lớp sử dụng d8 nên điều này trở thành ít hơn một nửa hiến pháp ( %3/2-1), trong khi HP ở cấp 1 nhiều hơn 3. HP tiếp theo mỗi cấp và HP ở cấp 1 sau đó được điều chỉnh cho sáu lớp không sử dụng d8. HP mỗi cấp tiếp theo sau đó được giới hạn ở mức 0 (điều này thực sự sử dụng giá trị âm vì nó hơi golf hơn theo cách này.)


2

R, 181 163 byte

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)}

Chức năng ẩn danh. Chạy như f(class, level, CON).

Giải thích: Tạo các vectơ cho lớp sđể xúc xắc tối đa d, sử dụng các chữ cái thứ 3 và thứ 4 trong tên lớp (ánh xạ duy nhất nhỏ nhất tôi tìm thấy).

CON mod mlà trực tiếp từ thông số kỹ thuật và HP = cấp đầu tiên ( d + m) + phần còn lại của các cấp độ ( (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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.