Обсуждение:りゅうたま: natural fantasy R.P.G.

Материал из Ролевая энциклопедии
Перейти к: навигация, поиск

Таблица вероятностей

Таблица вероятностей получена таким кодом:

const размерыКостей = [4, 6, 8, 10, 12];
const целевыеЧисла = [4, 6, 8, 10, 12, 14, 16, 18, 20];

const вероятностьУспеха = (размер1, размер2, целевоеЧисло) => {
    let броски = 0;
    let успехи = 0;
    for (let знач1 = 1; знач1 <= размер1; знач1++) {
        for (let знач2 = 1; знач2 <= размер2; знач2++) {
            броски++;
            const критическийУспех = (знач1 === 6 && знач2 === 6) || (знач1 === размер1 && знач2 === размер2);
            if (знач1 + знач2 >= целевоеЧисло || критическийУспех) {
                успехи++;
            }
        }
    }
    return успехи / броски;
};

const вПроцентах = (число) => (Math.floor(число * 10000) / 100).toString().replace('.', ',') + '%'

const ссылкаНаТипКости = (размер) => размер === 20 ? '[[Кость d20|d20]]' : `[[d${размер}]]`

const рядВероятностей = (размер1, размер2, объединённыйСПредыдущими) => '| ' + [
    ...(объединённыйСПредыдущими ? [] : [
        ` rowspan="${размерыКостей.length}" | ${ссылкаНаТипКости(размер1)}`
    ]),
    ссылкаНаТипКости(размер2),
    ...целевыеЧисла.map((целевоеЧисло) => вПроцентах(вероятностьУспеха(размер1, размер2, целевоеЧисло)))
].join(' || ');

const рядыДляВторогоРазмера = (размер1) => размерыКостей.map((размер2, индекс) => рядВероятностей(размер1, размер2, индекс !== 0)).join("\n|-\n")

const содержаниеТаблички = размерыКостей.map(рядыДляВторогоРазмера).join("\n|-\n")
const заголовокТаблички1 = '!' + [
    'colspan="2" | Бросаемые кости',
    `colspan="${целевыеЧисла.length}" | Целевое число`,
].join(' !! ')
const заголовокТаблички2 = '!' + [
    'Первая',
    'Вторая',
    ...целевыеЧисла,
].join(' !! ')

const табличка = [
    '{| class="wikitable" style="margin:auto"',
    заголовокТаблички1,
    заголовокТаблички2,
    содержаниеТаблички + '\n|}',
].join("\n|-\n");

console.log(табличка)

Надеюсь, что в нём нет ошибок :D Demetrius (обсуждение) 12:41, 18 августа 2025 (MSK)