У меня проблемы с запоминанием всего, что я должен делать при прокачке персонажа D & D. По какой-то причине одна из вещей, которая доставляет мне неприятности, - это выяснить, каким должно быть их новое максимальное значение HP. Для этой задачи вы напишите программу или функцию для автоматического вычисления правильного значения.
терминология
Первое, что вам нужно знать о том, как рассчитать максимальное количество здоровья, - это «модификатор Конституции». Каждый персонаж DND имеет шесть целочисленных показателей способностей, в том числе один для Телосложения. Единственное релевантное знание, необходимое для этого задания, - это то, как показатель способности Телосложения влияет на другой показатель, который является модификатором Телосложения. Короче, модификатор равен floor( (ability_score - 10) / 2 )
. Авантюристы могут иметь очки способностей от 1 до 20 включительно. Вашему коду никогда не придется обрабатывать оценки за пределами этого диапазона, что также означает, что ему никогда не придется обрабатывать модификатор ниже -5 или больше +5. Хотя модификатор Телосложения может меняться по мере повышения уровня персонажа, его эффекты на HP применяются задним числом, поэтому для вычисления текущего максимального HP необходимо только его текущее значение.
(Это не имеет никакого отношения к задаче, но если вам интересно, как она влияет на максимальный HP: вы можете предположить, что умение «Крепкий» добавляет 2 к модификатору Телосложения персонажа для целей расчета HP, поскольку это фактически то, что он делает. Это не текст подвига, но математика получается точно такой же. Вам не нужно обрабатывать этот подвиг в своем ответе.)
Затем каждому классу присваивается тип «Hit Die», который участвует в расчете 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. Для этой задачи всегда используется средний бросок, поэтому результат является детерминированным. (Опять же, если вы не знакомы с> шестигранными кубиками, вы можете рассчитать округленный до среднего бросок как (highest_possible_roll / 2) + 1
.)
Есть одно заметное исключение. Максимальное здоровье персонажа всегда увеличивается как минимум на 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, и такая вещь, кажется, нигде не записана. Однако Mike Mearls, ведущий дизайнер D & D, написал это в марте 2015 года . Это не является авторитетным способом, которым вы могли бы поспорить с твиттером от ведущего разработчика правил Джереми Кроуфорда, но это доказательство того, что они и хотели, поэтому я буду использовать его для этой задачи.
Ответы:
Желе , 34 байта
Полная программа, принимающая три аргумента командной строки: класс, оценка, уровень.
Попробуйте онлайн!
Как?
Середина кода, разделенная символом
ð
s, представляет собой двоичную ссылку, которая вычисляет результат по некоторым ранее вычисленным значениям:Модификатор рассчитывается с правой стороны:
Половина значения матрицы рассчитывается с левой стороны:
Рассматривая порядковые суммы имен классов по модулю так
m
, чтобы они былиm
минимальными при сохранении классификаций (по кубикам) от встречных выходовm=15
. Помещение требуемых значений (бросок на половину матрицы) в эти индексы в списке длиной 15 позволяет осуществлять поиск с использованием модульной индексации Jelly сị
. Сжатие списка в виде числа базы 6 с6
заменой единственного числа на a0
на байт короче, чем альтернативы сжатия base-7 или base-4 и увеличения значений (с использованием байтовых издержек, связанных с использованием дополнительной nilad в цепочке) , Декомпрессия base 6, а не 7, достигается тем, что декомпрессия baseṃ
(вместо базового преобразованияb
) имеет неявную конструкцию диапазона, когда это правильный аргумент,r
, является целым числом, что означает, что это все равно, что преобразовать в базу,r
а затем заменить любой0
наr
все сразу.Это:
Переставляем список, конвертируем 6 в индексе 13 в ноль и делаем его минимальным в базе 6:
Создание кода
источник
JavaScript (ES6),
81787674 байтаПринимает ввод как (класс, уровень, constitution_ability_score) . Класс нечувствителен к регистру.
По сути, это та же математика, что и в моей первоначальной версии, но теперь d вычисляется без таблицы поиска.
Контрольные примеры
Показать фрагмент кода
Начальная версия,
8784 байтаКак это работает
Сложная задача - преобразовать строку класса c в соответствующий кубик попадания. Точнее, значение, которое мы собираемся сохранить, равно d = dice / 2 + 1 .
Мы используем формулу,
parseInt(c, 35) % 24 % 15
которая дает:Вставляя значения d в соответствующих позициях в строку и дополняя неиспользуемые слоты нулями, мы получаем:
Отсюда и окончательная формула:
Как только у нас есть d , мы вычисляем:
это теоретическое количество очков, которые набираются на каждом уровне.
Если h положительно, мы просто вычисляем:
Если нет, мы должны принять во внимание тот факт, что по крайней мере 1 очко набирается на каждом уровне. Поэтому вместо этого мы вычисляем:
В обоих случаях мы корректируем результат, добавляя d - 2 , чтобы начальное количество точек было правильно интегрировано.
Контрольные примеры
Показать фрагмент кода
источник
Пакет, 172 байта
Принимает класс, уровень и состав в качестве аргументов командной строки. Объяснение: HP можно рассчитать как (HP на уровне 1) + (уровень - 1) + min (далее HP за уровень, 0) * (уровень - 1). Дальнейшее здоровье за уровень составляет половину хитового кубика плюс модификатор конституции. Большинство классов используют d8, так что это становится на половину меньше конституции (
%3/2-1
), в то время как HP на уровне 1 на 3 больше, чем это. Далее HP за уровень и HP на уровне 1 затем корректируются для шести классов, которые не используют d8. Дальнейшее количество HP за уровень ограничивается 0 (на самом деле используется отрицательное значение, так как в этом случае он немного сложнее).источник
R
181163 байтаАнонимная функция. Работает как
f(class, level, CON)
.Объяснение: Создает векторы для класса
s
от максимума до костиd
, используя 3-ю и 4-ю буквы в имени класса (наименьшее уникальное сопоставление, которое я нашел).CON мод
m
прямо из спецификации, а HP = первый уровень (d + m
) + остальные уровни ((n-1) * max(average_die + m, 1)
.источник