Пользователь
0,0
рейтинг
1 мая 2012 в 17:12

Разработка → Веб-сервисы играют в покер

imageЗдравствуй, Хабр.

Меня очень привлекает спортивное программирование, а ещё я люблю покер. Поэтому я решил убить сразу двух зайцев, запустив турнир покерных ботов.

В отличие от других подобных мероприятий, программа участника может быть реализована в виде веб-сервиса, с которым «крупье» будет общаться через HTTP.

Изначальная идея проекта принадлежит моему другу (он не с Хабра). Первый раз она прозвучала примерно так:
Я считаю, что нет ничего дурного в том, чтобы боты играли в покер-румах. Хотя, может быть, честнее было бы организовать специальный покерный клуб, где роботы играли бы только друг с другом. Вот я бы с удовольствием написал такого бота. А ты?
Не помню, что я ответил. Мне интереснее было именно сделать такой сервис. Challenge accepted ;)

Движок


На забавной картинке чуть выше обозначены основные компоненты системы и их связи друг с другом. Отдельного комментария требует часть, связанная с покерным движком. Подходящий готовый движок мне найти не удалось, поэтому я написал небольшой (~1000 строк) python-пакет, который реализует логику покерного крупье и общения с ботами. К пакету прилагается простой unix-style интерфейс для генерации покерных раздач и их непосредственного проведения.

Движок ничего «не знает» про логику турнира, базу данных пользователей и т.п. Он выступает исключительно в роли «крупье» и возвращает результат своей работы в виде XML, содержащего конечное состояние данной раздачи.

Такая реализация даёт возможность использовать один и тот же движок как внутри покер-рума, так и на компьютере пользователя во время разработки/тестирования бота (то, что я называю SDK). Это гарантирует, что бот будет находится в одних и тех же условиях на тест-лабе пользователя и во время реальной турнирной игры, а также сокращает дублирование кода.

Исходный код движка опубликован на Гитхаб (лицензия MIT). Для использования в виде SDK под Windows собирается (с помощью py2exe) exe-шник с включенным python-интерпретатором. Под Linux и Mac SDK поставляется в исходных текстах и использует интерпретатор, установленный (по умолчанию) в операционной системе.

В текущей реализации движок поддерживает только одну версию покера — «Texas hold'em» с фиксированными ставками. Судя по википедии, это одна из самых популярных покерных игр в мире.

Я не стал делать SDK в виде веб-сервиса, чтобы пользователь мог запускать систему полностью локально. Таким образом можно написать сотни регрессионных тестов на бота и прогонять их очень быстро, хоть после каждого изменения. Причём для реализации такого сценария не нужно патчить исходники или писать собственный интерфейс к движку — всё работает из коробки «by design».

Сами тесты пишутся легко и приятно благодаря stateless API.

API


Если у меня есть выбор, я почти всегда делаю stateless API. В данном случае этот выбор был не столь очевиден, т.к. необходимо на каждом ходу передавать боту всю историю раздачи (это минимально-необходимая информация для принятия решения).

В текущий момент эта информация (я называю её «состоянием» раздачи) передаётся боту в формате XML с помощью HTTP POST запроса. В худшем случае этот XML может весить до 4КБ. Много это или мало — судить вам, но это та цена, которую я готов заплатить ради упрощения процесса разработки бота и снижения порога на вход для новых участников.

Разработка является действительно довольно несложной — участнику нужно просто написать программу, которая парсит некоторый XML, анализирует описанную в нём ситуацию и принимает определённое решение (пасовать, поддержать, повысить, пойти ва-банк и т.д.).

Схему XML-документа пришлось разработать самостоятельно.

Пример


<?xml version="1.0"?>
<game>
  <table button="2">
    <player sit="0" name="vbo"    stack="80" in_stack="100"/>
    <player sit="2" name="lenny"  stack="80" in_stack="100"/>
    <player sit="5" name="psycho" stack="90" in_stack="100"/>
  </table>
  <posts>
    <post amount="10" player="psycho" type="small_blind"/>
    <post amount="20" player="vbo"    type="big_blind"/>
  </posts>
  <betting>
    <round name="preflop">
      <action amount="20" player="lenny"  type="call"/>
      <action amount="10" player="psycho" type="fold"/>
      <action amount="20" player="vbo"    type="check"/>
    </round>
    <round name="flop">
      <action amount="0" player="vbo"   type="check"/>
      <action amount="0" player="lenny" type="check"/>
    </round>
    <round name="turn"/>
    <round name="river"/>
  </betting>
  <community>
    <card rank="Q" suit="H"/>
    <card rank="A" suit="H"/>
    <card rank="7" suit="S"/>
    <card rank="T" suit="S"/>
  </community>
