На этой странице
Видеопокер (зашифрованная версия)
На этой странице
Введение
На этой странице описывается метод игры в видеопокер с использованием криптографии, гарантирующей предопределенность раздаваемых карт. Если вы не знакомы с основными правилами видеопокера, пожалуйста, посетите мою основную страницу, посвященную видеопокеру .
Для целей этой страницы я пока рассматриваю Cypto.Games. У них есть три версии видеопокера, а именно:
- Валеты или лучше
- Десять или лучше
- Бонусный покер
Игрок должен сделать ставку в 10 кредитов, хотя он может выбрать, сколько именно в криптовалюте он готов поставить. На мой взгляд, шаг с десятью кредитами излишне запутывает ситуацию.
Казино, где доказуемая честность
Анализ
В следующей таблице представлен мой анализ таблицы выплат в игре Jacks or Better с 6-9-20-75-500. В нижней правой ячейке показана доходность в 97,97%, что соответствует преимуществу казино в 2,03%.
Анализ Jacks or Better
| Событие | Платит | Комбинации | Вероятность | Возвращаться |
|---|---|---|---|---|
| Флеш-рояль | 500 | 34,706,466 | 0.000021 | 0.010447 |
| Прямой смыв | 75 | 184,178,161 | 0.000111 | 0.008316 |
| Четыре одинаковых | 20 | 3 924 486 891 | 0.002363 | 0.047252 |
| Аншлаг | 9 | 19,115,939,799 | 0.011508 | 0.103572 |
| Румянец | 6 | 19 427 500 088 | 0.011696 | 0.070173 |
| Прямой | 4 | 18,354,238,557 | 0.011049 | 0.044198 |
| Тройка | 3 | 123,573,760,275 | 0.074393 | 0.223178 |
| Две пары | 2 | 214,462,314,819 | 0.129108 | 0.258217 |
| Джеки или лучше | 1 | 356,047,418,052 | 0.214344 | 0.214344 |
| Все остальные | 0 | 905,977,999,992 | 0.545408 | 0.000000 |
| Итоговые суммы | 1,661,102,543,100 | 1.000000 | 0.979696 |
В следующей таблице представлен мой анализ таблицы выплат 5-6-22-75-500 Tens or Better. В нижней правой ячейке показана доходность в 97,97%, что соответствует преимуществу казино в 2,03%.
Анализ «Десятки или лучше»
| Событие | Платит | Комбинации | Вероятность | Возвращаться |
|---|---|---|---|---|
| Флеш-рояль | 500 | 38,106,048 | 0.000023 | 0.011470 |
| Прямой смыв | 75 | 187,838,625 | 0.000113 | 0.008481 |
| Четыре одинаковых | 22 | 3 915 577 076 | 0.002357 | 0.051859 |
| Аншлаг | 6 | 19,084,542,744 | 0.011489 | 0.068934 |
| Румянец | 5 | 18 600 477 537 | 0.011198 | 0.055988 |
| Прямой | 4 | 20,611,548,487 | 0.012408 | 0.049633 |
| Тройка | 3 | 123,201,590,075 | 0.074169 | 0.222506 |
| Две пары | 2 | 213,933,852,009 | 0.128790 | 0.257581 |
| Десять или лучше | 1 | 420,598,763,532 | 0.253205 | 0.253205 |
| Все остальные | 0 | 840,930,246,967 | 0.506248 | 0.000000 |
| Итоговые суммы | 1,661,102,543,100 | 1.000000 | 0.979657 |
В следующей таблице представлен мой анализ таблицы выплат в бонусном покере 5-8-25-35-75-45-500. В нижней правой ячейке показана доходность в 97,94%, что соответствует преимуществу казино в 2,06%.
Анализ «Десятки или лучше»
| Событие | Платит | Комбинации | Вероятность | Возвращаться |
|---|---|---|---|---|
| Флеш-рояль | 500 | 35,737,262 | 0.000022 | 0.010757 |
| Прямой смыв | 45 | 172,191,438 | 0.000104 | 0.004665 |
| Четыре туза | 70 | 325,566,459 | 0.000196 | 0.013720 |
| Четыре двойки, тридцатки, четыре четверки | 35 | 875,937,305 | 0.000527 | 0.018456 |
| Четыре пятерки, четыре буквы К | 25 | 2 725 708 639 | 0.001641 | 0.041023 |
| Аншлаг | 8 | 19,133,720,127 | 0.011519 | 0.092149 |
| Румянец | 5 | 18,714,893,725 | 0.011267 | 0.056333 |
| Прямой | 4 | 18,432,640,328 | 0.011097 | 0.044387 |
| Тройка | 3 | 123,733,729,692 | 0.074489 | 0.223467 |
| Две пары | 2 | 214,762,339,278 | 0.129289 | 0.258578 |
| Джеки или лучше | 1 | 358,572,571,638 | 0.215864 | 0.215864 |
| Все остальные | 0 | 903,617,507,209 | 0.543987 | 0.000000 |
| Итоговые суммы | 1,661,102,543,100 | 1.000000 | 0.979398 |
Честная игра
Эта версия видеопокера, похоже, используется исключительно в криптовалютных интернет-казино. Вкратце, игра генерирует десять уникальных случайных чисел от 0 до 51, каждое с вероятностью 1/52, и сопоставляет их с десятью картами в колоде. Первые пять определяют карты, которые игрок получит при раздаче, а вторые пять — карты, которые игрок получит по порядку при доборе. Например, если игрок сбрасывает две карты, то при доборе он получит 6-ю и 7-ю карты из списка. Позиция сброшенных карт не имеет значения.
Приведённое ниже объяснение использования криптографии предполагает, что читатель уже знаком с этим понятием. Основные сведения можно найти на моей странице о кубиках (зашифрованная версия) . Для более продвинутых читателей ниже описан процесс выбора десяти случайных карт в игре.
- Определите указатель с именем "position" и присвойте ему значение 0.
- Присоединяйтесь к серверу и клиенту, а затем к серверу, именно в таком порядке.
- Сгенерируйте хеш SHA-512 для строки из шага 2.
- Преобразуйте первые два символа, начиная с «позиции» хеша из шага 3, из шестнадцатеричного формата в десятичный.
- Возьмите две цифры с терминала, начиная с цифры 4.
- Если результат шага 5 равен 51 или меньше и еще не найден, то это будет одна из первых десяти карт.
- Увеличьте "позицию" на 2.
- Повторяйте шаги с 4 по 7, пока не найдете десять уникальных карт.
- При раздаче будут розданы первые пять найденных карт, слева направо.
- Вторые пять карт будут находиться в очереди на раздачу при взятии карты. Например, если игрок берет три карты, то он получит 6-ю, 7-ю и 8-ю карты из очереди.
- Чтобы преобразовать позицию карты из шага 6 в фактическую карту, выполните следующие действия:
- А. Разделите результат из шага 4 на 13 и возьмите остаток.
- B. Сопоставьте результат шага 11A, чтобы получить ранг, следующим образом: от 0 до A, от 1 до 2, от 2 до 3, ..., от 9 до 10, от 10 до J, от 11 до Q, от 12 до K.
- C. Разделите результат из шага 4 на 13 и отбросьте остаток.
- D. Сопоставьте результат шага 11C, чтобы получить масть следующим образом: 0 — пики, 1 — червы, 2 — бубны, 3 — трефы.
В следующей таблице показано преобразование чисел в игральные карты.
Таблица перевода карт
| Классифицировать | Пики | Сердца | Бриллианты | Клубы |
|---|---|---|---|---|
| А | 0 | 13 | 26 | 39 |
| 2 | 1 | 14 | 27 | 40 |
| 3 | 2 | 15 | 28 | 41 |
| 4 | 3 | 16 | 29 | 42 |
| 5 | 4 | 17 | 30 | 43 |
| 6 | 5 | 18 | 31 | 44 |
| 7 | 6 | 19 | 32 | 45 |
| 8 | 7 | 20 | 33 | 46 |
| 9 | 8 | 21 | 34 | 47 |
| 10 | 9 | 22 | 35 | 48 |
| Дж. | 10 | 23 | 36 | 49 |
| В | 11 | 24 | 37 | 50 |
| К | 12 | 25 | 38 | 51 |
Тут прямо-таки напрашивается пример, не правда ли? Давайте рассмотрим один.
На экране «Вероятно, справедливо» выше я хочу выполнить две важные задачи: выбрать СВОЙ собственный (в отличие от стандартного) начальный ключ клиента (bc7v9bn70d7n07sn) и записать хеш следующего начального ключа сервера (64e701539ecf4c03b90ecd957d6675b2f72c3fd84f04dc5eb63eed8b9a58b95b), который находится в строке с заголовком «Следующий начальный ключ сервера SHA256».
На скриншоте выше у меня валет/туз разной масти, на первой и четвертой позициях.
На скриншоте выше я улучшаю свою комбинацию до пары валетов при розыгрыше.
На скриншоте выше я вернулся к разделу «Честная игра», чтобы отметить, как казино использует два сиденья для получения реальных карт, которые вы видите в игре.
На экране выше показана информация, необходимая мне для определения того, какие карты следовало раздать. Давайте рассмотрим всё пошагово:
- Инструкции расплывчаты, но предполагается, что нужно объединить начальные данные сервера и начальные данные клиента именно в таком порядке. В результате вы получите 2XMpPAbEw3qdH3HQla2K5zNwoNEFHOEYolkB969jbc7v9bn70d7n07sn.
- Далее, возьмите хеш результата шага 1. Это даст вам 3a959bbaffd9b3928b28431c2ee688792c67a45f1933b9e11af3c7784a7bbda5674d2e768ac330a04982b9fa943c4c2cf49c952d9db956b1cd3b38c006c3a2d6. Обратите внимание, что каждый символ — это цифра от 0 до 9 или буква от A до F. В шестнадцатеричной системе счисления это очень большое число.
- Возьмите первые два символа в хеш-таблице (3a) и преобразуйте их из шестнадцатеричного формата в десятичный: 3*16 1 + a*16 0 = 48 + 10 = 58.
- Возьмите последние две цифры из шага 3 (там всего две цифры), это по-прежнему 58.
- Если результат шага 4 равен 0–51, сопоставьте его с картой. Поскольку 58 > 51, переходим к следующим двум цифрам в хеш-таблице.
- Следующие две цифры в хеше — 95. Это соответствует 9*16 1 + 5*16 0 = 144 + 5 = 149 в десятичной системе счисления.
- Две последние цифры числа 149 — это 49, которое находится в диапазоне от 0 до 51, поэтому сопоставьте его с картой. Точнее, 49 соответствует валету треф. Это будет первая карта, сданная слева.
- Возьмите следующие две цифры в хеш-таблице (9b) и преобразуйте их из шестнадцатеричной системы в десятичную: 9*16 1 + b*16 0 = 144 + 11 = 155.
- Возьмите две последние цифры последнего шага, которые равны 55.
- Числа 55 не входят в диапазон от 0 до 51, поэтому пропустите эти две цифры в хеше.
- Возьмите следующие две цифры хеша (ba) и преобразуйте их из шестнадцатеричной системы в десятичную: b*16 1 + a*16 0 = 11*16 + 10*1 = 176 + 10 = 186.
- Возьмите две последние цифры последнего шага, которые равны 86.
- Числа 86 не входят в диапазон от 0 до 51, поэтому пропустите эти две цифры в хеше.
- Возьмите следующие две цифры в хеш-таблице (ff) и преобразуйте их из шестнадцатеричного формата в десятичный: f*16 1 + f*16 0 = 15*16 + 15*1 = 240 + 15 = 255.
- Возьмите две последние цифры последнего шага, которые равны 55.
- Числа 55 не входят в диапазон от 0 до 51, поэтому пропустите эти две цифры в хеше.
- Возьмите следующие две цифры в хеш-таблице (d9) и преобразуйте их из шестнадцатеричной системы в десятичную: d*16 1 + 9*16 0 = 13*16 + 9*1 = 208 + 9 = 217.
- Возьмите две последние цифры последнего шага, которые равны 17.
- Число 17 находится в диапазоне от 0 до 51, поэтому сопоставьте его с картой. А именно, 17 соответствует пятерке червей. Это будет вторая карта, сданная слева.
- Возьмите следующие две цифры в хеш-таблице (b3) и преобразуйте их из шестнадцатеричной системы в десятичную: 11*16 1 + 3*16 0 = 13*16 + 9*1 = 176 + 3 = 179.
- Возьмите две последние цифры последнего шага, которые равны 79.
- Числа 79 не входят в диапазон от 0 до 51, поэтому пропустите эти две цифры в хеше.
- Возьмите следующие две цифры в хеше (92) и преобразуйте их из шестнадцатеричной системы в десятичную: 9*16 1 + 2*16 0 = 9*16 + 2*1 = 208 + 9 = 146.
- Возьмите две последние цифры последнего шага, которые равны 46.
- Число 46 находится в диапазоне от 0 до 51, поэтому сопоставьте его с картой. Конкретнее, 46 соответствует восьмерке треф. Это будет третья карта, сданная слева.
- Возьмите следующие две цифры в хеш-таблице (8b) и преобразуйте их из шестнадцатеричного формата в десятичный: 8*16 1 + 11*16 0 = 9*16 + 2*1 = 128 + 11 = 139.
- Возьмите две последние цифры последнего шага, которые равны 39.
- Число 39 находится в диапазоне от 0 до 51, поэтому сопоставьте его с картой. А именно, 39 соответствует тузу треф. Это будет четвертая карта, сданная слева.
- Возьмите следующие две цифры в хеш-таблице (28) и преобразуйте их из шестнадцатеричного в десятичное число: 2*16 1 + 8*16 0 = 2*16 + 8*1 = 32 + 8 = 40.
- Число 40 находится в диапазоне от 0 до 51, поэтому сопоставьте его с картой. Конкретнее, 40 соответствует двойке треф. Это будет последняя карта в раздаче, справа.
- Я сбросил три карты, а это значит, что нам нужно найти следующие три уникальные карты в хеше, чтобы заменить их.
- Возьмите следующие две цифры в хеш-таблице (43) и преобразуйте их из шестнадцатеричного в десятичное число: 4*16 1 + 3*16 0 = 4*16 + 3*1 = 67.
- Возьмите следующие две цифры в хеш-таблице (1c) и преобразуйте их из шестнадцатеричной системы в десятичную: 1*16 1 + c*16 0 = 1*16 + 12*1 = 38.
- Число 38 находится в диапазоне от 0 до 51 и является уникальным, поэтому сопоставьте его с картой, а именно с тройкой бубен. Это первая карта, которую нужно вытянуть.
- Возьмите следующие две цифры в хеш-таблице (2e) и преобразуйте их из шестнадцатеричной системы в десятичную: 2*16 1 + e*16 0 = 2*16 + 14*1 = 32 + 14 = 46.
- Число 46 уже было найдено в хеше, поэтому мы пропускаем эти две позиции.
- Возьмите следующие две цифры в хеш-таблице (e6) и преобразуйте их из шестнадцатеричного формата в десятичный: e*16 1 + 6*16 0 = 14*16 + 6*1 = 230.
- Возьмите две последние цифры последнего шага, которые равны 30.
- Число 30 находится в диапазоне от 0 до 51 и пока не найдено, поэтому сопоставьте его с картой. Конкретнее, 30 соответствует пятерке бубен. Это будет вторая карта-заменитель.
- Возьмите следующие две цифры в хеше (88) и преобразуйте их из шестнадцатеричного в десятичное число: 8*16 1 + 8*16 0 = 136.
- Возьмите две последние цифры последнего шага, которые равны 36.
- Число 36 находится в диапазоне от 0 до 51 и пока не найдено, поэтому сопоставьте его с картой. Конкретнее, 36 соответствует валету бубен. Это будет третья карта-заменитель.
- Нам не нужно искать больше карт. Раздача готова к подсчету очков, и игроку выплачивается выигрыш.
В итоге, в следующей таблице показаны два символа из хеша за раз, десятичное преобразование, а затем преобразование в формат карты, если таковое имелось.
Преобразование хеша в карту
| Хэш Персонажи | Десятичная дробь Конвертация | Правая Двое Цифры | Играя Карта |
|---|---|---|---|
| 3а | 58 | 58 | или |
| 95 | 49 | 49 | Валет треф |
| 9б | 155 | 55 | или |
| ба | 186 | 86 | или |
| фф | 55 | 55 | или |
| d9 | 217 | 17 | 5 червей |
| б3 | 179 | 79 | или |
| 92 | 146 | 46 | 8 треф |
| 8б | 139 | 39 | Туз треф |
| 28 | 40 | 40 | 2 треф |
| 43 | 67 | 67 | или |
| 1c | 28 | 28 | Тройка бубен |
| 2e | 46 | 46 | р/п/к |
| е6 | 230 | 30 | Пятерка бубен |
| 88 | 136 | 36 | Валет бубен |
Ключ:
o/r = Десятичное преобразование выходит за пределы допустимого диапазона для карты
р/п/к = Повторение предыдущей карты
Если вам кажется, что всё это слишком сложно для обеспечения справедливого результата, у меня для вас хорошие новости! Я написал скрипт, который сделает это за вас, и он сохранён в PHP Sandbox . Это замечательный ресурс! Чтобы использовать его, просто введите сид сервера (казино) в строке 4 и сид клиента (ваш собственный) в строке 5 и нажмите «Выполнить код». Карты, которые вам были предназначены, появятся в поле результатов ниже.
Если с кодом что-то случится, вы можете просмотреть его, нажав кнопку ниже.
На этой странице описывается метод игры в видеопокер с использованием криптографии, гарантирующей предопределенность раздаваемых карт. Если вы не знакомы с основными правилами видеопокера, пожалуйста, посетите мою основную страницу, посвященную видеопокеру .
Для целей этой страницы я пока рассматриваю Cypto.Games. У них есть три версии видеопокера, а именно:
- Валеты или лучше
- Десять или лучше
- Бонусный покер
Игрок должен сделать ставку в 10 кредитов, хотя он может выбрать, сколько именно в криптовалюте он готов поставить. На мой взгляд, шаг с десятью кредитами излишне запутывает ситуацию.
Далее нажмите «Выполнить код». Карты, которые вам были предназначены, появятся в поле результатов ниже, а также подтверждение того, что начальное значение генератора случайных чисел (Server Seed) совпадает с тем, что было указано до совершения ставки.
Ниже также приводится копия кода.
[спойлер=Кодекс честной игры в видеопокер]
// Конвертация видеопокера для Crypto.Games
$server_seed = "2XMpPAbEw3qdH3HQla2K5zNwoNEFHOEYolkB969j";
$client_seed = "bc7v9bn70d7n07sn";
$next_hash = "64e701539ecf4c03b90ecd957d6675b2f72c3fd84f04dc5eb63eed8b9a58b95b";
$rank_array=array("A",2,3,4,5,6,7,8,9,10,"J","Q","K");
$suit_array=array("пики","сердца","бубны","трефы");
$cards_found=0;
$position=0;
$combined_seed = $server_seed.$client_seed;
echo "Объединенное начальное значение = $combined_seed\n";
$combined_hash = hash('sha512', $combined_seed);
echo "Хэш объединенного начального значения = $combined_hash\n";
делать
{
$first_two=substr($combined_hash,$position,2);
$hex_to_dec=hexdec($first_two)%100;
если ($hex_to_dec <=51)
{
$repeat=0;
если ($cards_found>0)
{
for ($i=0; $i<$cards_found; $i++)
{
if ( $hex_to_dec == $card_array[$i])
{ $repeat=1; }
}
}
если ($repeat==0)
{
$card_array[$cards_found] = $hex_to_dec;
$game_position=1+($cards_found%5);
$cards_found++;
$rank=$hex_to_dec%13;
$suit=intdiv($hex_to_dec,13)%4;
если ($cards_found<=5)
{ echo "Раздать карты $game_position =\t$rank_array[$rank] из $suit_array[$suit]\n"; }
еще
{ echo "Вытяните карту $game_position =\t$rank_array[$rank] из $suit_array[$suit]\n"; }
}
}
$position+=2;
если ($position==128)
{
echo "Ошибка -- В хеше больше нет пробела.\n";
$cards_found=10;
}
}
пока ($cards_found<10);
$server_seed_hash = hash('sha256', $server_seed);
если ($server_seed_hash==$next_hash)
{ echo "Совпадение начального значения сервера.\n"; }
еще
{
echo "НЕСООТВЕТСТВИЕ СЕМЕННЫХ ЗНАЧЕНИЙ СЕРВЕРА!\n";
echo "Серверный начальный параметр =\t$server_seed\n";
echo "Хэш начального значения сервера =\t$server_seed_hash\n";
echo "Предполагаемый следующий хеш=\t$next_hash\n";
}
// Процедура
// 1. Переместите "позицию" в положение 0.
// 2. Объедините начальные данные сервера и клиента, а также начальные данные сервера, в указанном порядке.
// 3. Сгенерируйте хеш SHA-512 строки из шага 2.
// 4. Преобразуйте первые два символа, начиная с "позиции" хеша из шага 3, из шестнадцатеричного формата в десятичный.
// 5. Возьмите две конечные цифры из пункта 4.
// 6. Если результат шага 5 равен 51 или меньше и еще не найден, то это будет одна из первых десяти карт.
// 7. Увеличьте "позицию" на 2.
// 8. Повторяйте шаги с 4 по 7, пока не будет найдено десять уникальных карт.
// 9. Первые пять найденных карт будут розданы при раздаче, слева направо.
// 10. Вторые пять карт будут находиться в очереди на раздачу при взятии карты. Например, если игрок берет три карты, то он получит 6-ю, 7-ю и 8-ю карты из очереди.// 11 Чтобы получить позицию карты из шага 6 в реальную карту, выполните следующие действия: // A. Разделите результат из шага 4 на 13 и возьмите остаток. // B. Сопоставьте результат из шага 11A с рангом следующим образом: от 0 до A, от 1 до 2, от 2 до 3, ..., от 9 до 10, от 10 до J, от 11 до Q, от 12 до K. // C. Разделите результат из шага 4 на 13 и отбросьте остаток. // D. Сопоставьте результат из шага 11C с мастью следующим образом: от 0 до пик, от 1 до червей, от 2 до бубен, от 3 до треф. ?> [/спойлер]




