Author Topic: Помогите с ботом для покера.  (Read 11895 times)

0 Members and 2 Guests are viewing this topic.

Doda

  • Guest
Re: Помогите с ботом для покера.
« Reply #15 on: January 14, 2016, 07:30:25 PM »
Code: (clickermann) [Select]
// ýòî âñå ñåìü êàðò äëÿ ïðîâåðêè

$card_1 = 5    // 5
$card_2 = 9   // 9
$card_3 = 6    // 6
$card_4 = 11   // ?????
$card_5 = 7   // 7
$card_6 = 14   // ???
$card_7 = 0    //  ??? ?? ????? ?????? 8

// çàãîíÿåì èõ â ìàññèâ
ARRPUSH($all, INT($card_1))
ARRPUSH($all, INT($card_2))
ARRPUSH($all, INT($card_3))
ARRPUSH($all, INT($card_4))
ARRPUSH($all, INT($card_5))
ARRPUSH($all, INT($card_6))
ARRPUSH($all, INT($card_7))

// ñîðòèðóåì ìàññèâ ïî âîçðàñòàíèþ
$len = ARRSIZE($all)
FOR($num=0, $num < $len - 1)
   $min = $all[$num]
   $ind = $num
   FOR($i=($num+1), $i < $len)
      IF($all[$i] < $min)
         $min = $all[$i]
         $ind = $i
      END_IF
   END_CYC
   $minimum =  $all[$ind]
   $all[$ind] = $all[$num]
   $all[$num] = $minimum
END_CYC

// ìàññèâ â ëîã
FOR($i=0, $i < ARRSIZE($all))
   LOGWRITE ($all[$i])
END_CYC

// ñ÷èòàåì ñîëîüá êîëüêî êàðò åñòü ïîäðÿä
$podr = 1
FOR($i=0, $i < $len-1)
   IF($all[$i] = $all[$i+1] - 1)
      INC($podr)
   ELSE
      $podr = 1
   END_IF
   IF($podr = 5)
      $i = 100 // ïðåðûâàåì 
      ARRPUSH($podr, $podr)
   END_IF
   LOGWRITE ("ïîäðÿä êàðò: ", $podr)
ARRPUSH($podr, $podr)
END_CYC
FOR($num=0, $num < ARRSIZE($podr) - 1)
   $man = $podr[$num]
   $ind = $num
   FOR($i=($num+1), $i < ARRSIZE($podr))
      IF($podr[$i] > $man)
         $man = $podr[$i]
         $ind = $i
      END_IF
   END_CYC
LOGWRITE ("ïîäðÿä èäóùèõ êàðò: ", $man)

HALT

22:30:01 0
22:30:01 5
22:30:01 6
22:30:01 7
22:30:01 9
22:30:01 11
22:30:01 14
22:30:01 подряд карт: 1
22:30:01 подряд карт: 2
22:30:01 подряд карт: 3
22:30:01 подряд карт: 1
22:30:01 подряд карт: 1
22:30:01 подряд карт: 1
22:30:01 подряд идущих карт: 3

dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #16 on: January 14, 2016, 07:32:56 PM »
Подряд-то 3, но для стрита на столе лежат 4 карты, не хватает карты с середины, восьмерки.

Doda

  • Guest
Re: Помогите с ботом для покера.
« Reply #17 on: January 14, 2016, 07:39:35 PM »
я в покере не шарю восьмерка не зашла, а от кликера что требуется?

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Помогите с ботом для покера.
« Reply #18 on: January 14, 2016, 10:08:41 PM »
Тему в использование перенесите, напишите под какой сайт пишется, желающих помогать в написании будет гораздо больше, когда есть возможность протестировать скрипт.

dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #19 on: January 15, 2016, 12:47:13 AM »
Я прошу помочь с общим алгоритмом для всех. На данный момент делаю под покер-рум Poker Mira. Снимайте нужные карты в базу да и все и подставляйте.
А я думаю, что нужно сделать вот так:
Делаем шаблоны всех комбинаций, условно для каждой комбинации нужное кол-во "ячеек", в массивах не оч я ещеЮ но уже начинаю осваивать.
// Пара
Две ячейки, в которые могут поместится только карты одинакового достоинства
// Две пары
Четыре ячейки, для 2х разных пар
// Сет
Три ячейки для трех карт одинакового достоинства
и т.д.

Раздаются карты, сначала 2шт, делается проверка по всех шаблонах. Максимальная комбинация Пара.
Потом еще 3 карты на стол дают, снова анализируются из всех шаблонов. На руках может быть карты 5-6, а на столе 8-9-Туз. В этом случает у нас почти собран Стрит (5 карт подряд, в этом случае 5-6-7-8-9). Как видим нам не хватает 7ки для сложившейся комбинации. НО на стол дальше приходит еще 1 карта, снова анализируем и делаем вывод. Допустим падает Двойка. У нас снова нету комбинации, но есть последняя карта, которая еще выпадает на стол.
По выше указанному коду не выйдет научить бота понимать, что у него еще есть шансы для сбора комбинации.

Алгоритмы, действий при разных комбинациях (Сбрасывать, Равнять ставку, Подымать ставку, Делать Ва-Банк) я сам сделаю и выложу сюда, но вначале нужно вышеуказанные проблемы решить.
Выложу описание возможных комбинаций в покере, шаблоны которых нужно сделать:
[spoiler]// Пара
Две карты одного ранга

// Две пары
Две карты одного ранга и две другого

// Сет
3 карты одного ранга

// Стрит
5 последовательных карт
(туз может использовать как самая старшая, так и как самая младшая карта)
Пример, когда туз самая младшая карта: Туз-двойка-тройка-четверка-пятерка
Пример, когда туз самая старшая карта : Десятка-валет-дама-король-туз

// Флеш
5 любых карт одной масти

// Фул хаус
3 карты одного ранга и пара (То есть пара + сет)

// Каре
4 карты одного ранга

// Стрит фшел
5 последовательных карт одной масти. (То есть тот же стрит, только когда еще все карты, которые делают стрит еще и одной масти)

// Флеш рояль
5 старших карт одной масти
A,K,Q,J,10 и все одной масти - Самая сильная комбинация в покере. [/spoiler]

Каждая комбинация содержит в себе 5 карт (Даже пара, хоть там и нужно только 2 карты, но тогда еще учитываются карты которые есть еще так называемые КИКЕРА, НО этим можно пренебречь) .  Всего карт, которые мы видим 7. Две нам дают на руки, которые видим только мы и 5 карт на стол для всех игроков.

Doda

  • Guest
Re: Помогите с ботом для покера.
« Reply #20 on: January 15, 2016, 11:55:41 AM »
шаблоны замучаешься делать. плюс все массивы.
Вот тебе, как просил) для любой задачи можно продумать алгоритм)
поиск вверх
Quote
14:53:20 0
14:53:20 5
14:53:20 6
14:53:20 7
14:53:20 9
14:53:20 11
14:53:20 14
14:53:20 подряд карт: 1
14:53:20 подряд карт: 2
14:53:20 подряд карт: 3
14:53:20 подряд карт: 1
14:53:20 подряд карт: 1
14:53:20 подряд карт: 1
14:53:20 если выпадет 8, то соберешь стрит
14:53:20 самая большая 3

Code: (clickermann) [Select]
$card_1 = 5    // 5
$card_2 = 9   // 9
$card_3 = 6    // 6
$card_4 = 11   // ?????
$card_5 = 7   // 7
$card_6 = 14   // ???
$card_7 = 0    //  ??? ?? ????? ?????? 8

// caaiiyai eo a iannea
ARRPUSH($all, INT($card_1))
ARRPUSH($all, INT($card_2))
ARRPUSH($all, INT($card_3))
ARRPUSH($all, INT($card_4))
ARRPUSH($all, INT($card_5))
ARRPUSH($all, INT($card_6))
ARRPUSH($all, INT($card_7))

// ni?oe?oai iannea ii aic?anoaie?
$len = ARRSIZE($all)
FOR($num=0, $num < $len - 1)
   $min = $all[$num]
   $ind = $num
   FOR($i=($num+1), $i < $len)
      IF($all[$i] < $min)
         $min = $all[$i]
         $ind = $i
      END_IF
   END_CYC
   $minimum =  $all[$ind]
   $all[$ind] = $all[$num]
   $all[$num] = $minimum
END_CYC

// iannea a eia
FOR($i=0, $i < ARRSIZE($all))
   LOGWRITE ($all[$i])
END_CYC

// карт подряд
$podr = 1
FOR($i=0, $i < $len-1)   //от 0 до макс.элемента массива
   IF($all[$i] = $all[$i+1] - 1)// если итый элемент ментше на единицу последующего
      INC($podr)  //повышаем подр
   ELSE
      $podr = 1                  //иначе подр 1
   END_IF
   IF($podr = 5) //если мобрали стрит, сброс
      $i = 100 // прерываем
      ARRPUSH($podr, $podr) //кидаем в массив подр
   END_IF
   LOGWRITE ("подряд карт: ", $podr)  //пишем после каждой проверки количество карт
   ARRPUSH($podr, $podr)
END_CYC

FOR($num=0, $num < ARRSIZE($podr) - 1)
   $man = $podr[$num] //ман это  итый элемент массива с максималами   знач.комб.
   $ind1 = $num  //инд индекс массива
   FOR($i=($num+1), $i < ARRSIZE($podr))//если следующий элемент больше  предыдущего
      IF($podr[$i] > $man)  //
         $max = $podr[$i]  //то ман
         $ind2 = $i
         
      END_IF
   END_CYC
END_CYC

IF($max = 3) //есть намек на стрит
   $str2=$all[$ind2]             //проверяем 1 пролет  вверх
   $str1=$all[$ind2-2]//здесь вниз
   IF($str2 = $all[$ind2+1] - 2)
      $nado= $all[$ind2]+1      //думаем какое число пропущено
      print("если выпадет ", $nado, ", то соберешь стрит")
   END_IF
   //      IF($str1 = $all[$ind2-4] - 2)
   //         $nado= ($all[$i+1] - 1)       //думаем какое число пропущено
   //      END_IF
   
END_IF

LOGWRITE ("самая большая ", $max)
//задача -  если есть 3 подряд, то анализ,  на пропуск через одну

HALT
« Last Edit: January 15, 2016, 12:04:37 PM by Браm комара »

Doda

  • Guest
Re: Помогите с ботом для покера.
« Reply #21 on: January 15, 2016, 12:05:48 PM »
А вот поиск комплексный.анализируя любые комбинации где есть 3 последовательные карты мы проверяем,  можем ли мы собрать стрит и  если можем - какие карты остались

Дальше по аналогии - при 4 картах подряд ищем вниз/вверх комбинацию стрит
Code: (clickermann) [Select]
$card_1 = 4    // 5
$card_2 = 8   // 9
$card_3 = 1    // 6
$card_4 = 6   // ?????
$card_5 = 7   // 7
$card_6 = 14   // ???
$card_7 = 0    //  ??? ?? ????? ?????? 8

// caaiiyai eo a iannea
ARRPUSH($all, INT($card_1))
ARRPUSH($all, INT($card_2))
ARRPUSH($all, INT($card_3))
ARRPUSH($all, INT($card_4))
ARRPUSH($all, INT($card_5))
ARRPUSH($all, INT($card_6))
ARRPUSH($all, INT($card_7))

// ni?oe?oai iannea ii aic?anoaie?
$len = ARRSIZE($all)
FOR($num=0, $num < $len - 1)
   $min = $all[$num]
   $ind = $num
   FOR($i=($num+1), $i < $len)
      IF($all[$i] < $min)
         $min = $all[$i]
         $ind = $i
      END_IF
   END_CYC
   $minimum =  $all[$ind]
   $all[$ind] = $all[$num]
   $all[$num] = $minimum
END_CYC

// iannea a eia
FOR($i=0, $i < ARRSIZE($all))
   LOGWRITE ($all[$i])
END_CYC

// карт подряд
$podr = 1
FOR($i=0, $i < $len-1)   //от 0 до макс.элемента массива
   IF($all[$i] = $all[$i+1] - 1)// если итый элемент ментше на единицу последующего
      INC($podr)  //повышаем подр
   ELSE
      $podr = 1                  //иначе подр 1
   END_IF
   IF($podr = 5) //если мобрали стрит, сброс
      $i = 100 // прерываем
      ARRPUSH($podr, $podr) //кидаем в массив подр
   END_IF
   LOGWRITE ("подряд карт: ", $podr)  //пишем после каждой проверки количество карт
   ARRPUSH($podr, $podr)
END_CYC

FOR($num=0, $num < ARRSIZE($podr) - 1)
   $man = $podr[$num] //ман это  итый элемент массива с максималами   знач.комб.
   $ind1 = $num  //инд индекс массива
   FOR($i=($num+1), $i < ARRSIZE($podr))//если следующий элемент больше  предыдущего
      IF($podr[$i] > $man)  //
         $max = $podr[$i]  //то ман
         $ind2 = $i
         
      END_IF
   END_CYC
END_CYC

IF($max = 3) //есть намек на стрит
   $str2=$all[$ind2]             //проверяем 1 пролет  вверх
   $str1=$all[$ind2-2]//здесь вниз
   IF($str2 = $all[$ind2+1] - 2)
      $nado= $all[$ind2]+1      //думаем какое число пропущено
      print("если выпадет ", $nado, ", то соберешь стрит")
   END_IF
   IF($str1 = $all[$ind2-3] + 2)
      $nado= $all[$ind2-2]-1      //думаем какое число пропущено
      print("если выпадет ", $nado, ", то соберешь стрит")
   END_IF
   
END_IF

LOGWRITE ("самая большая ", $max)

LOGWRITE ("самая большая ", $all[$ind2-3])
//задача -  если есть 3 подряд, то анализ,  на пропуск через одну

HALT

Определение недостающих для стрита при комбинации в 4 карты

Code: (clickermann) [Select]
IF($max = 4) //есть намек на стрит
 print("если выпадет ", $all[$ind2]+1, " или ",$all[$ind2-3]-1, ", то соберешь стрит")
   END_IF
   
END_IF
« Last Edit: January 15, 2016, 12:41:08 PM by Браm комара »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #22 on: January 15, 2016, 01:10:34 PM »
Изменил немного
Code: (clickermann) [Select]
$card_1 = 5    // 5
$card_2 = 9   // 9
$card_3 = 6    // 6
$card_4 = 11   // валет
$card_5 = 7   // 7
$card_6 = 14   // туз
$card_7 = 0    //  еще не зашла нужная 8

и в итоге
Code: [Select]
17:45:20 0
17:45:20 5
17:45:20 6
17:45:20 7
17:45:20 9
17:45:20 11
17:45:20 14
17:45:20 подряд карт: 1
17:45:20 подряд карт: 2
17:45:20 подряд карт: 3
17:45:20 подряд карт: 1
17:45:20 подряд карт: 1
17:45:20 подряд карт: 1
17:45:20 подряд идущих карт: 1

Как это исправить? Вить когда есть еще шанс на нужную карту можно играть. Тока подумал про это(

Ну ты же придумал и ввёл карту с индексом 0. Тем более только что. Почему у меня тогда спрашиваешь.  :)

Этот код был для определения имеющегося стрита. Ничего больше там не написано.
Какой вопрос задавал на такой ответ и получил.
Я же не моделировал все ситуации и код для них не писал.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #23 on: January 15, 2016, 01:13:25 PM »
По выше указанному коду не выйдет научить бота понимать, что у него еще есть шансы для сбора комбинации.
Выше код только определял стрит есть или нет из имеющихся карт.
А так же способы нумеровки карт и некоторые обработки. Пока всё.
Естественно полное определение всех состояний и анализ при скрытых картах нужно писать.
« Last Edit: January 15, 2016, 01:19:06 PM by Vint »


Doda

  • Guest
Re: Помогите с ботом для покера.
« Reply #24 on: January 15, 2016, 01:16:30 PM »
Quote
Естественно полное определение всех состояний и анализ при скрытых картах нужно писать.
там ситуаций миллион! только для стрита 3. сейчас пишу код, когда  есть две пары для стрита

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #25 on: January 15, 2016, 01:28:07 PM »
Ну так и не нужно их сравнивать втупую.

Я вот в покере не шарю совсем. Вопрос есть: а зачем мы определяли что у нас есть на стадиях 2 карты... 3 карты...
Это типа можно сказать стоп, у меня и так круто?

Нужно делать два типа анализа ситуации.
Какие комбинации у нас УЖЕ есть с учётом открытых карт.
Какие комбинации у нас могут быть.

Последним нужен "вес". И выстраивать их в порядке убывания веса.
Зачем вес? Ну до одной комбинации нам не хватает 1 карты, а до другой 2, например. Но вторая сильнее если будет собрана.
Если не нужно заглядывать вперёд больше чем на 1 карту, тогда проще.

А вот саму логику хода (или что там делается) это уже смотреть что имеем и что можем иметь и делать выводы.
Здесь "правильного" алгоритма нет. Есть дающие лучший результат по играм и хуже. Это как программы-шахматисты.


dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #26 on: January 15, 2016, 02:22:44 PM »
Извиняюсь, если где-то не так выразился и не то спросил. В голове у меня был алгоритм, который оказался не верным. Но в ходе ваших подсказок я понял, что нужно делать совсем иначе. За это большое спасибо.
Quote
Нужно делать два типа анализа ситуации.
Какие комбинации у нас УЖЕ есть с учётом открытых карт.
Какие комбинации у нас могут быть.
Да, вот это как раз в точку.
Quote
Если не нужно заглядывать вперёд больше чем на 1 карту, тогда проще.
Я думаю, что не нужно. Вначале когда на руки дают 2 карты, бот будет играть только с определенными картами. Допустим со всеми картами выше 10 (если обе карты такого ранга), а если они меньше, то можно играть только с  идущими подряд, например, (5,6) или (2,3) . Когда он решит играть дальше, нужно будет оценивать. Но загадывать на 2 карты вперед не нужно, на 1 вполне хватит. Ибо таких ситуаций, когда допустим до стрита не хватает 2 карты, и чтобы из 2 карт зашли обе нужные %-вероятности маленький.
« Last Edit: January 15, 2016, 02:24:23 PM by dmutruk »

