Обсуждение:Город Тумана — различия между версиями
Demetrius (обсуждение | вклад) (Новая страница: «== Алгоритм, которым я подсчитал вероятности == Оставляю тут — чтобы было легче проверить…») |
Demetrius (обсуждение | вклад) м (Demetrius переименовал страницу Обсуждение:Город тумана в Обсуждение:Город Тумана: На сайте Студии 101 используется такая капитализация) |
||
(не показано 17 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
+ | {{создано}} | ||
== Алгоритм, которым я подсчитал вероятности == | == Алгоритм, которым я подсчитал вероятности == | ||
Строка 8: | Строка 9: | ||
const условияКолонок = [ | const условияКолонок = [ | ||
− | + | сумма => сумма <= 6, | |
− | + | сумма => (сумма >= 7) && (сумма <= 9), | |
− | + | сумма => сумма >= 10, | |
− | + | сумма => сумма >= 12 | |
] | ] | ||
Строка 19: | Строка 20: | ||
function значенияКолонок(прибавка) { | function значенияКолонок(прибавка) { | ||
− | + | return условияКолонок.map( | |
− | + | условие => { | |
− | + | const подходящих = суммы.map(бросок => бросок + прибавка).filter(условие).length | |
const всего = суммы.length | const всего = суммы.length | ||
return подходящих / всего | return подходящих / всего | ||
Строка 29: | Строка 30: | ||
function вероятностьКакПроценты(вероятность) { | function вероятностьКакПроценты(вероятность) { | ||
− | + | return (Math.round(вероятность * 10000) / 100) + '%' | |
} | } | ||
function отформатироватьСтрокуТаблицы(прибавка) { | function отформатироватьСтрокуТаблицы(прибавка) { | ||
− | + | const ячейкиТаблицы = [ | |
− | + | (прибавка >= 0 ? '+' : '') + прибавка, | |
...значенияКолонок(прибавка).map(вероятностьКакПроценты) | ...значенияКолонок(прибавка).map(вероятностьКакПроценты) | ||
− | + | ] | |
− | + | return `| ` + ячейкиТаблицы.join(' || ') | |
} | } | ||
function отформатироватьТаблицу() { | function отформатироватьТаблицу() { | ||
− | + | return [ | |
` | ` | ||
{| class="wikitable" style="margin:auto" | {| class="wikitable" style="margin:auto" | ||
! Прибавка !! Неудача<br>(<6) !! Частичный успех<br>(7—9) !! Полный успех<br>(>10) !! «Динамит» (>12)`, | ! Прибавка !! Неудача<br>(<6) !! Частичный успех<br>(7—9) !! Полный успех<br>(>10) !! «Динамит» (>12)`, | ||
− | + | ...прибавки.map(отформатироватьСтрокуТаблицы) | |
].join("\n|-\n") + '\n|}' | ].join("\n|-\n") + '\n|}' | ||
} | } | ||
Строка 51: | Строка 52: | ||
console.log(отформатироватьТаблицу()) | console.log(отформатироватьТаблицу()) | ||
</pre> | </pre> | ||
+ | : Тема! А может, переделать это на Lua и сделать шаблоном, который легко включить в любые статьи? [[Участник:EvilCat|EvilCat]] ([[Обсуждение участника:EvilCat|обсуждение]]) 09:52, 6 февраля 2024 (MSK) | ||
+ | :: Спасибо! Мне нравится эта идея. Но сделать one-off код куда проще, чем сделать переиспользуемый модуль. Надо подумать, как это всё может выглядеть... [[Участник:Demetrius|Demetrius]] ([[Обсуждение участника:Demetrius|обсуждение]]) 16:44, 6 февраля 2024 (MSK) | ||
+ | |||
+ | Я пока что представляю себе примерно такой DSL, который можно было бы скармливать Lua: | ||
+ | <pre> | ||
+ | -- Year Zero Engine: вариант с пулом костей | ||
+ | Столбец КоличествоКостей "Количество костей" | ||
+ | Столбец "Шанс успеха" | ||
+ | Столбец "Шанс успеха при переброске", вероятность: больший((КоличествоКостей * 2) раз d6) = 6 | ||
+ | |||
+ | -- Year Zero Engine: вариант с атрибутами | ||
+ | Столбец Атрибут "Бросаемые кости/Атрибут", список: d6, d8, d10, d12 | ||
+ | Столбец Умение "Бросаемые кости/Умение", список: 0, d6, d8, d10, d12 | ||
+ | Столбец "Шанс успеха", вероятность: Атрибут ≥ 6 или Умение ≥ 6 | ||
+ | Столбел "Шанс успеха при переброске", вероятность: больший(2 раза Атрибут) ≥ 6 или больший(2 раза Умение) ≥ 6 | ||
+ | |||
+ | -- City of Mist | ||
+ | Столбец Прибавка, список: -5, -4, -3, -2, -1, 0, +1, +2, +3, +4, +5, +6, +7 | ||
+ | Столбец "Неудача<br>(≤6)", вероятность: 2d6 + Прибавка ≤ 6 | ||
+ | -- условие для одного и того же броска; возможно, проще сделать 7 ≤ 2d6 + прибавка ≤ 9 | ||
+ | Столбец "Частичный успех<br>(7—9)", вероятность: [результат = 2d6 + Прибавка] результат ≥ 7 и результат ≤ 9 | ||
+ | Столбец "Полный успех<br>(≥10)", вероятность: 2d6 + Прибавка ≥ 10 | ||
+ | Столбец "«Динамит»<br>(≥12)", вероятность: 2d6 + Прибавка ≥ 12 | ||
+ | </pre> | ||
+ | |||
+ | Но это, кажется, чересчур амбициозно и сложно. Надо подумать, что можно упростить. [[Участник:Demetrius|Demetrius]] ([[Обсуждение участника:Demetrius|обсуждение]]) 16:44, 6 февраля 2024 (MSK) | ||
+ | : Да, звучит как что-то чем только ты и я сможем пользоваться, а мне и JavaScript вполне удобен. | ||
+ | : Я думала о чём-то вроде модуль «Генератор таблиц вероятностей», параметра у которого были бы «тип броска» (2d6-2) и «условие успеха» (5+). Но, возможно, в этом и есть главная сложность — можно ли описать подобные проверки какой-то простой системой параметров? Или хотя бы вынести в слой абстракции, который человек с опытом Lua 1 месяц сможет напиать (функции «бросок» и «условие успеха»). Ладно, буду думать. [[Участник:EvilCat|EvilCat]] ([[Обсуждение участника:EvilCat|обсуждение]]) 17:12, 6 февраля 2024 (MSK) | ||
+ | :: А я сделал прототип на Lua! Вот: https://paste.mozilla.org/5c6PANo0/raw (запускать в консоли — или, например, тут: https://onecompiler.com/lua/423pauc7x ) Парсер DSL'а ещё не сделал (входные данные задаю как массивы Lua), но я думаю взять формат типа Лиспа, для которого парсер пишется тривиально. (По сути я хочу формат примерно как выше, но с изобилием скобок, как в Лиспе — чтобы не мучиться с приоритетом операторов и т.п.). | ||
+ | :: Эта версия не расставляет <code>rowspan</code>/<code>colspan</code> и в ней нет части нужных функций, но как прототип по-моему неплохо получилось. [[Участник:Demetrius|Demetrius]] ([[Обсуждение участника:Demetrius|обсуждение]]) 23:17, 6 февраля 2024 (MSK) | ||
+ | :: Ещё мысли. Кажется, в Scribunto используется Lua 5.1? Вроде в ней аналог eval'а — <code>loadstring</code>, и вроде он не позволяет получить аргументы (и их надо передавать через глобальные переменные?). Звучит как-то некруто, не знаю (хотя в принципе можно и в глобальных... не знаю.) Если останоситься на написании условий на Lua, и не хочется глобальных переменных, то тогда логику условий придётся описывать в модулях отдельно от игры. ИМХО это чуть менее наглядно. (Мой DSL, конечно, труднее понять, чем Lua [особенно когда я его упростил до лиспоида] — но он будет прямо в коде статьи.) | ||
+ | :: Впрочем, думаю, в любом случае вряд ли в ближайшее время этим будет заниматься кто-то кроме нас. Так что можно на JS писать и вставлять уже сгенерированное. [[Участник:Demetrius|Demetrius]] ([[Обсуждение участника:Demetrius|обсуждение]]) 02:38, 7 февраля 2024 (MSK) | ||
+ | ::: Вот [https://ru.wikifur.com/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%93%D0%B5%D0%BD%D0%B5%D0%B0%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F пример подобного сложного модуля] из другой вики — если открыть для правки, там будет удобный редактор. Можно посмотреть на шаблон, который его использует, и на страницы, которые его используют. [[Участник:EvilCat|EvilCat]] ([[Обсуждение участника:EvilCat|обсуждение]]) 09:02, 7 февраля 2024 (MSK) | ||
+ | :::: Я верю, что на десктопе он удобный (сейчас с телефона, в нём этот редактор неюзабелен), но мне кажется менее удобным, что описание таблицы будет сильно далеко от текста статьи. Хотя, наверное, это не принципиально, можно и таким пользоваться. [[Участник:Demetrius|Demetrius]] ([[Обсуждение участника:Demetrius|обсуждение]]) 10:47, 7 февраля 2024 (MSK) | ||
+ | ::::: Я надеялась, ты доберёшься до [https://ru.wikifur.com/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%93%D0%B5%D0%BD%D0%B5%D0%B0%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%C2%AB%D0%9A%D0%BE%D1%80%D0%BE%D0%BB%D1%8F_%D0%9B%D1%8C%D0%B2%D0%B0%C2%BB подобных шаблонов] и посмотришь, как там устроено задание параметров, которым случалось пользоваться с другим людям кроме автора %) [[Участник:EvilCat|EvilCat]] ([[Обсуждение участника:EvilCat|обсуждение]]) 11:06, 7 февраля 2024 (MSK) | ||
+ | :::::: Ну на первый взгляд выглядит, что там что-то типа моего DSL'а, с такими отличиями: | ||
+ | ::::::* (а) у меня новые строки, в этом шаблоне разные аргументы шаблона (мне мой вариант нраваится больше, но не принципиально) | ||
+ | ::::::* (б) есть вспомогательные шаблоны, которые генерируют отдельные строки для (у нас такое тоже можно сделать, хотя ИМХО это не принципиально). | ||
+ | :::::: Вынесу в отдельную подветку, а то у нас что-то много вложенности уже. [[Участник:Demetrius|Demetrius]] ([[Обсуждение участника:Demetrius|обсуждение]]) 15:55, 7 февраля 2024 (MSK) | ||
+ | |||
+ | === Сравнение моего прототипа с модулем Генеалогии === | ||
+ | |||
+ | Общий принцип же такой же: на вход шаблону Генеалогия поступает текст типа такого (только вместо новых строк — |, каждая строка — отдельный аргумент): | ||
+ | |||
+ | <pre> | ||
+ | child, Симба , Нала , Копа ,border-color: crimson | ||
+ | child, Симба , Нала , Киара , | ||
+ | child, Симба , Нала , Кайон , | ||
+ | </pre> | ||
+ | |||
+ | Просто пользователь не пишет данные в этом формате, а добавляет их через шаблоны типа Генеалогия/Персонаж, Генеалогия/Союз, Генеалогия/Потомок. | ||
+ | |||
+ | Это не так уж и отличается от моего | ||
+ | <pre> | ||
+ | (столбец Атрибут список d6 d8 d10 d12) | ||
+ | (столбец Умение список (0 —) d6 d8 d10 d12) | ||
+ | (столбец "Вероятность без переброски" вероятность (- 1 (* (< Атрибут 6) (< Умение 6)))) | ||
+ | </pre> | ||
+ | |||
+ | Я взял S-выражения, потому что я хотел иметь произвольную математическую нотацию с возможностью добавлять новые функции. <code>loadstring</code> (аналог <code>eval</code>'а в Lua 5.1) я не брал потому, что передача данных через глобальные переменные или переменные окружения звучит... плохо. А парсер S-выражений написать довольно тривиально.) | ||
+ | |||
+ | Кстати, доп. шаблоны можно использовать, чтобы распарсить математическую нотацию. Типа, чтобы писать <code><nowiki>{{Вероятность/Столбец|Вероятность без переброски|1 - (Атрибут < 6)*(Умение < 6)}}</nowiki></code>, и Шаблон:Вероятность/Столбец превращал формулу в S-выражения для основного шаблона. [[Участник:Demetrius|Demetrius]] ([[Обсуждение участника:Demetrius|обсуждение]]) 15:55, 7 февраля 2024 (MSK) | ||
+ | |||
+ | '''Добавлено:''' возможно, для ясности стоит в математической нотации писать не <code>Атрибут < 6</code>, а <code>P(Атрибут < 6)</code>. Чтобы было ясно, что мы вероятность берём и дальше её умножает/отнимаем/etc. [[Участник:Demetrius|Demetrius]] ([[Обсуждение участника:Demetrius|обсуждение]]) 16:03, 7 февраля 2024 (MSK) |
Текущая версия на 00:15, 26 апреля 2024
Алгоритм, которым я подсчитал вероятности[править]
Оставляю тут — чтобы было легче проверить, что я не совершил ошибок, и адаптировать для построения подобных табличек в других статьях. Demetrius (обсуждение) 21:41, 5 февраля 2024 (MSK)
const броскиОднойКости = [1, 2, 3, 4, 5, 6] const суммы = броскиОднойКости.map(первая => броскиОднойКости.map(вторая => первая + вторая)).flat() const условияКолонок = [ сумма => сумма <= 6, сумма => (сумма >= 7) && (сумма <= 9), сумма => сумма >= 10, сумма => сумма >= 12 ] const прибавки = [] for (i = -5; i <= 7; i++) прибавки.push(i) function значенияКолонок(прибавка) { return условияКолонок.map( условие => { const подходящих = суммы.map(бросок => бросок + прибавка).filter(условие).length const всего = суммы.length return подходящих / всего } ) } function вероятностьКакПроценты(вероятность) { return (Math.round(вероятность * 10000) / 100) + '%' } function отформатироватьСтрокуТаблицы(прибавка) { const ячейкиТаблицы = [ (прибавка >= 0 ? '+' : '') + прибавка, ...значенияКолонок(прибавка).map(вероятностьКакПроценты) ] return `| ` + ячейкиТаблицы.join(' || ') } function отформатироватьТаблицу() { return [ ` {| class="wikitable" style="margin:auto" ! Прибавка !! Неудача<br>(<6) !! Частичный успех<br>(7—9) !! Полный успех<br>(>10) !! «Динамит» (>12)`, ...прибавки.map(отформатироватьСтрокуТаблицы) ].join("\n|-\n") + '\n|}' } console.log(отформатироватьТаблицу())
- Тема! А может, переделать это на Lua и сделать шаблоном, который легко включить в любые статьи? EvilCat (обсуждение) 09:52, 6 февраля 2024 (MSK)
- Спасибо! Мне нравится эта идея. Но сделать one-off код куда проще, чем сделать переиспользуемый модуль. Надо подумать, как это всё может выглядеть... Demetrius (обсуждение) 16:44, 6 февраля 2024 (MSK)
Я пока что представляю себе примерно такой DSL, который можно было бы скармливать Lua:
-- Year Zero Engine: вариант с пулом костей Столбец КоличествоКостей "Количество костей" Столбец "Шанс успеха" Столбец "Шанс успеха при переброске", вероятность: больший((КоличествоКостей * 2) раз d6) = 6 -- Year Zero Engine: вариант с атрибутами Столбец Атрибут "Бросаемые кости/Атрибут", список: d6, d8, d10, d12 Столбец Умение "Бросаемые кости/Умение", список: 0, d6, d8, d10, d12 Столбец "Шанс успеха", вероятность: Атрибут ≥ 6 или Умение ≥ 6 Столбел "Шанс успеха при переброске", вероятность: больший(2 раза Атрибут) ≥ 6 или больший(2 раза Умение) ≥ 6 -- City of Mist Столбец Прибавка, список: -5, -4, -3, -2, -1, 0, +1, +2, +3, +4, +5, +6, +7 Столбец "Неудача<br>(≤6)", вероятность: 2d6 + Прибавка ≤ 6 -- условие для одного и того же броска; возможно, проще сделать 7 ≤ 2d6 + прибавка ≤ 9 Столбец "Частичный успех<br>(7—9)", вероятность: [результат = 2d6 + Прибавка] результат ≥ 7 и результат ≤ 9 Столбец "Полный успех<br>(≥10)", вероятность: 2d6 + Прибавка ≥ 10 Столбец "«Динамит»<br>(≥12)", вероятность: 2d6 + Прибавка ≥ 12
Но это, кажется, чересчур амбициозно и сложно. Надо подумать, что можно упростить. Demetrius (обсуждение) 16:44, 6 февраля 2024 (MSK)
- Да, звучит как что-то чем только ты и я сможем пользоваться, а мне и JavaScript вполне удобен.
- Я думала о чём-то вроде модуль «Генератор таблиц вероятностей», параметра у которого были бы «тип броска» (2d6-2) и «условие успеха» (5+). Но, возможно, в этом и есть главная сложность — можно ли описать подобные проверки какой-то простой системой параметров? Или хотя бы вынести в слой абстракции, который человек с опытом Lua 1 месяц сможет напиать (функции «бросок» и «условие успеха»). Ладно, буду думать. EvilCat (обсуждение) 17:12, 6 февраля 2024 (MSK)
- А я сделал прототип на Lua! Вот: https://paste.mozilla.org/5c6PANo0/raw (запускать в консоли — или, например, тут: https://onecompiler.com/lua/423pauc7x ) Парсер DSL'а ещё не сделал (входные данные задаю как массивы Lua), но я думаю взять формат типа Лиспа, для которого парсер пишется тривиально. (По сути я хочу формат примерно как выше, но с изобилием скобок, как в Лиспе — чтобы не мучиться с приоритетом операторов и т.п.).
- Эта версия не расставляет
rowspan
/colspan
и в ней нет части нужных функций, но как прототип по-моему неплохо получилось. Demetrius (обсуждение) 23:17, 6 февраля 2024 (MSK) - Ещё мысли. Кажется, в Scribunto используется Lua 5.1? Вроде в ней аналог eval'а —
loadstring
, и вроде он не позволяет получить аргументы (и их надо передавать через глобальные переменные?). Звучит как-то некруто, не знаю (хотя в принципе можно и в глобальных... не знаю.) Если останоситься на написании условий на Lua, и не хочется глобальных переменных, то тогда логику условий придётся описывать в модулях отдельно от игры. ИМХО это чуть менее наглядно. (Мой DSL, конечно, труднее понять, чем Lua [особенно когда я его упростил до лиспоида] — но он будет прямо в коде статьи.) - Впрочем, думаю, в любом случае вряд ли в ближайшее время этим будет заниматься кто-то кроме нас. Так что можно на JS писать и вставлять уже сгенерированное. Demetrius (обсуждение) 02:38, 7 февраля 2024 (MSK)
- Вот пример подобного сложного модуля из другой вики — если открыть для правки, там будет удобный редактор. Можно посмотреть на шаблон, который его использует, и на страницы, которые его используют. EvilCat (обсуждение) 09:02, 7 февраля 2024 (MSK)
- Я верю, что на десктопе он удобный (сейчас с телефона, в нём этот редактор неюзабелен), но мне кажется менее удобным, что описание таблицы будет сильно далеко от текста статьи. Хотя, наверное, это не принципиально, можно и таким пользоваться. Demetrius (обсуждение) 10:47, 7 февраля 2024 (MSK)
- Я надеялась, ты доберёшься до подобных шаблонов и посмотришь, как там устроено задание параметров, которым случалось пользоваться с другим людям кроме автора %) EvilCat (обсуждение) 11:06, 7 февраля 2024 (MSK)
- Ну на первый взгляд выглядит, что там что-то типа моего DSL'а, с такими отличиями:
- (а) у меня новые строки, в этом шаблоне разные аргументы шаблона (мне мой вариант нраваится больше, но не принципиально)
- (б) есть вспомогательные шаблоны, которые генерируют отдельные строки для (у нас такое тоже можно сделать, хотя ИМХО это не принципиально).
- Вынесу в отдельную подветку, а то у нас что-то много вложенности уже. Demetrius (обсуждение) 15:55, 7 февраля 2024 (MSK)
- Ну на первый взгляд выглядит, что там что-то типа моего DSL'а, с такими отличиями:
- Я надеялась, ты доберёшься до подобных шаблонов и посмотришь, как там устроено задание параметров, которым случалось пользоваться с другим людям кроме автора %) EvilCat (обсуждение) 11:06, 7 февраля 2024 (MSK)
- Я верю, что на десктопе он удобный (сейчас с телефона, в нём этот редактор неюзабелен), но мне кажется менее удобным, что описание таблицы будет сильно далеко от текста статьи. Хотя, наверное, это не принципиально, можно и таким пользоваться. Demetrius (обсуждение) 10:47, 7 февраля 2024 (MSK)
- Вот пример подобного сложного модуля из другой вики — если открыть для правки, там будет удобный редактор. Можно посмотреть на шаблон, который его использует, и на страницы, которые его используют. EvilCat (обсуждение) 09:02, 7 февраля 2024 (MSK)
Сравнение моего прототипа с модулем Генеалогии[править]
Общий принцип же такой же: на вход шаблону Генеалогия поступает текст типа такого (только вместо новых строк — |, каждая строка — отдельный аргумент):
child, Симба , Нала , Копа ,border-color: crimson child, Симба , Нала , Киара , child, Симба , Нала , Кайон ,
Просто пользователь не пишет данные в этом формате, а добавляет их через шаблоны типа Генеалогия/Персонаж, Генеалогия/Союз, Генеалогия/Потомок.
Это не так уж и отличается от моего
(столбец Атрибут список d6 d8 d10 d12) (столбец Умение список (0 —) d6 d8 d10 d12) (столбец "Вероятность без переброски" вероятность (- 1 (* (< Атрибут 6) (< Умение 6))))
Я взял S-выражения, потому что я хотел иметь произвольную математическую нотацию с возможностью добавлять новые функции. loadstring
(аналог eval
'а в Lua 5.1) я не брал потому, что передача данных через глобальные переменные или переменные окружения звучит... плохо. А парсер S-выражений написать довольно тривиально.)
Кстати, доп. шаблоны можно использовать, чтобы распарсить математическую нотацию. Типа, чтобы писать {{Вероятность/Столбец|Вероятность без переброски|1 - (Атрибут < 6)*(Умение < 6)}}
, и Шаблон:Вероятность/Столбец превращал формулу в S-выражения для основного шаблона. Demetrius (обсуждение) 15:55, 7 февраля 2024 (MSK)
Добавлено: возможно, для ясности стоит в математической нотации писать не Атрибут < 6
, а P(Атрибут < 6)
. Чтобы было ясно, что мы вероятность берём и дальше её умножает/отнимаем/etc. Demetrius (обсуждение) 16:03, 7 февраля 2024 (MSK)