Новости Большое интервью с HotA Crew - часть 2
  • 1.089
  • 0
HotA Crew о Кронверке и будущих обновлениях (часть 2) Какие герои будут вести армии Кронверка? Герои-воины зовутся Вожди, маги — Старейшины. Их параметры и способности подчеркнут сильные стороны...
Новости Большое интервью с HotA Crew - часть 1
  • 914
  • 0
HotA Crew о Кронверке и будущих обновлениях Важно: весь контент по Кронверку и системе событий находится в разработке, и может ещё поменяться. Итак, следующим городом будет Кронверк. Почему...
С Новым 2025 годом!
  • 2.585
  • 18
Вот и завершается этот год - местами странный, местами крутой, но точно запоминающийся, полный неожиданностей и ярких моментов. Мы благодарны вам за то, что вы были рядом, за все наши совместные...
Новости В Heroes of Might and Magic 3 теперь можно поиграть в веб-браузере
  • 1.365
  • 3
Совсем недавно энтузиасты из России смогли портировать игру HoMM3 в браузер. Причем веб-версия позволяет пройти все сюжетные компании и даже поиграть по сети. Чтобы сыграть в классику необходимо...

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

TopLayer

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