Doda

  • Guest
Re: Помогите с ботом для покера.
« Reply #27 on: January 15, 2016, 02:29:48 PM »
Quote
Вначале когда на руки дают 2 карты, бот будет играть только с определенными картами
Когда выдали -проверить ,есть ли у нас одинаковые номиналы разных мастей, либо пары разных номиналов. если есть - играем. по сути все просто

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #28 on: January 15, 2016, 03:01:10 PM »
Ну вот и хорошо.


Будем вызывать подпрограммы:
Code: (clickermann) [Select]
get_combo()              // определяем комбинации которые уже есть
get_combo_virtual()  // определяем комбинации которые могут быть с +1 картой

Эти подпрограммы определяют последовательно все типы комбинаций и возвращают результаты в основной блок в виде переменной $combo и массива $combo_virtual  соответственно.

Переменная комбо содержит код ИМЕЮЩЕЙСЯ СТАРШЕЙ комбинации.
Массив $combo_virtual коды возможных комбинаций.
Если массив пустой то комбинаций нет.


Можно ещё коды комбинаций так же сделать в числовом формате по старшинству. Чем больше число, тем сильнее комбо.

10 - Флеш рояль
9 - Стрит флеш
8 - Каре
7 - Фул хаус
6 - Флеш
5 - Стрит
4 - Сет
3 - Две пары
2 - Пара
1 - Старшая карта

Для стрита ещё можно возвращать номер комбинации 1-9
5.1 - старшая карта  шестёрка
5.2 - старшая карта семёрка
...
5.9 - старшая карта туз

Для пары, тройки и каре возвращать номер старшинства
8.12 - каре дам
4.9  - тройка девяток

Не знаю что делать с двумя парами и фул хаусом...
Можно тогда возвращать только код комбо 1-9, и будут две переменные в которых будут храниться доп параметры.
$k1 и $k2

Мы видим стрит не стрит... и делаем ходы.
А в случае если нам нужно сравнение или узнать какой же у нас фул хаус, то в $k1 будет тип карты которых 3 и в $k2 которых 2
Если просто тройка,  двойка или каре для сравнения будем смотреть только одну переменную $k1 в которой будет тип карты.


« Last Edit: January 15, 2016, 03:03:03 PM by Vint »


dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #29 on: January 15, 2016, 03:09:50 PM »
Из первых вариантов от Vint'а делаю сейчас действия при условиях:
1) Если обе карты одного ранга выше 10 включительно (пара) - Повышаем или равняем в случае, если сумма повышения вынуждает нас сделать Ва-банка, на все деньги) Или идем Ва-банк. Рандомно решает.
2) Если обе карты выше 10 включительно и одной масти(но не подряд) - Повышаем или равняем в случае Ва-банка, на все деньги)
3) Если обе карты выше 10 включительно и разной масти(но не подряд) - Равняем ставку, но сбрасываем  в случае Ва-банка, на все деньги)
4) Если карты идут подряд, одной масти, обе выше 10 включительно - Повышаем ставку или в случает Ва-банка  рандомно решаем равнять в или нет.
5) Если карты идут подряд, разной масти, обе выше 10 включительно - Равняем ставку или в случает Ва-банка  рандомно решаем равнять в или нет.
6) Если карты идут подряд, одной масти, обе ниже 10 - Рандомно решаем равнять или повышать ставку. НО сбрасиваем, если для сравнения ставки нужно делать Ва-банк
7) Если карты идут подряд, разной масти, обе ниже 10 - Равняет ставку. НО сбрасиваем, если для сравнения ставки нужно делать Ва-банк

Но у меня пока проблема возникла. Туз может быть как самая маленькая карта в стрите (Туз-2-3-4-5)так же и как самая большая в стрите (10-валет-дама-король-туз). Туз у нас число 14, как его сделать, чтобы туз был числом 1 в первом стрите и 14 во втором? И когда в руке туз-2, действовало по варианту 6-7 или король-туз по вариантам 4-5, в зависимости от масти?
« Last Edit: January 15, 2016, 04:17:16 PM by dmutruk »