Новости Анонсирован Atomic Heart II
Новости Анонсирован ремастер Final Fantasy Tactics
  • 337
  • 1
Культовая пошаговая тактическая RPG от Square Enix получит второе дыхание. На проходящей выставке State of Play, где анонсируются игры для Play Station, состоялся анонс ремастера Final Fantasy...
Новости Моддеры Oblivion Remastered нашли способ внедрения абсолютно любых скриптов
  • 442
  • 4
Сообщество моддинга Oblivion Remastered (ORM) переживает настоящий расцвет. После долгих месяцев работы, энтузиасты научили игру работать с мощным скриптовым языком Lua, открыв перед создателями...
Новости Tainted Grail: The Fall of Avalon — Польская «Skyrim» теперь официально
  • 2.234
  • 32
23 мая 2025 после двух лет успешного раннего доступа в Steam польская студия Questline наконец представила свою фэнтези-RPG в полной версии. Tainted Grail: The Fall of Avalon доступна на ПК...

Гильдии 1.5 Предложение по азартным играм (в кости)

TopLayer

Наемник
Участник форума
Регистрация
22 Апр 2017
Сообщения
953
Реакции
407
Баллы
226
Лучшие ответы
27
#31
Быстрый текст 50 бросков @@n1kx 'ом показал, что рандомайзер винды, которым пользуется Готика, выдает 6 в 25%, а 3 в 8% случаев. От чего это зависит и повторяется ли в разное время суток и для разных версий ОС, непонятно.
Теперь попробуй бросать настоящий кубик - будешь нередко получать аналогичные результаты.
Hlp_Random(6) + 1 отлично подходит для имитации броска реальной игровой кости.
Я не смог придумать, как достаточно просто сделать разную частоту выпадения граней, кроме проверки четности при рандоме(100).
Могу такое предложить: сначала задаёшь вероятности выпадения граней через параметр "удача" (от 0 до 100), а потом запрашиваешь рандомное значение кубика.
C:
SetupDiceProb(10); // невезучий весьма
var int value1, value2;
value1 = GetDice();
value2 = GetDice();
C:
const int DICE_MAX_LUCK = 100; // должно делиться на 5

// распределение вероятностей выпадения между гранями
// нулевой индекс не используется
var int DiceProb[7];

// меняет DiceProb сдвигая одну единичку правее
func void IncreaseLuck()
{
    // пытаемся сдвинуть 1 так, чтобы вероятности были более равномерными
    if DiceProb[5] && DiceProb[5] > DiceProb[6] + 1 { DiceProb[5] -= 1; DiceProb[6] += 1; return; };
    if DiceProb[4] && DiceProb[4] > DiceProb[5] + 1 { DiceProb[4] -= 1; DiceProb[5] += 1; return; };
    if DiceProb[3] && DiceProb[3] > DiceProb[4] + 1 { DiceProb[3] -= 1; DiceProb[4] += 1; return; };
    if DiceProb[2] && DiceProb[2] > DiceProb[3] + 1 { DiceProb[2] -= 1; DiceProb[3] += 1; return; };
    if DiceProb[1] && DiceProb[1] > DiceProb[2] + 1 { DiceProb[1] -= 1; DiceProb[2] += 1; return; };
    
    // если не вышло, ищем наименее расбалансирующий сдвиг
    var int bestValue; bestValue = -100000;
    var int bestIndex; bestIndex = -1;
    
    if DiceProb[1] && DiceProb[1] - DiceProb[2] > bestValue { bestValue = DiceProb[1] - DiceProb[2]; bestIndex = 1; };
    if DiceProb[2] && DiceProb[2] - DiceProb[3] > bestValue { bestValue = DiceProb[2] - DiceProb[3]; bestIndex = 2; };
    if DiceProb[3] && DiceProb[3] - DiceProb[4] > bestValue { bestValue = DiceProb[3] - DiceProb[4]; bestIndex = 3; };
    if DiceProb[4] && DiceProb[4] - DiceProb[5] > bestValue { bestValue = DiceProb[4] - DiceProb[5]; bestIndex = 4; };
    if DiceProb[5] && DiceProb[5] - DiceProb[6] > bestValue { bestValue = DiceProb[5] - DiceProb[6]; bestIndex = 5; };
    
    if bestIndex == 1 { DiceProb[1] -= 1; DiceProb[2] += 1; }
    else if bestIndex == 2 { DiceProb[2] -= 1; DiceProb[3] += 1; }
    else if bestIndex == 3 { DiceProb[3] -= 1; DiceProb[4] += 1; }
    else if bestIndex == 4 { DiceProb[4] -= 1; DiceProb[5] += 1; }
    else if bestIndex == 5 { DiceProb[5] -= 1; DiceProb[6] += 1; };
};

// устанавиливаем шансы выпадения разных граней в зависимости от удачи
// 0 <= luck <= DICE_MAX_LUCK
func void SetupDiceProb(var int luck)
{
    DiceProb[1] = DICE_MAX_LUCK / 5;
    DiceProb[2] = 0;
    DiceProb[3] = 0;
    DiceProb[4] = 0;
    DiceProb[5] = 0;
    DiceProb[6] = 0;
    
    // DICE_MAX_LUCK возможных итераций
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
};

// бросок кубика с учётом относительных вероятностей DiceProb
func int GetDice()
{
    var int random;
    random = Hlp_Random(DiceProb[1] + DiceProb[2] + DiceProb[3] + DiceProb[4] + DiceProb[5] + DiceProb[6]);
    if random < DiceProb[1] { return 1; }; random -= DiceProb[1];
    if random < DiceProb[2] { return 2; }; random -= DiceProb[2];
    if random < DiceProb[3] { return 3; }; random -= DiceProb[3];
    if random < DiceProb[4] { return 4; }; random -= DiceProb[4];
    if random < DiceProb[5] { return 5; }; random -= DiceProb[5];
    return 6;
};
 

Alex1

Избранник богов
Команда форума
Модератор раздела
Редактор раздела
Модостроитель
 
Почётный пользователь
Участник форума
Регистрация
22 Янв 2014
Сообщения
11.514
Реакции
6.078
Баллы
976
Лучшие ответы
418
#32
@TopLayer, благодарю! Интересная тема с "удачей".
 
Сверху Снизу