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

0 Members and 1 Guest are viewing this topic.

dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Помогите с ботом для покера.
« on: January 14, 2016, 03:35:43 PM »
Здравствуйте. С момента моего начала ознакомления с кликером прошло довольно много времени и уже не мало написал скриптов для себя. А вот сейчас застрял((
Пишу бота для техасского холдема.
Карты приходящие в руку (префлоп) отличаются от карт, которые на стол выходят(флоп, терн, ривер).
Решил вместо поиска бмп-шек для каждой карты использовать подсчет пикселей фона в участке где картинка карты. Таким образом я избавился от проблемы, с тем что карты бывают черные и красные.
Потому использую 2 разных набора "колод" (разное кол-во пикселей фона для одной и той же карты в руке и на столе)
Code: (clickermann) [Select]
//ПРЕФЛОП
GETSCREEN(756,418, 792,444)
$Preflop_1 = PXLCOUNT(756,418,773,444, 16777215) // карманная карта 1
$Preflop_2 = PXLCOUNT(775,418,792,444, 16777215) // карманная карта 2
// КОЛИЧЕСТВО ПИКСЕЛЕЙ 16777215 ДЛЯ КАРТ ПРЕФЛОПА
// 2 = 311
// 3 = 320
// 4 = 328
// 5 = 306
// 6 = 285
// 7 = 346
// 8 = 255
// 9 = 279
// 10 = 213
// J  = 323   
// Q = 248
// K = 261
// A = 291

SWITCH($Preflop_1)
// 2
CASE(311)

// 3
CASE(320)

// 4
CASE(328)

// 5
CASE(306)

// 6
CASE(285)

// 7
CASE(346)

// 8
CASE(255)

// 9
CASE(279)

// 10
CASE(213)

// J
CASE(323)

// Q
CASE(248)

// K
CASE(261)

// A
CASE(291)
DEFAULT
// случай по умолчанию

END_SWITCH

SWITCH($Preflop_2)
// 2
CASE(311)

// 3
CASE(320)

// 4
CASE(328)

// 5
CASE(306)

// 6
CASE(285)

// 7
CASE(346)

// 8
CASE(255)

// 9
CASE(279)

// 10
CASE(213)

// J
CASE(323)

// Q
CASE(248)

// K
CASE(261)

// A
CASE(291)
DEFAULT
// случай по умолчанию

END_SWITCH

// ФЛОП
WAITMS(50)
GETSCREEN(501,237,668,270)
$card_1 = PXLCOUNT(501,237,520,270, 16777215)
$card_2 = PXLCOUNT(575,237,594,270, 16777215)
$card_3 = PXLCOUNT(649,237,668,270, 16777215)

// ТЕРН
WAITMS(50)
GETSCREEN(723,237,742,270)
$card_4 = PXLCOUNT(723,237,742,270, 16777215)

//РИВЕР
WAITMS(50)
GETSCREEN(797,237,816,270)
$card_5 = PXLCOUNT(797,237,816,270, 16777215)

WAITMS(50)
LOGWRITE ("Карта_1 = ", $card_1, " Карта_2 = ", $card_2, " Карта_3 = ", $card_3, " Карта_4 = ", $card_4, " Карта_5 = ", $card_5)

WAITMS(50)

// ФЛОП_1
SWITCH($card_1)
// 2
CASE(425)
CASE(426)
CASE(427)

// 3
CASE(429)
CASE(430)
CASE(431)

// 4
CASE(479)
CASE(480)
CASE(481)

// 5
CASE(455)
CASE(456)
CASE(457)

// 6
CASE(412)
CASE(413)
CASE(414)

// 7
CASE(507)
CASE(508)
CASE(509)

// 8
CASE(346)
CASE(347)
CASE(348)

// 9
CASE(403)
CASE(404)
CASE(405)

// 10
CASE(369)
CASE(370)
CASE(371)

// J
CASE(494)
CASE(495)
CASE(496)

// Q
CASE(415)
CASE(416)

// K
CASE(385)
CASE(386)
CASE(387)

// A
CASE(417)
CASE(418)
CASE(419)
DEFAULT
END_SWITCH

// ФЛОП_2
SWITCH($card_2)
// 2
CASE(425)
CASE(426)
CASE(427)

// 3
CASE(429)
CASE(430)
CASE(431)

// 4
CASE(479)
CASE(480)
CASE(481)

// 5
CASE(455)
CASE(456)
CASE(457)

// 6
CASE(412)
CASE(413)
CASE(414)

// 7
CASE(507)
CASE(508)
CASE(509)

// 8
CASE(346)
CASE(347)
CASE(348)

// 9
CASE(403)
CASE(404)
CASE(405)

// 10
CASE(369)
CASE(370)
CASE(371)

// J
CASE(494)
CASE(495)
CASE(496)

// Q
CASE(415)
CASE(416)

// K
CASE(385)
CASE(386)
CASE(387)

// A
CASE(417)
CASE(418)
CASE(419)
DEFAULT
END_SWITCH

// ФЛОП_3
SWITCH($card_3)
// 2
CASE(425)
CASE(426)
CASE(427)

// 3
CASE(429)
CASE(430)
CASE(431)

// 4
CASE(479)
CASE(480)
CASE(481)

// 5
CASE(455)
CASE(456)
CASE(457)

// 6
CASE(412)
CASE(413)
CASE(414)

// 7
CASE(507)
CASE(508)
CASE(509)

// 8
CASE(346)
CASE(347)
CASE(348)

// 9
CASE(403)
CASE(404)
CASE(405)

// 10
CASE(369)
CASE(370)
CASE(371)

// J
CASE(494)
CASE(495)
CASE(496)

// Q
CASE(415)
CASE(416)

// K
CASE(385)
CASE(386)
CASE(387)

// A
CASE(417)
CASE(418)
CASE(419)
DEFAULT
END_SWITCH

// ТЕРН_4
SWITCH($card_4)
// 2
CASE(425)
CASE(426)
CASE(427)

// 3
CASE(429)
CASE(430)
CASE(431)

// 4
CASE(479)
CASE(480)
CASE(481)

// 5
CASE(455)
CASE(456)
CASE(457)

// 6
CASE(412)
CASE(413)
CASE(414)

// 7
CASE(507)
CASE(508)
CASE(509)

// 8
CASE(346)
CASE(347)
CASE(348)

// 9
CASE(403)
CASE(404)
CASE(405)

// 10
CASE(369)
CASE(370)
CASE(371)

// J
CASE(494)
CASE(495)
CASE(496)

// Q
CASE(415)
CASE(416)

// K
CASE(385)
CASE(386)
CASE(387)

// A
CASE(417)
CASE(418)
CASE(419)
DEFAULT
END_SWITCH

// РИВЕР_5
SWITCH($card_5)
// 2
CASE(425)
CASE(426)
CASE(427)

// 3
CASE(429)
CASE(430)
CASE(431)

// 4
CASE(479)
CASE(480)
CASE(481)

// 5
CASE(455)
CASE(456)
CASE(457)

// 6
CASE(412)
CASE(413)
CASE(414)

// 7
CASE(507)
CASE(508)
CASE(509)

// 8
CASE(346)
CASE(347)
CASE(348)

// 9
CASE(403)
CASE(404)
CASE(405)

// 10
CASE(369)
CASE(370)
CASE(371)

// J
CASE(494)
CASE(495)
CASE(496)

// Q
CASE(415)
CASE(416)

// K
CASE(385)
CASE(386)
CASE(387)

// A
CASE(417)
CASE(418)
CASE(419)
DEFAULT
END_SWITCH

Для флопа,терна и ривера почему-то кол-во тех же пикселей иногда скачит -/+ 1 пиксель, потому для каждой карты у меня по 3  CASE'а. Только с дамой и тузом вышло, что между ними нельзя было так сделать, я проверил все позиции дамы и туза и вышло, что у дамы скачит только на -1 от первоначальных данных, а тузу уже свободные 3 "числа" отдал.

Задача в том, что я не могу придумать каким образом обозначить карты или цифрами, или строками, или еще чем-то. Так как комбинаций в покере 10:
// Нет совпадений

// Пара

// Две пары

// Сет

// Стрит

// Флеш

// Фул хаус

// Каре

// Стрит фшел

// Флеш рояль

Но разновидностей того же стрита, не учитывая масть (кстати масть я буду также определять как и саму карту, по кол-ву пикселей фона) от туза до 5, от 3 до 6 и т.д. Помогите советом, ничего пока не приходит толкового и не геморного)

Пока есть идея создать основные 9 шаблонов комбинаций, но как потом подставлять и перебирать не могу придумать.
И самая главная проблема со стритом. Там нужно, чтобы было 5 карт подряд (5,6,7,8,9 - допустим) и нужно задавать карты таким образом, чтобы можно было потом эту зависимость/очередность тоже проверить. Толкните идей, пожалуйста.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #1 on: January 14, 2016, 04:22:30 PM »
Задача в том, что я не могу придумать каким образом обозначить карты или цифрами, или строками, или еще чем-то.

Я бы обозначил цифрами, точнее числами. С числами проще работать и обрабатывать потом. Та же очерёдность или применение CASE

А вот как сделать... Может дробным числом? Вида
масть.номер карты
единицы - это масти.  дробная часть номер карты в сотых от целого

например:
1.02 крестовая двойка
1.05 крестовая пятёрка
1.10 крестовая десятка
1.13 крестовый король
2.13 бубновый король
4.14 пиковый туз

По числу легко определить всё.
По целой части -  масть, по дробной части старшинство карты.

[spoiler]Масти карт не учитываются при определении стар­шинства составленных комбинаций. Но масть карты может определять младшую карту при установке на­чальной ставки (форсид бэт) в стад-покере, а также для определения игрока, который получит нечетную игральную фишку в случае разделения выигрыша между двумя игроками в хай-лоу покере. В этом случае старшинство мастей следующее: пики, черви, бубны, трефы, где пики — старшая масть.[/spoiler]

P.S. Блин, вот тут подумал. Наверно нужно поменять местами целую и дробную части. Ведь чаще прийдётся работать не с мастью, а старшинством карты.

Тогда так:
2.1 двойка крестовая
5.1 пятёрка крестовая
10.1 десятка крестовая
13.1 король крестовый
13.2 король бубновый
14.4 туз пиковый

Тогда простой сортировкой можно их выстроить.
Сравнения старшинства это обычное сравнение <> в условии.
Можно отбрасывать масть применяя INT(), хотя и так всё будет правильно. Масть не повлияет на очерёдность карты.

Для выявления всяких комбинаций можно и хитро условия прописать, а можно и тупо составить массивы с комбинациями.

А можно точно так же, но строками: "14.4". При необходимости переводить в число через ROUND или INT


Например для флеш рояля убеждаемся что дробные части у карт одинаковые.
Запихиваем целые части INT()  в массив $наруках.
Сортируем массив по возрастанию.
Сравниваем либо с эталонным массивом флеш рояля, либо переводим все элементы в одну строку с разделителем и сравниваем с эталонной строкой.
« Last Edit: January 14, 2016, 05:07:48 PM by Vint »


dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #2 on: January 14, 2016, 05:03:22 PM »
Ну идея не плохая. Но только я видать чет не понимаю:
Quote
Тогда так:
2.1 двойка крестовая
5.1 пятёрка крестовая
10.1 десятка крестовая
13.1 король крестовый
13.2 король бубновый
14.4 туз пиковый

Тогда если на руках будет:
2.1 двойка крестовая и 5.1 пятёрка крестовая = в сумме дадут 7.2 , а 7.2 - по этой идее это семерка бубновая
Я думал каждой комбинации присвоить цифру, сумма карт должна соответствовать комбинации (но видать я и не могу придумать, потому что так не правильно)
 
Да и как я тогда научу определять флеш? Вить на каждом этапе (даже на префлопе) оно будет искать сразу 7 карт и исходя из полученных результатов определять какая комбинация сейчас есть, на префлопе максимум может быть пара, а дальше вить больше комбинаций.
Или я не правильный алгоритм хочу сделать? Давайте кусочком кода, допустим:
На руках у меня 9 и 10 (Давайте пока без масти)
На стол падает Валет, Дама, Король,Двойка и Пятерка,. Покажите как по ваших идеях определить, что это - стрит.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #3 on: January 14, 2016, 05:11:56 PM »
идея правильная, только зачем нужны дроби? каждая карта трёхзначное число.
Без дробей не получится. Карт одной масти больше 10.

Если ты про первый вариант, то он не подходит. Тяжелей обрабатывать. Легче отбросить интом дробную часть чем считать каждый раз отбрасывая целое
$x - INT($x)


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #4 on: January 14, 2016, 05:13:49 PM »
Ну идея не плохая. Но только я видать чет не понимаю:
Quote
Тогда так:
2.1 двойка крестовая
5.1 пятёрка крестовая
10.1 десятка крестовая
13.1 король крестовый
13.2 король бубновый
14.4 туз пиковый

Тогда если на руках будет:
2.1 двойка крестовая и 5.1 пятёрка крестовая = в сумме дадут 7.2 , а 7.2 - по этой идее это семерка бубновая
Я думал каждой комбинации присвоить цифру, сумма карт должна соответствовать комбинации (но видать я и не могу придумать, потому что так не правильно)

Не складывать не выйдет. Нужно сравнивать последовательность с шаблоном.
Ты определись строки будут или числа. Напишу пример  сравнения с шаблоном.


dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #5 on: January 14, 2016, 05:15:45 PM »
Quote
Ты определись строки будут или числа. Напишу пример  сравнения с шаблоном.
Всегда писал с числами, с строками не пробовал. Понятнее будет с числами для меня.

dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #6 on: January 14, 2016, 05:40:46 PM »
Мне бы для начала научить бота:
Quote
1. наличие комбинации у себя
2. максимально возможная комбинация с учётом карт на столе
3. возможность собрать старшие комбинации, с учётом количества игроков, сброшеных карт, оставшегося количества ходовэ
4. вероятность сбора старших комбинаций другими игроками, с учетом тех же условий.
5. учет поднятия игроками ставок и сброса карт ,общая статистика всех игроков за столом за всю игру и отдельно данная раздача.
6. Учет игровой валюты, за столом, часто можно выиграть если  игрок с лучшей комбинацией имеет малый остаток, а ты просто идёшь вабанк, когда за столом много игроков.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #7 on: January 14, 2016, 06:03:47 PM »
Или я не правильный алгоритм хочу сделать? Давайте кусочком кода, допустим:
На руках у меня 9 и 10 (Давайте пока без масти)
На стол падает Валет, Дама, Король,Двойка и Пятерка,. Покажите как по ваших идеях определить, что это - стрит.

Code: (clickermann) [Select]
// это все семь карт для проверки

$card_1 = 9.1    //  9
$card_2 = 10.1   // 10
$card_3 = 2.3    //  2
$card_4 = 11.3   // валет
$card_5 = 12.3   // дама
$card_6 = 13.3   // король
$card_7 = 5.3    //  5

// загоняем их в массив
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 // прерываем
   END_IF
LOGWRITE ("подряд карт: ", $podr)   
END_CYC
LOGWRITE ("подряд идущих карт: ", $podr)

HALT


dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #8 on: January 14, 2016, 06:12:14 PM »
Vint, спасибо, сейчас буду разбираться и подставлять уже к себе. И масть по такому же принципу потом сделать?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите с ботом для покера.
« Reply #9 on: January 14, 2016, 06:23:46 PM »
вот тебе определение сколько карт по мастям
Code: (clickermann) [Select]
$card_1 = 9.1    //  9
$card_2 = 10.1   // 10
$card_3 = 2.3    //  2
$card_4 = 11.3   // валет
$card_5 = 12.3   // дама
$card_6 = 13.3   // король
$card_7 = 5.3    //  5

// Флеш (Flush) Пять карт одной масти

// загоняем их в массив
UNDEFINE($all)
ARRPUSH($allm, $card_1)
ARRPUSH($allm, $card_2)
ARRPUSH($allm, $card_3)
ARRPUSH($allm, $card_4)
ARRPUSH($allm, $card_5)
ARRPUSH($allm, $card_6)
ARRPUSH($allm, $card_7)

//массив количества карт по мастям
ARRPUSH($mast_count, 0)
ARRPUSH($mast_count, 0)
ARRPUSH($mast_count, 0)
ARRPUSH($mast_count, 0)

// сколько карт по мастям
FOR($i=0, $i < ARRSIZE($allm))
   $card = $allm[$i]
   $m = ($card - INT($card)) * 10
   $mast_count[$m-1] = $mast_count[$m-1] +1
END_CYC

// массив по мастям в лог
FOR($i=0, $i < ARRSIZE($mast_count))
   LOGWRITE("масть ", $i+1, "  ", $mast_count[$i], " шт.")
END_CYC

// есть ли флеш
FOR($i=0, $i < ARRSIZE($mast_count))
   IF($mast_count[$i] > 4)
      LOGWRITE("есть флеш масти ", $i+1, "  карт ", $mast_count[$i], " шт.")
   END_IF   
END_CYC

HALT


Doda

  • Guest
Re: Помогите с ботом для покера.
« Reply #10 on: January 14, 2016, 06:25:58 PM »
Quote
21:21:28 подряд идущих карт: 5
ух, ты круто! дальше дело за малым

dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #11 on: January 14, 2016, 06:32:15 PM »
Огромное спасибо, всегда обходился без массивов. Теперь думаю, зря. Надо и их освоить.

dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #12 on: January 14, 2016, 06:48:42 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

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

dmutruk

  • Освоившийся
  • **
  • Posts: 40
    • View Profile
Re: Помогите с ботом для покера.
« Reply #13 on: January 14, 2016, 06:53:04 PM »
Все таки нужно делать шаблоны и смотреть сколько недостающих карт до комбинаций. И просматривать не 1 шаблон, а все 9 , так как игровых комбинаций 9, не учитывая просто Кикер.

Doda

  • Guest
Re: Помогите с ботом для покера.
« Reply #14 on: January 14, 2016, 07:18:40 PM »
Quote
17:45:20 подряд идущих карт: 1
выдает такой результат потому что  в прошлой ситуации   был стрит и выход из цикла при стрите. а щас выдает в лог последнюю комбинацию