ИГРАЙТЕ В ЛУЧШУЮ СОЦИАЛЬНУЮ ИГРУ ДУРАК ОНЛАЙН В МИРЕ!

Думаю, ни для кого не секрет, что «Дурак» (далее это слово будет написано с маленькой буквы и без кавычек) — это самая популярная карточная игра в России и странах бывшего СССР (хотя и почти неизвестная за его пределами). Несмотря на свое название и довольно несложные правила, выигрыш в ней все-таки зависит больше от мастерства игрока, чем от случайного расклада карт (в английской терминологии игры того и другого типов называются соответственно game of skill и game of chance. Так вот — дурак в большей степени game of skill).

Целью статьи является написание простого ИИ для игры. Под словом «простого» подразумевается следующее:

  • интуитивно понятный алгоритм принятия решений (то есть, как следствие, никакого машинного обучения, в котором этот алгоритм скрыт глубоко «под капотом»);
  • отсутствие состояния (то есть, алгоритм руководствуется только данными на текущий момент времени, проще говоря, ничего не запоминает (например, не «считает» вышедшие из игры карты).

(Строго говоря, первый пункт уже не дает права такому ИИ называться искусственным интеллектомper se, а лишь псевдо-ИИ. Но такая терминология в разработке игр устоялась, поэтому ее мы менять не будем.)

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

Итак, начнем. Очевидно, что в дураке чем старше карта, тем выгоднее иметь ее в руке. Поэтому, построим алгоритм на классической оценке силы руки и принятии решения (например, о подкидывании той или иной карты) на основе этой оценки. Припишем картам значения, например так:

  • туз (A) — +600 очков,
  • король (K) — +500,
  • дама (Q) — +400,
  • валет (J) — +300,
  • десятка (10) — +200,
  • девятка (9) — +100,
  • восьмерка (8) — 0,
  • семерка (7) — -100,
  • шестерка (6) — -200,
  • пятерка (5) — -300,
  • четверка (4) — -400,
  • тройка (3) — -500,
  • и наконец, двойка (2) — -600 очков.

(Используем числа, кратные 100 для того, чтобы избавиться в расчетах от floating-point и оперировать только целыми числами. Для чего нужны отрицательные оценки, увидим ниже в статье.)

Козырные карты ценнее любых простых (даже козырная двойка бьет «обычного» туза), а иерархия в козырной масти та же самая, поэтому для их оценки просто добавим 1300 к «базовой» величине — тогда, например, козырная двойка будет «стоить» -600+1300=700 очков (то есть, как раз чуть больше, чем некозырной туз).

В коде (все примеры кода в статье будут на Kotlin) это выглядит примерно так (функция relativaCardValue() возвращает ту самую оценку, а RANK_MULTIPLIER — это как раз коэффициент, равный 100):

for (c in hand) {     val r = c.rank     val s = c.suit     res += ((relativeCardValue(r.value)) * RANK_MULTIPLIER).toInt()     if (s === trumpSuit)         res += 13 * RANK_MULTIPLIER     // еще не все, продолжение чуть ниже }

Увы, это еще не все. Важно также учесть следующие правила оценки:

  • выгодно иметь много карт одного достоинства — не только потому, что ими можно «завалить» соперника, но и с легкостью отбить атаку (особенно, если карты высокого достоинства). Например, в конце игры рука (для простоты положим, что здесь и далее козыри — бубны)

    $$display$$clubsuit 2 spadesuit 2 diamondsuit Q heartsuit Q clubsuit Q spadesuit Q$$display$$ практически идеальна (конечно, если соперник не пойдет под вас королями или тузами): вы отобьетесь дамами, после чего повесите сопернику погоны вручите ему пару двоек.

    а вот много карт одной (конечно же, некозырной) масти, наоборот, иметь невыгодно — они будут «мешать» друг другу. Например, рука

    $$display$$spadesuit 5 spadesuit J spadesuit A diamondsuit 6 diamondsuit 9 diamondsuit K$$display$$ очень неудачна — даже если соперник не «выбьет» у вас первым ходом козыря и пойдет картой пиковой масти, то все прочие подкинутые карты будут других мастей, и на них придется отдавать козыри. Кроме того, с большой вероятностью останется невостребованной пятерка пик — все козыри у вас достоинством выше пятерки, поэтому ни при каких обстоятельствах (если, конечно же, изначально не зашли картой младше) вам не удастся покрыть ею какую-нибудь другую карту — вероятность взять очень высока. С другой стороны, заменим валета пик десяткой треф, а козырную шестерку — тройкой:

    $$display$$spadesuit 5 clubsuit 10 spadesuit A diamondsuit 3 diamondsuit 9 diamondsuit K$$display$$ Несмотря на то, что мы заменили карты на более младшие, такая рука значительно лучше — во-первых, на трефовую масть не придется отдавать козыря (и можно будет с большей вероятностью использовать пикового туза), а во-вторых, если вы побьете какую-то карту вашей козырной тройкой, есть вероятность того, что кто-то кинет вам тройку пик (ибо особого смысла держать такую карту, как правило, нет), и вы «отоваритесь» пятеркой.

    Для реализации этих стратегий модифицируем наш алгоритм: Здесь мы считаем количество карт каждой масти и достоинства…

    /* бонусные коэффициенты в зависимости от количества карт одного достоинства - например, если нет ни оной карты какого-то достоинства или она только одна, бонусы не начисляются, а за все 4 карты коэффициент равен 1.25  */ val bonuses = doubleArrayOf(0.0, 0.0, 0.5, 0.75, 1.25) var res = 0 val countsByRank = IntArray(13) val countsBySuit = IntArray(4) for (c in hand) {     val r = c.rank     val s = c.suit     res += ((relativeCardValue(r.value)) * RANK_MULTIPLIER).toInt()     if (s === trumpSuit)         res += 13 * RANK_MULTIPLIER     countsByRank[r.value - 1]++     countsBySuit[s.value]++ }

    … здесь добавляем бонусы за них (вызов Math.max нужен для того, чтобы не начислять отрицательные бонусы за младшие карты — потому что в данном случае это тоже выгодно)…

    for (i in 1..13) {     res += (Math.max(relativeCardValue(i), 1.0) * bonuses[countsByRank[i - 1]]).toInt() }

    … а тут, наоборот, штрафуем за несбалансированную по мастям руку (значение UNBALANCED_HAND_PENALTY опытным путем установлено как 200):

    // считаем среднее количество карт некозырных мастей... var avgSuit = 0.0 for (c in hand) {     if (c.suit !== trumpSuit)         avgSuit++ } avgSuit /= 3.0 for (s in Suit.values()) {     if (s !== trumpSuit) {         // и вычитаем штрафы в зависимости от отклонения от этого среднего по каждой масти         val dev = Math.abs((countsBySuit[s.value] - avgSuit) / avgSuit)         res -= (UNBALANCED_HAND_PENALTY * dev).toInt()     } }

    Наконец, учтем еще такую банальную вещь, как количество карт в руке. В самом деле, иметь в начале игры 12 хороших карт очень даже неплохо (тем более, что кинуть все равно смогут не больше 6), а вот в конце игры, когда помимо вас остался только соперник с 2 картами, это совсем не так.

    // считаем количество оставшихся в игре карт (в колоде и на руках у игроков) var cardsInPlay = cardsRemaining for (p in playerHands)     cardsInPlay += p cardsInPlay -= hand.size // вычисляем, какая доля из них у игрока, и определяем величину штрафа (здесь MANY_CARDS_PENALTY = 600) val cardRatio = if (cardsInPlay != 0) (hand.size / cardsInPlay).toDouble() else 10.0 res += ((0.25 - cardRatio) * MANY_CARDS_PENALTY).toInt() return res

    Резюмируем — в полном виде функция оценки выглядит так:

    private fun handValue(hand: ArrayList, trumpSuit: Suit, cardsRemaining: Int, playerHands: Array): Int {     if (cardsRemaining == 0 && hand.size == 0) {         return OUT_OF_PLAY     }     val bonuses = doubleArrayOf(0.0, 0.0, 0.5, 0.75, 1.25) // for cards of same rank     var res = 0     val countsByRank = IntArray(13)     val countsBySuit = IntArray(4)     for (c in hand) {         val r = c.rank         val s = c.suit         res += ((relativeCardValue(r.value)) * RANK_MULTIPLIER).toInt()         if (s === trumpSuit)         res += 13 * RANK_MULTIPLIER         countsByRank[r.value - 1]++         countsBySuit[s.value]++     }     for (i in 1..13) {         res += (Math.max(relativeCardValue(i), 1.0) * bonuses[countsByRank[i - 1]]).toInt()     }     var avgSuit = 0.0     for (c in hand) {         if (c.suit !== trumpSuit)         avgSuit++     }     avgSuit /= 3.0     for (s in Suit.values()) {         if (s !== trumpSuit) {         val dev = Math.abs((countsBySuit[s.value] - avgSuit) / avgSuit)         res -= (UNBALANCED_HAND_PENALTY * dev).toInt()         }     }     var cardsInPlay = cardsRemaining     for (p in playerHands)         cardsInPlay += p     cardsInPlay -= hand.size     val cardRatio = if (cardsInPlay != 0) (hand.size / cardsInPlay).toDouble() else 10.0     res += ((0.25 - cardRatio) * MANY_CARDS_PENALTY).toInt()     return res }

    Итак, у нас готова функция оценки. В следующей части планируется описать более интересную задачу — принятие решений на основе такой оценки.

    Всем спасибо за внимание!

    P.S. Данный код является частью разрабатываемого автором в свое свободное время приложения. Оно доступно на GitHub (бинарные релизы для Desktop и Android, для последней приложение доступно и на F-Droid).

Игра Подкидной Дурак

Отличная новость: русская игра «Дурак с компьютером» бесплатно доступна в новом формате! Теперь помимо возможности играть в «Подкидного» по простым правилам, можно повысить свой навык открытой игрой и даже подсматривать карты соперника. Заинтригованы? Присоединяйтесь!

Добро пожаловать в игру «Подкидной Дурак с компьютером» — играть онлайн на русском языке без скачивания и регистрации игроков. Это русский симулятор игры в карты на двоих против искусственного интеллекта. И помимо очевидных плюсов игры в «Дурака с компьютером» (играть бесплатно онлайн без ожидания соперников), новую версию отличает возможность выбрать режим и подсматривать карты. Для начала напомним, как играть.

Правила «Подкидного Дурака с компьютером»

  1. Цель — избавиться от всех своих карт раньше соперника.
  2. Атака начинается с одной карты (или группы равных карт) и может быть продолжена противником, за счёт «подкидывания» любых одноранговых карт, сыгранных за ход.
  3. Если отбивающий кроет каждую карту той же мастью большего достоинства (или козырем), то ходит следующим (предварительно восполнив недостающие карты с резервной колоды).
  4. В противном случае атакующие карты должны быть взяты защитником, а право хода пропускается.
  5. Выигрывает тот, кто первым сбросил все карты.

Особенности игры в «Подкидного Дурака» против компьютера

По умолчанию запускается «Классический Дурак» — игра 1 на 1 с компьютером. Нажатие кнопки «Глаз» (в правом верхнем углу) открывает карты противника, запуская режим игры «Дурак против Балды», где вы, зная все карты соперника, можете предполагать очередность ходов.

В обеих режимах игры «Дурак с компьютером» разрешается пересматривать карты колоды. Просто щёлкните по резерву и узнаете, есть ли смысл избавляться от текущих карт. Как и в старой версии игры — «Дурак с Винни Пухом», каждая игра против компьютера сопровождается шутливыми комментариями соперника.

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

Говорят, каждый русский умеет играть в «Дурака». Наверняка это правда, но, если вы считаете свой навык игры недостаточным, нуждаетесь в компании или просто хотите скоротать время, попробуйте сыграть в «Подкидного Дурака с компьютером» прямо сейчас! Игра с виртуальным соперником гарантирует интересный опыт.

Программы для Андроид » Игры » Карточные и классические игры » Дурак Онлайн image Скачать

Дурак онлайн – карточная игра для мобильных Андроид устройств, в которой можно вызвать на соревнование реального человека. Задача каждого победителя оставить дураков с картами на руках.

Популярнейшая карточная игра, теперь поселилась в мобильном телефоне. Правила всё те же — избавься от карт и обыграй противника. Победитель получает вознаграждение — обе ставки. Азарт добавляется, когда колода играет в Вашу пользу.

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

Особенности игры Дурак Онлайн на Android:

  • удобный интерфейс;
  • возможность отмены случайно брошенной карты;
  • на выбор три варианта колод с разным числом карт: 52, 36, 24 карты в колоде;
  • в игре могут поучаствовать от 2 до 6 человек;
  • приватные запароленные игры;
  • бонусы, чаты, друзья, подарки;
  • классические правила: переводной дурак, подкидной дурак.

Скачать бесплатно Дурак онлайн на Андроид без регистрации и смс по прямой ссылке ниже.

Скачать Дурак Онлайн бесплатно [45.44 Mb] (cкачиваний: 6388)

  • Опубликовано: 09.01.2021
  • Текущая версия: 1.8.1
  • Версия Андроид: 4.1 и выше
  • Андроид маркет: открыть
  • Разработчик: R-Soft LLC
  • Язык интерфейса: русский

Похожие:

Главная / Игры Карты / Игры Дурак

Описание:

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

Похожие онлайн игры

  • Старый добрый дурак
  • Необычный дурак
  • Карточная на деньги дурак
  • Жестокий дурак
  • Дурак с вампиром
  • Дурак для девочек
  • Дурак для всех
  • Элитный дурак
  • Дурак по сети
  • Обновлено3-11-2019, 09:12
  • Версия1.7.9
  • ТребованияAndroid 4.0
  • ЖанрКарточные
  • Просмотров23 344
  • Google Play

+63Нравится12Не нравится

  • Оценок: 75
  • Комментариев: 5

Гости не могут запрашивать обновления!

Скриншоты

Знаменитая карточная игра добралась и до мобильных устройств на платформе Андроид. Дурак Онлайн позволяет сыграть с настоящими соперниками со всего света посредством сети Интернет. Правила здесь совсем не поменялись. Игроку нужно избавиться от всех карт быстрее оппонентов. Победитель забирает весь выигрыш или большую его часть, если в партии участвовало более двух человек.Всего в одной раздаче могут участвовать шесть человек. Ставки производятся при помощи виртуальной валюты. Игровые деньги можно как выигрывать, так и приобретать за реальные средства. Здесь есть несколько разновидностей «Дурака». Имеется подкидной и переводной вариант игры. Также регулируется количество карт в колоде: их может быть от 24 до 52. Приложение отлично оптимизировано. Приятная визуальная составляющая не отвлекает от процесса.Интерфейс интуитивно понятен, с ним разберётся любой пользователь. Есть возможность отправлять текстовые сообщения во время матча и просматривать глобальную таблицу рейтинга. Дурак Онлайн — отлично реализованная виртуальная версия любимой игры, которая поможет отдохнуть и скоротать вечерок. Установка игр и программУстановка игр с кэшемКак сделать скриншот

Скачать Дурак Онлайн на Андроид бесплатно durak-online-1.7.9-5play.ru.apk Скачать apk — 25,83 Mb

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий