Треки
/
Lean
Lean
/
Вправи
/
Персонаж D&D
Персонаж D&D

Персонаж D&D

Середня

Вступ

Після тижнів очікування ми з друзями збираємося на свою найпершу гру в Dungeons & Dragons (D&D). Оскільки це перша сесія гри, кожен гравець має згенерувати персонажа, яким гратиме. Характеристики персонажа визначаються кидками шестигранних кубиків, але де ж взяти кубики? З жахом ми розуміємо, що друзі чекають, коли кубики дістанемо саме ми; зрештою, пограти в D&D була наша ідея! Панікуючи, ми розуміємо, що забули взяти кубики, а це означало б, що гри в D&D не буде. Оскільки ми маємо базові навички програмування, ми швидко знаходимо рішення: напишемо програму, яка імітує кидки кубиків.

Вказівки

Для гри в Dungeons & Dragons кожен гравець починає зі створення персонажа, яким можна грати. Цей персонаж має, серед іншого, шість характеристик: силу, спритність, статуру, інтелект, мудрість і харизму. Значення цих шести характеристик визначаються випадково. Для цього ми кидаємо чотири шестигранні кубики й записуємо суму трьох найбільших. Робимо це шість разів, по одному разу для кожної характеристики.

Початкові хіти персонажа дорівнюють 10 + модифікатор статури персонажа. Модифікатор статури персонажа ми знаходимо так: віднімаємо 10 від статури персонажа, ділимо на 2 і округлюємо вниз.

Напишіть генератор випадкових персонажів, який дотримується наведених вище правил.

Наприклад, шість кидків чотирьох кубиків можуть мати такий вигляд:

  • 5, 3, 1, 6: відкидаємо 1, додаємо 5 + 3 + 6 = 14 і присвоюємо цю суму силі.
  • 3, 2, 5, 3: відкидаємо 2, додаємо 3 + 5 + 3 = 11 і присвоюємо цю суму спритності.
  • 1, 1, 1, 1: відкидаємо 1, додаємо 1 + 1 + 1 = 3 і присвоюємо цю суму статурі.
  • 2, 1, 6, 6: відкидаємо 1, додаємо 2 + 6 + 6 = 14 і присвоюємо цю суму інтелекту.
  • 3, 5, 3, 4: відкидаємо 3, додаємо 5 + 3 + 4 = 12 і присвоюємо цю суму мудрості.
  • 6, 6, 6, 6: відкидаємо 6, додаємо 6 + 6 + 6 = 18 і присвоюємо цю суму харизмі.

Оскільки статура дорівнює 3, модифікатор статури становить -4, а хіти дорівнюють 6.

Note

Більшість мов програмування мають (псевдо)випадкові генератори, але мало які мови програмування призначені для кидання кубиків. Одна з таких мов - Troll.

Генерування псевдовипадкових значень у Lean

У функціональних мовах більшість функцій є чистими. Це означає, що для того самого набору аргументів вони завжди повертають ті самі вихідні дані й не роблять нічого іншого. Іншими словами, чисті функції є детермінованими.

Однак за визначенням випадкове значення є непередбачуваним і недетермінованим. Навіть псевдовипадковість, тобто повернення послідовності чисел, які здаються випадковими, не так легко отримати в чистому контексті. Річ у тім, що генератор псевдовипадкових чисел (PRNG) має відстежувати внутрішній стан, щоб повернути наступне число в послідовності.

Lean пропонує два можливі підходи до цієї задачі:

  1. Скористатися монадою, яка дає змогу змінювати внутрішній стан генератора псевдовипадкових чисел. Є готова функція IO.rand, яка робить саме це.

  2. Скористатися чистими функціями, які приймають генератор як аргумент і повертають не лише отримане псевдовипадкове значення, а й оновлений генератор, «заряджений» на наступне число в послідовності.

У цій вправі використано другий підхід. Генератор передають кожній функції, яка має видавати псевдовипадкове значення, і від функції вимагається повернути як значення, так і оновлений генератор.

Зауважмо, що кожен конкретний генератор є детермінованим, тобто він завжди видає те саме значення. Щоб згенерувати наступне псевдовипадкове значення в послідовності, потрібно скористатися оновленим генератором.

Перевірка випадковості

У цій вправі випадковість перевіряють за допомогою критерію хі-квадрат на рівні значущості p < 0.0001.

Це означає, що якщо показник здібності згенеровано згідно з інструкціями, імовірність того, що правильна реалізація не пройде тест через випадковий збіг, менша за 0,01%.

Зауважмо, що згідно з інструкціями показник здібності - це сума трьох найбільших результатів із чотирьох кидків чесного d6 (шестигранного кубика).

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Lean Exercism

Час розпочати Персонаж D&D?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Lean, а також 100 вправ та справжнє наставництво від людей, і все це безкоштовно.

Глибоке занурення у Персонаж D&D!

Ми розглянемо, як генерувати (начебто) випадкові кидки кубиків. Дізнаємося про зерна, псевдовипадкові числа та кілька типових пасток. Нарешті, побачимо, чим тестування на основі властивостей добре підходить для перевірки функцій, що повертають випадкові значення.