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

    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] Проект был заморожен через несколько месяцев после публикации поста. Причина в том, что не смотря на положительные отзывы сообщества, реальных пользователей у сервиса появилось всего несколько десятков, да и те очень быстро перестали обновлять своё решение. Если вам было бы интересно возобновить проект, напишите мне в ЛС, я был бы рад передать его в хорошие руки.
    Поделиться публикацией
    Комментарии 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
                                                        тоже приходила такая идея

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

                                                        Самое читаемое