</game>

Данная схема мне кажется довольно простой для понимания человеком (в том числе за счёт лёгкой избыточности, например, //player/@stack) и удобной для анализа роботом. В дополнение я планирую в ближайшее время сделать JSON-версию схемы — кому как нравится.

Для внутреннего представления раздачи движок использует расширенную версию схемы, где присутствует колода, для каждого бота указан его транспорт (URL и т.д.), карманные карты и т.д. Конечное состояние раздачи также включает в себя ноду «showdown», которая даёт понять, какой игрок выиграл и какие у него были карты (если ему пришлось вскрываться). В текущей реализации, конечное состояние раздачи видит только автор бота, когда просматривает статистику игр на сайте покер-рума.

Вся остальная информация передаётся (в случае HTTP-транспорта) в отдельных полях POST-запроса. Это сделано для того, чтобы можно было написать простого бота вообще без парсинга XML. К тому-же, такая реализация делает более удобным написание тестов — тестовый бот может вообще не парсить XML и действовать, например, рандомно или следуя простейшему алгоритму (в духе, «check/call any» или «bet/raise good cards»).

Для этого «крупье» также передаёт боту список действий, которые вообще возможно совершить в данной ситуации. Если бот совершает действие, которого нет в этом списке — его ответ рассматривается, как fold, а текст ответа (обычно, это stack trace исключения) записывается в логи на стороне покер-рума. На данный момент, я сам читаю эти логи и пишу участнику email, если бот ломается. Разумеется, в самое ближайшее время данный процесс будет автоматизирован ;)

Турнир


В состязаниях по спортивному программированию меня всегда очень расстраивает следующее:

  • Они не вовремя начинаются.
    Например, в последние выходные перед запуском большого проекта на работе.
  • Они заканчиваются в самый интересный момент.
    Например, когда я придумал гениальную идею, которая сделает мою программу ну совсем потрясающей.

Поэтому, я с самого начала решил делать основное состязание «бесконечным». Представьте себе реальный он-лайн покерный клуб для людей. Туда можно прийти в любой момент, закинуть деньжат, сесть за стол и отлично провести время. Можно совершенствовать свои навыки и садится за столы с более высокими ставками, а можно просто развлекаться игрой «на фантики» в свободное время.

Разумеется, сразу делать нечто подобное, только для роботов, я не стал — было бы очень обидно, например, после шести месяцев разработки осознать, что у сервиса слишком высокий порог на вход и я играю там в гордом одиночестве.

Поэтому для начала я запустил нечто вроде sandbox'а — турнира покерных ботов, к которому можно присоединиться в любой момент и получить представление об уровне своей программы на фоне других участников.

В начале каждого дня покер-рум составляет рейтинг участников турнира, на основе суммы «денег», которые им удалось выиграть (или пришлось проиграть) за предыдущие сутки. После этого баланс каждого пользователя устанавливается в ноль и соревнование начинается с начала. В рамках соревнования покер-рум старается обеспечить, чтобы все боты постоянно играли, причём, по возможности, с различными соперниками. В текущей реализации для этого используются следующие правила:

  • Если бот свободен, он сразу садится за первый попавшийся стол. При этом приоритет отдаётся столам, за которыми бот давно (или никогда) не сидел и столам с наименьшим количеством игроков.
  • Бот встаёт из-за стола, как только проиграется или сыграет за ним более N раздач. Последнее правило применяется, чтобы равные соперники не играли друг с другом до бесконечности.
  • Покер-рум поддерживает «оптимальное» число открытых столов — чтобы всем хватало и ещё оставались места, куда можно пересесть после факапа. Такое число линейно зависит от кол-ва активных игроков.

Алгоритмы, реализующие эти правила (на схеме это «Tournament worker») работают параллельно, асинхронно и совершенно независимо. Таким образом обеспечивается равномерность нагрузки на машину и постоянство кол-ва раздач на единицу времени. Также такая архитектура делает систему более масштабируемой.

Worker'ы, как и сайт, реализованы на PHP (у меня здесь больше опыта, чем в python'е) и работают с PostgreSQL базой данных. Для обеспечения параллельной обработки очереди столов используется pg_try_advisory_lock при выборке кандидатов. Не ручаюсь, что этот способ самый верный, т.ч. буду рад обсудить данный вопрос в комментариях.

Планы


Я пока не вижу смысла выкладывать исходники покер-рума в открытый доступ — код получился не слишком сложным и слишком привязанным к проекту. Вместо этого я сосредоточусь на улучшении «движка» (например, добавлю поддержку безлимитного покера), реализации API для «обучения» ботов (т.е. для получения результатов прошедших игр), а так же на разработке нового типа игры, в котором участники через отдельное API смогут сами управлять рассадкой за столы и выходить из-за стола по мере необходимости. В общем, смогут вести себя почти, как люди.

Также, я планирую сократить порог на вход для начинающих (или просто далёких от веб) программистов — дать возможность разрабатывать бота прямо в браузере на языке вроде CoffeeScript и тестировать его через специальный веб-интерфейс. Было бы просто замечательно сделать также некоторый визуальный редактор алгоритма. Конечно, он не обязательно должен давать абсолютные возможности, но это позволит пользоваться сервисом даже не-программистам, что очень полезно. На данный момент у меня нет идей, как сделать такой редактор, т.ч. если у вас они есть, пожалуйста, отпишитесь в комментариях.

Проект делается «just for fun», т.ч. сроки реализации всех этих «корованов» публиковать бесполезно. Судя по git log текущую реализацию я начал делать в начале февраля. Из этого можно сделать выводы о моей скорости.

Если читателю интересно поиграть — бета версия покер-рума работает здесь. А на youtube можно посмотреть короткое видео о том, как сделать простейшего бота на PHP, протестировать его и зарегистрировать в турнире.

