С Новым 2025 годом!
  • 1.206
  • 18
Вот и завершается этот год - местами странный, местами крутой, но точно запоминающийся, полный неожиданностей и ярких моментов. Мы благодарны вам за то, что вы были рядом, за все наши совместные...
Новости В Heroes of Might and Magic 3 теперь можно поиграть в веб-браузере
  • 583
  • 2
Совсем недавно энтузиасты из России смогли портировать игру HoMM3 в браузер. Причем веб-версия позволяет пройти все сюжетные компании и даже поиграть по сети. Чтобы сыграть в классику необходимо...
Новости Зал Славы российского геймдева - кто вошел в этом году?
  • 611
  • 7
Зал Славы - проект, который был создан в прошлом году для увековечивания достижений российских разработчиков, киберспортсменов, а также ключевых фигур российского геймдева. Инициатором проекта...
Новости Of Ash and Steel - Ответы на вопросы №4 от 20 декабря 2024 года
  • 485
  • 0
Ответы на вопросы №4 от 20 декабря 2024 года Приветствую вас, искатели приключений! Спасибо за все вопросы, которые вы оставили нам в Steam и Discord по игре Of Ash and Steel. Сегодня мы...

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

TopLayer

Наемник
Участник форума
Регистрация
22 Апр 2017
Сообщения
937
Реакции
394
Баллы
196
Лучшие ответы
26
#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.353
Реакции
5.841
Баллы
976
Лучшие ответы
415
#32
@TopLayer, благодарю! Интересная тема с "удачей".
 
Сверху Снизу