Пилю программку по обсчёту китайского покера

Последний пост:26.11.2023
22
1 2 3 4 22 38
  • Всем привет!
    Поигрываю в китайский, но всегда интересовало точное решение. В связи с этим запустил C++ Builder и решил немного поиграться.
    Так как не запускал его достаточно давно, пропустил переход С++ на С++ 11 (и тем более 14). Но, делать нечего, пока поработаем на старом.
    Конкретно эту тему решил завести для того, чтобы отслеживать, что получилось, а что нет. Так как выбранную логику по мере обкатки приходится переписывать чуть ли не заново, здесь я буду вести учёт своим успехам\неудачам(под новую логику приходится переписывать весь код и один раз я уже забыл, как работает предыдущий )
    Итак, версия 1.0
    - Колода и рука представляют собой символьные строки. (Мастей нет)
    - любая линия(5ти или 3ех карточный набор) представляет из себя какую-либо комбинацию(2 пары, старшая карта и т.д.)
    - Ход осуществляется как выборка 3ёх произвольных карт из колоды и нахождения совокупности всех возможных раскладов по линиям.
    Ну, тут какие достижения. 2 подьёма прожка считает за секунды, 3 подьёма уже за около 4 минут.
    Ясно, что посчитать на ней стартовый расклад не удастся(да там и памяти не хватит)
    Версия 2.0 (в работе)
    - для комбинаций введён ранг(старшинство при сравнении одинаковых по значению). Мастей по-прежнему нет
    - для стартового набора введено понятие потенциала(для 2ух линий это все возможные руки, где комбинация внизу существует и старше комбинации выше).
    - также на каждом подьёме считается вероятность собрать фантазию.
    - на каком-либо подьёме придётся сделать выбор: сделать упор на сбор фантазии ИЛИ сосредоточиться на "сборе" очков. В конечном итоге это будет тоже самое ЕВ, но можно будет сделать отсечку вручную
    Планируется
    - для класса "рука" ввести функцию (метод) проверки "жива ли рука"
    - Жёстко связать колоду и руку игрока(руки игроков). Сейчас они связаны вручную.

    Ну, и наконец пример. Как логика на стадии проектирования даёт сбой. Я уже писал, что мастей пока нет. Но нет также и истории развития партии. Как планировалось определить лучшее разложение, ну скажем, 3его подьёма? Планировалось найти все варианты завершения руки, вернуться обратно и в отсортированном массиве найти 2 карты и 2 места, куда их следует положить. Однако, так как истории нету, то возможность отличить, на 2ом подьёме положена 7ка или на 5ом нет(ведь это могла быть 7ка, которую мы положили, а может быть вновь пришедшая, если мы в рассматриваемом подьёме её сбросили). Соответственно, и возвращаться некуда.
    Буду благодарен за вашу подсказку, как решить эту проблему.
    Пока на ум приходит только каждую руку рассматривать как {разложение стартового набора} +..+{разложение i-ого набора}
    Вот только не придётся ли в итоге всё равно перейти к просто руке, неважно каким именно путём она была собрана.
    Да, и пример.
    Для данной руки я считал расклад с наибольшим ЕВ



    пришли сброшены
    ясно, что можно положить либо туз вниз для стрита, либо надеяться собрать 2пары+ на
    ЕВ туз вниз получилось 1.57 очка
    ЕВ тув в топ - 0.64
    Если кто подтвердит цифры, буду премного благодарен.
    Ответить Цитировать
    3
  • Продолжаем поиск оптимального разложения старта...пока, правда, на бесконечной колоде, но этот расчёт понадобится, чтобы было с чем сравнивать.
    И сразу возникла забавная ситуация, пришлось даже искать "ошибку"...
    Казалось бы, расклады
    и
    _______ равноценны по ЕВ(точнее по шансам собрать фантазию QQ+ в топ)
    Но нет, выяснилось, что собрав или в мидл, в первом варианте нас устроят или пара старше вниз, а во втором - только (ну, и опять же пара старше)
    По-прежнему стоит задача сохранить историю "ходов", то есть, грубо говоря, хранить информацию, какая карта на каком подъёме была положена на ту или иную линию. Может кто подсказать? Пока какие-то громоздкие варианты в голову лезут
    Ответить Цитировать
    1
  • Так, промежуточные итоги по обсчёту стартера.
    Для выходит

    ,
    а для уже


    Может кто-нибудь привести правильный расклад?
    Ответить Цитировать
    0
  • St_CasTieL, благодарю

    Удалось найти ошибку(опечатку)
    Теперь оба расклада прога кладёт "одинаково":


    и




    Считает около 6 минут(что достаточно затрудняет отладку, ну да ладно).
    Прошу кого-нибудь подкинуть расклад с точным решением.
    Ответить Цитировать
    0
  • 5 вопрос отсюда https://forum.gipsyteam.ru/index.php?viewtopic=124886&view=findpost&p=5843438

    уверенно, всего за 3 минуты, положила



    видимо, не боится стрита старше.
    Ответить Цитировать
    0
  • fergus_crowley,
    Цитата (fergus_crowley @ 15.1.2019)
    есть подозрение, что она кладет их одинаково неправильно

    Прошу тебя, дай стартер и 100% правильный расклад
    Цитата (fergus_crowley @ 15.1.2019)
    плюс, я так понимаю, привязки к картам оппонентов нет?

    почему нет? конечно же есть. Просто пока не включается, так как оппонентов нет
    Ответить Цитировать
    2
  • fergus_crowley,
    Цитата (fergus_crowley @ 15.1.2019)
    каким образом учитывается? допустим, в обоих случаях оппами заиграны две двойки, каким образом программа это учтет?

    конкретно для стартера: 22 будут убраны из колоды, из которой проводится набор. Другое дело, что в программе используется упрощение: низ и середина заполняются независимо(подьём за подьёмом) друг от друга. ТО есть, о заигрывании 9 внизу мидл об этом "знать" не будет - он будет считать, что ему по-прежнему доступна колода с 9ой(но без двоек). Но это вызвано лишь невозможность точного расчёта: такое огромное кол-во комбинаций не обработать.
    Цитата (fergus_crowley @ 15.1.2019)
    возможно, конечно, меня поправят старшие товарищи, но двойка в обоих случаях должна лежать внизу

    Хороший вопрос. Но на текущий момент я исхожу из следующей гипотезы: на каком-то подьёме есть ЕВ очков, набранных на 2ух нижних линиях и есть ЕВфантазии. При каком-то ЕВ(своего для каждого подьёма?)очков становится малым по сравнению с ЕВфантазии и упор нужно сделать на неё(возможно, в ущерб очкам на 2ух нижних линиях). Конечно, иногда они пересекаются, например даму можно заиграть в стрит или флеш. Тут из двух зол надо выбирать меньшее - на то она и гипотеза, чтобы её проверить.
    Ответить Цитировать
    1
  • Удивительным образом решилась проблема с подсчётом вероятности фантазии.
    Сначала я предполагал использовать ручные формулы с числом перестановок... но библиотечная функции для этих
    самых перестановок нет, а рекурсивная функция для факториала...ну, такая себе...спотыкается уже на 15
    почему-то заработал вот такой вариант
    //придёт N карт из колоды с М карт
    double abs_fantasy(int kings_top, int kings_left, int N, int M)
    {
    if(kings_top >= 2)
    return 1.0;
    if(N <= 0)
    return 0.0;
    //пришёл король
    return kings_left/(double)M*abs_fantasy(kings_top+1,kings_left-1,N-1,M-1)+
    //не пришёл король
    (M-kings_left)/(double)M*abs_fantasy(kings_top,kings_left,N-1,M-1);

    };

    то есть abs_fantasy(0, 3, 6, 44) = вероятность собрать не менее пары королей за 2 подьёма из 44 карт с 3 королями =
    = 0,0445
    Проверять не надо, я уже проверил по аналитической формуле
    Ответить Цитировать
    0
  • Wall-e0605,
    Цитата (Wall-e0605 @ 16.1.2019)
    Ты пользуешься своей супер прогой, я бесконечной чуйко-прухой.

    Обязательно бахнем. И не раз. Но потомчуть попозже
    Ответить Цитировать
    2
  • касательно c00l0ne...я так понял, программки у него нет(поправьте, если ошибаюсь). Посмотрел его стрим, буквально каждая раздача - гадание на кофейной гуще.

    пока что удалось посчитать вероятность собрать фантазию на QQ или КК. Но, увы, пока только при 3ёх свободных местах в топе. Продолжаю отладку...
    double abs_fantasy( int queens_top, int queens_left, int kings_top, int kings_left, int N, int M)
    {
    if(queens_top == 2 || kings_top == 2)
    return 1.0;
    if(N <= 0)
    return 0.0;
    if(queens_left == 0 && kings_left == 0)
    return 0.0;

    //bool v;


    //ничего не пришло
    return (1.0 - (queens_left+kings_left)/(double)M)*abs_fantasy(queens_top,queens_left,kings_top,kings_left,N-1,M-1)
    //пришёл король
    +kings_left /(double)M *abs_fantasy(queens_top,queens_left,kings_top+1,kings_left-1,N-1,M-1)
    //пришла дама
    +queens_left /(double)M *abs_fantasy(queens_top+1,queens_left-1,kings_top,kings_left,N-1,M-1);
    }

    При двух подьёмах из 15 карт с 3мя дамами и 3мя королями вероятность = 0,6056, что близко к Х2 от фантазии только на 3ёх королях.
    Ответить Цитировать
    1
  • Так, с подсчётом вероятности собрать фантазию вроде разобрались...
    Теперь попробую скрестить ужа с ежом. А именно, так как максимизировать кол-во очков сразу для всей руки я не могу(все комбинации не перебрать), попробую минимизировать "ущерб" от (дельта ЕВочков и дельта ЕВ фантазии)
    грубо говоря, в раскладе



    2ка сверху снижает вер-ть фантазии(на или ) с 59% до 35%, ну, а двойка хоть и наносит "ущерб" ЕВ очкам, но не такой сокрушительный. Следовательно, если мимимизировать "суммарный ущерб", 2ка в топ идти не должна
    Ответить Цитировать
    0
  • Цитата (Wall-e0605 @ 17.1.2019)
    БиллиУбили, да не, 2ке в топе самое место. трипс собрать можем - считай тоже фантазия


    Цитата (Bolshewik @ 18.1.2019)
    Я в угаре , с помощью СВОЕЙ проги решил , что должна быть в топе , но с помощью СВОИХ же вычислений ей там не место

    А что, программка должна сразу полный функционал использовать? когда я клал двойку наверх, я не рассматривал фантазию(верхнюю линию) и по расчётам выходило, что она наносила "вред" и нижний линии, и средней.
    Если подключить подсчёт(учёт) фантазии, то ясно, что 2ка в топе наносит больший урон. Если определить урон, как потерю общего ЕВ руки(опять же рассматривая заполнение линий независимо друг от друга).

    2All
    Думал я, думал, как склеить подьём(3 карты) и текущую руку...и что-то муторно выходит. Ведь мало того, что 3 приходящих карты зависят от колоды, то ещё и существует N способов их разложить. Поэтому просто сохранять руку и подьёмы вместе бессмысленно - это ничего не даёт.
    Рассмотрим такую ситуацию:



    пришли
    выбор несложный: положить 2ку в мидл и либо класть вниз в расчёте на стрит, либо надеяться собрать внизу трипс или 2пары.
    Как можно было решить эту задачу?
    Перебрать все варианты расклада , получить все(новые) возможные 3ёхкарточные наборы из колоды, снова перебрать все варианты расклада, но уже для окончания руки. Найти для всех возможных рук ЕВ, обратным поиском найти ЕВ всех вариантов расклада и выбрать из них максимальный.
    Но можно и по-другому.
    Хотя вариантов конечных "живых" рук много, они всё же конечны. Тогда можно назначить их вершинами графа, а рёбра, связывающих их с незаконченной рукой, будут соответствовать наборам карт, которые могут придти за оставшиеся расклады.
    Тогда ЕВ незаконченной руки будет сумма всех путей(вероятности) до всех вариантов конечных рук(для них ЕВ твёрдо и чётко посчитано).
    Тогда как же определить, как разложить ?
    надо сравнить пути от промежуточных вершин(вариантов расклада) до конечных рук. Естественно, эти пути(вероятности) будут меняться в процессе заигрывания карт из колоды...но свой выбор мы будем делать на основании текущей "информации". То есть, если путь для стрита короче - мы будем класть А вниз, если короче путь для (трипс или 2 пары+ внизу) - не будем класть.
    В данном примере мы уже никак не успеем среагировать на выход королей из колоды и поедем по старым рельсам.

    ЗЫ да, внизу ещё возможен стрит на 89, но я опустил этот факт для простоты описания.
    ЗЫ2 Количество промежуточных вершин тоже конечно. Более того, некоторые сразу приводят к скупу.
    Ответить Цитировать
    0
  • Так, новости такие. От графа пока откажемся, слишком мало кода в интернете, все почему-то выходят на матрицу смежности, что как-то не солидно. Ну, да ладно.
    Удалось развить функцию, находящую вероятность завершить строку(до этого аналогичная считала вероятность собрать фантазию в топе).
    Теперь функция работает с полным перебором колоды, ей не надо напрямую сообщать кол-во оставшихся карт того или иного достоинства.
    Для задачи "имеем колоду, из которой последовательно(по одной) вытаскиваем М карт, каждый раз мы можем либо оставить(добавить) карту к уже имеющимся в линии, либо сбросить. Найти вероятность собрать перечень комбинаций.

    Псевдокод такой.
    1. Имеем линию для завершения, например
    2. Определяем успешные комбинации, например , и т.д.
    3. Для каждого шага и для каждой карты из колоды у нас 2 альтернативы: либо оставить карту, либо сбросить.
    4. Введём дополнительную функцию, которая считает полную вероятность собрать комб. из п2, с колодой без карты из п3, для случаев, когда мы её добавили и когда сбросили. Она нужна для того, что если пришла на первом подьёме(осталось ещё 3), то может быть выгоднее её сбросить, чем положить. Так как для какой-то конкретной колоды вероятность закончить стрит за оставшиеся "подьёмы" может быть ниже, чем собрать 2пары.
    5. Для п.3 вызываем доп. функцию и решаем: оставлять(добавлять) карту или скидывать.
    6. Повторяем п.5 для уменьшенной на 1 карту колоды
    7. Выход из функции по 2 условиям: либо (какая-то)комбинация собрана, либо мы израсходовали все "подьёмы".

    Доп. функция
    написана с помощью рекурсии, но можно и циклами.

    // FP - колво свободных "мест"
    double complete_p(std::string d, std::string s, int FP)
    {
    std::string foo, foo2;
    double t;
    std::sort(s.begin(), s.end());


    if(s == "45678" || s == "34567" || s == "56789" )
    //|| s == "56777" || s == "56766" || s == "55567")
    return 1.0;
    if(s == "56777" || s == "56667" || s == "55567")
    return 1.0;
    // else if(s == "56677" || s == "55667" || s == "55677")
    //return 1.0;
    else if (s.length() == 5)
    return 0.0;
    if(s.length() == 4 && FP== 1) //кладём любую пришедшую карту
    {
    for(int i=0; i < d.size(); ++i)
    {foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    t = t + 1.0/(double)d.size()*complete_p(foo2,foo,FP-1);
    }
    return t;
    }
    //} while(d.size() >0);
    if(s.length() == 3 && FP== 2) //кладём любую пришедшую карту
    {
    for(int i=0; i < d.size(); ++i)
    {foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    t = t + 1.0/(double)d.size()*complete_p(foo2,foo,FP-1);
    }
    return t;
    }
    };


    // M - колво подьёмов по одной карте
    double fill_p(std::string d, std::string s, int M)
    {
    std::string foo, foo2;
    double t =0.0;
    std::sort(s.begin(), s.end());


    if(s == "45678" || s == "34567" || s == "56789" )
    //|| s == "56777" || s == "56766" || s == "55567")
    return 1.0;
    if(s == "56777" || s == "56667" || s == "55567")
    return 1.0;
    //else if(s == "56677" || s == "55667" || s == "55677")
    //return 1.0;
    else if (s.length() == 5)
    return 0.0;

    //кладём или не кладём?
    if (s.length() == 4 && M == 1)
    {
    for(int i=0; i < d.size(); ++i)
    {
    foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    //кладём по-любому
    t = t + 1.0/(double)d.size()*fill_p(foo2,foo,M-1);
    }return t;
    }
    //тоже кладём по-любому
    if (s.length() == 3 && M == 2)
    {
    for(int i=0; i < d.size(); ++i)
    {
    foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    t = t + 1.0/(double)d.size()*fill_p(foo2,foo,M-1);
    }return t;
    }

    if ( M > 2 && s.length() == 3)
    {for(int i=0; i < d.size(); ++i)
    {
    foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    if (complete_p(foo2,foo,1) >= complete_p(foo2,s,2))
    t = t + 1.0/(double)d.size()*fill_p(foo2,foo,M-1);
    else
    t = t + 1.0/(double)d.size()*fill_p(foo2,s,M-1);
    }
    return t;
    }

    if ( M >= 2 && s.length() == 4)
    {for(int i=0; i < d.size(); ++i)
    {
    foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    if (complete_p(foo2,foo,0) >= complete_p(foo2,s,1))
    t = t + 1.0/(double)d.size()*fill_p(foo2,foo,M-1);
    else
    t = t + 1.0/(double)d.size()*fill_p(foo2,s,M-1);
    }
    return t;
    }
    };

    Перехожу к отладке подьёмов из 2 карт{можно положить 0, 1 или 2карты}
    Ответить Цитировать
    0
  • Цитата (Bolshewik @ 23.1.2019)
    БиллиУбили, пока ты тут херней теорией занимаешься другие на практике плюсуют и неплохо.

    молодцы, чо
    Ответить Цитировать
    0
  • Так, ну новости какие. Убил 4 или 5 дней на ловлю ошибку. В рекурсивном вызове функции я не вводил новую переменную, и поэтому в цикле она передавалась раз за разом. Я уж грешил на std::string, но всё оказалось проще (смайлик, вытирающий пот со лба).
    Да, рекурсивную функцию удалось расширить до подьёмов из двух карт(можно положить 0,1,2 карты). Для колоды из 20 карт считает около минуты. Теперь можно переходить к тестированию подьёмов из 3ёх карт.

    Цитата (diklee @ 25.1.2019)
    Попробуй посчитать точный шанс на, то что комбинация не сгорит

    Наоборот. Подсчёт шансов бессмысленно считать дальше, когда на каком-то подьёме он обратился в 0(и дальше, естественно, "улучшиться не может". Пока я подсчёт не обрубаю.
    Спасибо за поддержку.

    Цитата (c00l0ne @ 26.1.2019)
    гадаю я по кофейной гуще в ананас хорошо , всегда готов против твоей проги на 5-10к руб сыграть ...

    ну, извини, я смотрел всего ОДИН стрим с тобой. И всего 2-3 раздачи. Каждый раз ты ГАДАЛ, как бы положить. И более того, прокручивал раздачу до конца и делал совершенно неправильные выводы "вот, значит на 2ом подьёме надо было играть по-другому", что говорит о том, что ты не знаешь, как было ПРАВИЛЬНО играть 2ой подьём. Так как это знание не зависит от того, что тебе пришло на следующих подьёмах в конкретной "раздаче".
    Цитата (c00l0ne @ 26.1.2019)
    еще если тебе интересно я писал софт для генерации формул

    видео недоступно
    Цитата (c00l0ne @ 26.1.2019)
    с помощью них можно полностью решить китай, но нужны мощностя суперкомпа... + тонны времени на программирование...

    Если у тебя есть какая-то задача и ты посчитал для неё абсолютно точное решение - выкладывай. Сравним ответы.
    Цитата (c00l0ne @ 26.1.2019)
    пс прочитал выше размышления и путь решения ... могу поставить 50 баксов что софт не получится...

    Согласен, решить задачу класса NP не так уж и просто.
    Ответить Цитировать
    0
  • Цитата (diklee @ 29.1.2019)
    Я про часный случай, где мы решаем с тузом ити на гатшот или раннер раннер две пары. Там есть четкая вероятность собраться или сгореть.

    Я писал про работу алгоритма. На каждом подьёме он сравнивает шансы завершить руку(линию) для 3 вариантов разложения подьёма и выбирает максимальный. Но они все могут быть равны 0. Значит алгоритм максимальным выберет первый попавшийся. И продолжит "считать" дальше. Хотя уже тут его можно было бы оборвать. Но ИРЛ это соответствует гарантированному скупу на предпоследнем подьёме. Достаточно редкая ситуация и лучше ничего в работе алгоритма не трогать.
    Ответить Цитировать
    0
  • c00l0ne, я говорил про стрим, где ты разбираешь раздачи, а не играешь. У тебя было овердохуя времени, чтобы разобраться, а не гонять подьёмы туда-сюда. Дай ссылку на твой стрим, где ты, по твоему мнению, оптимально кладёшь
    Ответить Цитировать
    0
  • уфф...удалось ввести подьём по 3 карты(кладём 0,1 или 2 карты)
    Для линии из 3 карт время расчёта по сравнению с подьёмами по 2 карты(кладём 0,1 или 2 карты) увеличилось более, чем в 2 раза.
    Для колоды 25 карт:
    4.5 мин vs 2 мин

    Вероятность закончить комбинацию уменьшилась:
    0.172 vs 0.184

    Теперь жду ваш совет, что делать дальше:
    подрубать 2 линию или поработать надо оптимизацией алгоритма? Принимаю ваши комментарии до завтрашнего утра.

    поправка 3 карты(кладём 0,1 или 2 карты) -> 3 карты(кладём 1 или 2 карты)
    Сообщение отредактировал БиллиУбили - 30.1.2019, 19:48
    Ответить Цитировать
    0
  • diklee, ну, тут всё просто. Имеем незаконченную (руку)линию и какую-то колоду. Как нам посчитать вероятность закончить(собрать живую) руку за N подьёмов?
    Очевидно перебрать все варианты "замощения" и найти число успешных.
    Теперь имеем правило подьёма "берём одну карту и её кладём". Пространства для творчества 0, однако если колода позволяет(в ней есть нужные карты) рука таки закроется в Х% испытаний.
    Меняем правила, по которым осуществляется подьём. Мы берём 1 карту, но необязательно её класть, можно сбросить. Как понять, что на 5ом подьёме стоит выкинуть какую-то карту, а не положить? Надо сравнить две вероятности для двух "новых" рук(с картой ИЛИ без) за 5-1 = 4 подьёма.
    Снова меняем правила. Приходят 2 карты, положить можно обе, одну или 0. Как узнать, сколько класть? Сравнить вероятность собрать руку с добавленными картами(от 0 до 2) за число подьёмов, уменьшенное на 1.
    Правила можно поменять ещё раз. Приходят по 3 карты, мы обязаны положить (любые) 2. В алгоритме ничего не меняется принципиально, разве что колода начинает кончаться быстрее.
    Сорри, что обьяснил сумбурно. Посмотри, как решается задача https://ru.wikipedia.org/wiki/%D0%A5%D0%B0%D0%BD%D0%BE%D0%B9%D1%81%D0%BA%D0%B0%D1%8F_%D0%B1%D0%B0%D1%88%D0%BD%D1%8F, кое-что должно проясниться
    Ответить Цитировать
    0
  • c00l0ne, да, друг, ты недалеко от истины.
    Рекурсивное разложение споткнулось на колоде уже из 10 карт.
    Поэтому, возвращаясь к нашему примеру https://forum.gipsyteam.ru/index.php?viewtopic=142685&view=findpost&p=5960212
    мы не сможем перебрать все подьёмы(по 3 карты) до заполнения всех "пустых" ячеек. Это займёт огромное время.
    Поэтому попробуем план "Б". Сначала найдём все варианты из 6 карт, которые нас устроят: это, например ,, и т.д. А потом посчитаем вероятность собрать эти 6 карт из колоды двумя наборами. (некоторые варианты, которые нас устроят будет невозможно собрать, нужных карт просто не будет в колоде).
    Общее число вариантов вытащить 6 карт из колоды тоже считается.
    Ответить Цитировать
    0
1 2 3 4 22 38
2 человека читают эту тему (2 гостя):
Зачем регистрироваться на GipsyTeam?
  • Вы сможете оставлять комментарии, оценивать посты, участвовать в дискуссиях и повышать свой уровень игры.
  • Если вы предпочитаете четырехцветную колоду и хотите отключить анимацию аватаров, эти возможности будут в настройках профиля.
  • Вам станут доступны закладки, бекинг и другие удобные инструменты сайта.
  • На каждой странице будет видно, где появились новые посты и комментарии.
  • Если вы зарегистрированы в покер-румах через GipsyTeam, вы получите статистику рейка, бонусные очки для покупок в магазине, эксклюзивные акции и расширенную поддержку.s