UPD [31.05.2013] Проект был заморожен через несколько месяцев после публикации поста. Причина в том, что не смотря на положительные отзывы сообщества, реальных пользователей у сервиса появилось всего несколько десятков, да и те очень быстро перестали обновлять своё решение. Если вам было бы интересно возобновить проект, напишите мне в ЛС, я был бы рад передать его в хорошие руки.
Бородин Вадим @vbo
карма
38,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (51)

  • +4
    Ух как интересно! Ушел писать бота.
    • 0
      Ок. Если будут возникать вопросы — напишите мне, я постараюсь дополнить информацию на сайте и в статье.
      • 0
        Хорошо, спасибо!
  • +3
    Отличная идея! Если получится найти время, обязательно поучавствую
    • +2
      поучаствую*
  • 0
    Самое интересное начнётся, когда вы добавите поддержку NL :)
    Постараюсь что-нибудь придумать интересное и запустить в к вам парочку агромакак.
    • 0
      В «движке» поддержка будет совсем скоро. Мы сейчас обсуждаем, как сделать поддержку на сайте — скорее всего, будет два раздельных турнира — лимитный и безлимитный. И нужно будет создавать отдельного бота для каждого турнира. Конечно, реализация бота может быть одной и той же, просто статистика на стороне покер-рума должна вестись раздельно.
    • 0
      Ага, а потом Стад или PLO8. Под FL я когда-то писал бота, он даже оказался около-нулевым (слабоплюсовым с RB), но только для кеш-хедзапов. С какой стороны подступаться к NL, да еще и зная что играть будем против ботов, а не живого оппонента я пока не придумал. Разве что сначала интенсивно собирать статы, а потом пытаться играть по ним, рядовой бот вряд-ли будет сильно отклоняться и менять манеру игры. Т.е. тупо забить на математику и играть по оппоненту. Для HU может и сработает, но для 6-max и 9/10-max не прокатит однозначно. А форматы столов я в анонсе не разглядел.

      З.Ы.: реквестую PLO8 и FL/PL Стад. В них побольше влияние метматики, проще будет писать ботов тем кто не разбиратся в покерных стратегиях.
      • 0
        Написать слабоплюсового бота на микролимиты несложно. Такие боты гриндят по 30 столов с 7/7 :) А вот придумать что-нибудь более лузовое и не уйти в минус уже интереснее. Анализ статов бота это да, приличная дистанция у них набирается быстрее, а значит можно будет делать прямые выводы о логике игры оппа. Пока его создатель не поменяет код. Хотя статы можно сбрасывать раз в день. В общем, тема очень интересная.
        • 0
          Меня в то время больше интересовала возможность интеграции с клиентами различных сетей. Собственно уже много лет барахтаюсь по работе в оклопокерной тематике и лично для себя сдела вывод что написать толкового бота в одиночку, да еще и в ограниченные сроки, практически нереально. Для микролимитов оно туда-сюда, но овчинка выделки не стоит, а для лимитов повыше примитивной логикой уже не отделаться, а значит трудозатраты опять вырастают за рамки разумного. В общем «жизнеспособный в реальных условиях бот» это задача не для меня. А вот в песочнице поиграться было бы весьма интересно :)
  • –8
    Куда катимся, скоро боты будут ходить за нас на работу. А также на турнирах по покеру можно будет выставлять ботов. С такими темпами недолго и до массового производства ботов для покера, да, и для других игр. А вообще идея сильная.
    • +9
      Можно не беспокоиться до тех пор, пока боты не начнут писать собственных ботов для выполнения всяких рутинных задач.
      • 0
        А 29 августа 1997 года осознают себя (с)
  • +2
    1. Сколько бот играет рук за сутки? Этих рук достаточно, чтобы фактор дисперсии был близок к нулю?
    2. Когда будет нл? Бот для лимитного покера не интересно писать, лимитный покер можно полностью описать математически, в результате через пару месяцев просто будет играть толпа «идеальных ботов».
    • 0
      1. В текущий момент установлено значение в ~4500 рук в сутки.
      2. Думаю, где-то через месяц. Но не обещаю ;)

      через пару месяцев просто будет играть толпа «идеальных ботов»

      Я очень сомневаюсь, что всё будет именно так. Но если так — то десятки людей получат отличный опыт. А к этому времени я как раз сделаю безлимитную версию.
    • 0
      Поговаривают, что на микролимитах FL сейчас и так одни боты играют… Так что можно смело искать баги в этих ботах и писать своих, которые будут их обыгрывать :)
    • 0
      лимитный покер можно полностью описать математически
      Да-а-а?
      image
  • +2
    1/ Лимитный покер полностью не описан еще, зайдите на сайт покерстарс и понаблюдайте за игрой на высоких ставках
    2/ Рассмотрите возможность реализовать турнирный покер. Что-то типа «Sit and go»,
    т.е. каждый игорк вносит опр. одинаковую сумму денег — байин, и получает какое-то количество фишек. Игра начинается по-мере заполнения одного или нескольких столов участниками, и ставки растут каждые несколько минут.
    Участник проигравший все фишки выбывает. Участник собравший все фишки считается победителем.
    Приз — деньги внесенные всеми участниками, делятся между первыми неск. местами, пропорционально месту: например: 50%, 30%, 20%.
  • +8
    Несколько комментариев.

    1. Жизнено необходимо сделать выгрузку статистики в стандартные форматы — я абсолютно не представляю как можно анализировать игру бота без инструментов типа holdem manager или poker traker
    2. 4500 рук в сутки плюс сброс статистики раз в день — это ни о чем.

    Ну начнем с того что 4,5к рук в день — это дневная норма (две трех часовых сесиии) для обыкновенного (не гриндера) игрока.

    Ну или математически — если наш бот имеет теоритическое премущество в +0.5 ptbb/100 над полем — и std dev в 40 ptbb (достаточно обычное значение) — то только через примерно 600к рук мы можем говорить что с вероятностью 95% этот бот хотя бы плюсовой. При +2.5 ptbb/100 (ничего себе премущество — можно говорить о том что он рвет поле) — при 25к рук можем говорить о том что мы плюсовые с вероятностью о пять же в 95%. А если нам нужно три сигмы — то уже совершенно другие числа.

    Тут можно поигратся со сзначениями — но порядки останутся такими же.

    Поэтому 30к рук должны отыгрыватся минут за 10-25, а в сутки должно наигрываться не менее 500к рук. И статистика не должна сбрасыватся — иначе как отслеживать динамику.

    3. Далее — вам нужно сосредоточится (и граничить) типы столов — бот для hu, для 4-max, 6-max и 9/10 max отличается очень и очень сильно. Вам нужно будет сделать лиги и гарантировать, что игра не идет пока нету определенного количества игроков за столом.

    4. Опять же вам нужно выйграть — либо у вас боты играют аннонимно — т.е. вы не персонализируете дуригх ботов (и не можете собираться на них статистику) — либо разрешаете (тогда можно сразу сделать выгрузку данных — ибо все равно ее соберут на основе статистики рук). Если разрешаете — нужно думать что делать о ботах которые играют в нескольких экземплярах и обмениваются информаций о картах друг друга.
    Если за 20 ботов, 10-ть будут моих и будут знать о картах друг друга — у остальных шансов нет.

    Ну и много, много, много чего еще…
    • 0
      можно просто давать боту инфу о том, сколько всего народу за столом, не?

      столы с разным количеством игроков — интересная идея! можно увидеть, где какой алгоритм работает круче в зависимости от количества игроков.

      чтобы боты не могли обмениваться инфой друг с другом, нужно перекрыть им коммуникационные каналы.
      • 0
        можно и давать — но как тогда будут собиратся столы? т.е. вот есть 10 ботов которым нужен стол 6 макс — они сидят и ждут, и никто не содится за стол. Или например играют два бота в hu — к ним подсаживается третий, они двое встают и уходят?

        собственно не нужно ничего изобретать — нужно взять любой крупный покер рум и сделать аналогично.

        А как каналы то перекрывать — мы таки говорим о том что боты они локальные и общаются с сервером. Или предлагается выгружать ботов себе? Тогда как считать рейтинг?

        Хостить ботов у себя — ну я думаю тут серваки нужны не хилые. Последний бот который я видел работал с 140 гиговой postgress базой статистики :)
        • 0
          можно грузить их на сервер, и пусть там крутятся! По ощущению, нет смысла крутить ботов на клиенте — на i/o сервера назрузку уменьшить. Хотя хз, хз.
          • 0
            Тогда нужно на сервере считать и предоставлять статистику полную по каждому боту — начиная от банального процента 3-бетов и прочих базовых статистик, до таких как например — как процент чек-рейзов на терне при 4 флеш доске, в руках которых он был опен-рейзером на префлопе, и сыграл чек-кол на 3 флеш флопе.

            Либо все будут считать и хранить это сами — если конечно будут к вопросу подходить серьезно.
            • 0
              видимо можно делать разные лиги, в зависимости от того, сколько доступно инфы. Если инфы должно быть доступно много, то её нужнео где-то хранить. Значит нужно либо давать какой-то user space на диске (что накладно, ибо это будут тонны и мегатонны логов), либо хранить всё на клиенте.

              короче, есть о чём подумать))
    • +1
      Большое спасибо за комментарий.

      1. Жизнено необходимо сделать выгрузку статистики в стандартные форматы
      Обязательно сделаем.

      2. 4500 рук в сутки плюс сброс статистики раз в день — это ни о чем.
      Сейчас всё работает в крайне экспериментальном режиме. Мы должны подобрать оптимальную «скорость» игры по нескольким критериям.

      Например, 500К рук в день требуют, чтобы бот мог обработать около 6 рук в секунду (500К / 24 / 60 / 60). Каждая рука — 1..10 HTTP запросов. Мне кажется, для массового пользователя это многовато. Скорее всего, нужно реже обнулять рейтинг — например, раз в неделю. Но это тоже не очень хорошо, т.к. снижается динамизм.

      Вообще, рейтинг — это вопрос сложный. Скорее всего, текущую реализацию можно считать просто sandbox'ом. Он работает по определённым простым правилам и позволяет оценить уровень бота с некоторой погрешностью, которую мы будем всячески стараться снизить.

      3. <...> типы столов — бот для hu, для 4-max, 6-max и 9/10 max
      Конечная цель — сделать также, как у людей. Через определённое API можно будет открывать столы с различными параметрами (вроде NL, 4-max и т.д.), получать список открытых столов и какую-то дополнительную информацию (вроде кол-ва игроков за столом, "% flops seen" и т.д.). Через API можно будет подсесть за стол из списка, взяв с собой определённое кол-во денег из центрального баланса и т.д. Соответственно, вся власть будет в руках пользователей и их роботов. Играете только на маленьких столах и только с коротким стеком? Пожалуйста. Было бы с кем =)

      Я просто решил действовать итеративно — сначала простая песочница, получение фидбека, оценка аудитории, починка багов. А вот потом уже новые функции, которые позволяют сделать всё. Сегодня мне кажется, что большая часть аудитории не знает, что такое «процент 3-бетов». Но я не уверен и нужно просто пробовать.

      4. Про анонимность...
      Если боты — это веб-сервисы, то сбор информации об их стратегии может только ввести в заблуждение — автор ведь в любой момент может выложить совсем новую версию, которая играет совсем иначе.

      Насчёт «мультоводства» — спасибо, что указали. Надо думать. Как я понял, это распространённая проблема онлайн игр.
    • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Думаю тут нет проблемы с мультиботами.
      Сервис же для игры между ботами именно.
      Если вы запустили своих 10-ть ботов и они непобедимы, — респект!
      Но все в равных условиях ;-) Ничто не мешает остальным действовать также.
      • 0
        Вообще-то есть проблема с мультиботами.
        Допустим все сделали мультиботов, тогда преимущество получит тот, чьих ботов будет тупо больше за столом. А это уже не спортивно.
        • 0
          Не совсем так.
          Преимущество все-равно будет у более «умных» ботов.
  • 0
    очень круто! молодец!
  • –1
    Интересная идея. Историю раздачи можно отдавать в зависимости от поступившего запроса двумя способами:
    — полностью, где каждое изменение имеет уникальный ID + информация о игре
    — дельту относительно переданного в запросе ID
    Это с одной стороны уменьшит объем, с другой стороны чуть упростит обработку на стороне клиента, когда машине состояний будут скармливать новые сообщения об изменения в истории раздачи, а не все с нулевого момента времени.
  • –2
    Отличная идея, очень захотелось написать своего бота, но в покер никогда не играл. Подскажите, что почитать, посмотреть?
    • +1
      Игра на самом деле очень простая. Самый простой способ научиться — это поиграть «на фантики» в любом онлайн покер-руме. Если вы предпочитаете читать документацию — есть, например, вот такой документ.

      Ну а дальше можно почитать книжки. Например, такую.
  • 0
    штука интересная, могу серваком поделиться — имеется виртуальный Athlon64 с несколькими гигами памяти.
    • 0
      Большое спасибо за предложение. Я пока экспериментирую с облаками ;)
  • 0
    Помню, 5 дет назад на Топкодере был марафон, где нужно было писать бота, играющего в упрощённый «покер». Теория вероятностей, тесты со сбором статистики и дальнейшей оптимизацией стратегии… эх, ностальгия :) В том марафоне участвовало 450 человек, мой друг saarixx тогда занял 7-е место… а я аж 77-е :)
    Сейчас, к сожалению, нет времени таким заниматься.
  • 0
    Помню, 5 лет назад на Топкодере был марафон, где нужно было писать бота, играющего в упрощённый «покер». Теория вероятностей, тесты со сбором статистики и дальнейшей оптимизацией стратегии… эх, ностальгия :) В том марафоне участвовало 450 человек, мой друг saarixx тогда занял 7-е место… а я аж 77-е :)
    Сейчас, к сожалению, нет времени таким заниматься.
    • +5
      ой :(
  • –7
    Скажите пожалуйста какое ник придумать? Что то не понял.

    П.С я программист на C
  • +2
    Симпатишная диаграммка, в чем нарисована?
  • +4
    Победитель турнира отправляется на ПокерСтарс зарабатывать деньги.
    • 0
      Надевая очки google glass
  • 0
    Отличная идея, как любитель покера и программист, буду с интересом наблюдать за развитием вашего проекта! Спасибо =)
  • 0
    А вы не думали над расширением проекта на другие виды соревнований? Хотелось бы что-то вроде прошлогодней войны муравьев от Google, шахмат с туманом войны, в таком роде.

    Я, кстати, знаю аналогичный сервис tiles.nicollet.net/
    • 0
      Нет, пока только покер. Нужно фокусироваться, иначе ничего не получится ;)
  • 0
    любопытное начинание. мне вообще симпатичны люди, пишущие не только по работе, но и для себя.
    советую только всё-таки поставить определённые рамки и задачи, иначе действительно проект никогда не закончится.
    удачи)
  • 0
    А можно где-то узнать (вывести) сколько вообще ботов в онлайне?
    • 0
      На странице robopoker.org/rating/ отображаются все, кто сыграл хоть одну игру за прошедший контрольный период. Мне кажется, этой информации вполне достаточно.
      • 0
        Спасибо.
  • 0
    тоже приходила такая идея

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.