Как создать игру в дурак онлайн
Карточная игра «Дурак» на двух M5Stack
Цель урока
Сегодня мы напишем сетевую карточную игру на двух игроков. Какую игру написать? Давайте напишем популярную карточную игру “Дурак”, цель которой — избавиться от всех карт. Подробнее о правилах Вы можете узнать здесь.
Немного теории
Последовательный порт — сленговое название интерфейса стандарта RS-232, которым массово оснащались персональные компьютеры, техника специального назначения, в том числе и принтеры. Порт называется “последовательным”, так как информация через него передаётся по одному биту, последовательно бит за битом. Обычные персональные компьютеры снабжены RS-232, а микроконтроллеры и M5STACK в том числе использует TTL.
RS-232 для передачи “0” использует напряжение от -3 до -25 В, а для передачи “1” от +3 до +25 В. В отличии от RS-232 в TTL для передачи “0” используется напряжение близкое к 0 В, а для передачи “1” рабочее напряжение интегральной схемы, как правило 3.3 или 5 В (рис. 2).
Рисунок 2. Разница напряжений между RS-232 и TTL
Для обмена данными через последовательный порт M5STACK используют цифровые порты ввод/вывода R0, R2 (RX) и T0, T2 (TX) (рис. 3), а также USB порт. Важно учитывать, что если вы используете функции для работы с последовательным портом, то нельзя одновременно с этим использовать порты 0 и 1 для других целей.
Рисунок 3. Правило подключения двух устройств через последовательный порт
Для работы с данным портом используют стандартный набор функций Serial из Arduino IDE https://www.arduino.cc/reference/en/language/functions/communication/serial/
Ознакомьтесь с понятием таблицы ASCII, с помощью которой кодируются символы в вычислительной технике: https://en.wikipedia.org/wiki/ASCII
Перечень компонентов для урока
- M5STACK (2 шт.);
- кабель USB-C из стандартного набора (2 шт.);
- цветные провода из стандартного набора.
Начнём!
Шаг 1. Приступим с самого главного — логотип
Давайте нарисуем логотип игры, который будет появляться на дисплее устройства при запуске игры. Для этого используем любой редактор, например MS Office Word и Paint (рис. 4).
Рисунок 4. Рисуем логотип игры в MS Office Word и Paint 🙂
Далее при помощи приложения из урока 1.2.1 http://forum.m5stack.com/topic/49/lesson-1-2-1-lcd-how-to-create-image-array конвертируем изображение в массив пикселей и получим файл logo.c, который подключим к скетчу.
Шаг 2. Создадим структуру колоды карт
По правилам игры используется колода, содержащая только 36 карт. По 6 карт выдается каждому игроку. Игровое поле рассчитано на 12 карт. Игрок может взять 10 карт, после чего проиграет. В игре карта имеет своё значение и масть, например 7. В программе карта имеет своё место: (в руках у игрока — поле игрока; в игровом поле; в использованной колоде; в неиспользованной колоде) и назначение: свободная карта, недоступная карта, карта козырная, карта игрока, карта противника. Сделаем структуру, которая содержит порядковые номера параметров. Колода карт представляет собой массив структур (рис. 5).
Рисунок 5. Структура карты и массив колоды карт
define playerAmount 6
Шаг 3. Напишем правила игры
Атака. Случай 1. Если в игровом поле нет ни одной карты, тогда игрок, который получил первое место в очереди может кинуть совершенно любую карту любой масти (рис. 5.1):
Рисунок 5.1. Можно сделать ход любой картой
Атака. Случай 2. Если соперник сделал ход на игрока, то игрок может отбиться картой такой же масти, но большего значения (рис. 5.2) или козырной картой любого значения при условии того, что последняя карта соперника в игровом поле не является козырной:
Рисунок 5.1. Соперник должен отбить карту игрока
Атака. Случай 3. Когда соперник отобьёт карту, то количество шагов станет равным и игрок сможет подкинуть ещё карты такого же значения, что имеется в игровом поле:
Бито/взять. Случай 1. Если у игроков одинаковое количество шагов, то игрок может отправить карты в отбитую колоду:
Бито/взять. Случай 2. Если у соперник сделал больше ходов, чем игрок, то игрок может забрать все карты с игрового поля себе:
Шаг 4. Нарисуем карты
Благодаря прекрасным стандартным функциям для работы со встроенным дисплеем из библиотеки M5STACK, рисование карт займет доли секунд и практически не займёт памяти устройства.
Лайфхак для пользователей Windows: попробуйте зайти в любой текстовый редактор и зажать на клавиатуре клавишу Alt и набрать одну из цифр от 3 до 6, после этого отпустить нажатые клавиши.
Шаг 5. Напишем анимацию движения карт
Шаг 6. Нарисуем игровой стол и меню
Шаг 7. Обновление графики
Дополнительные функции (например, drawPlayerId()) Вы можете посмотреть в полном скетче или написать собственные гораздо лучше 😉
Шаг 8. Напишем функции для приёма/отправки данных через последовательный порт
Рисунок 5.3
Функция отправки строки добавляет в конец строки полученной в качестве аргумента символ новой строки и отправляет её в последовательный порт. Потом пытается принять строку, содержащую в себе символ конца сеанса передачи данных. Если символ пришёл, то функция вернёт true иначе false.
Функция приёма строки в течении timeout (3000 миллисекунд) пытается принять строку, при этом очищая от мусора в начале до символа начала пакета. В случае неудачи возвращает пустую строку.
Шаг 9. Сделаем обработку входящих пакетов данных
Сделаем так, что любая информация, передаваемая между устройствами упаковывалась в специальные пакеты (рис. 6). Напишем функцию, которая принимает, распаковывает и выполняет пакеты. А также напишем вспомогательную функцию (parseString), которая позволит извлекать определенный участок из строки, заключенный между специальных знаков разделителей (похожа на метод Split из JS).
Рисунок 6. Структура пакета данных
Пример использования функции parseString:
parseString(0, ‘,’, “Bob,Jack”); —–> Bob
Шаг 10. Реализуем систему задающую номер игрока
При включении устройства и соединении кабеля, каждое из устройств выдерживает случайный интервал времени, при этом слушает входящие пакеты, и, отсылает пакет “Я здесь!” (рис. 7). По-умолчанию оба устройства являются первыми игроками. То устройство, которое первым примет послание “Я здесь!” сразу назначит себе номер игрока 2.
Рисунок 7. Принцип работы рукопожатия для получения номера игрока
void handshakePlayerId() <
long tpid = random(10, 1001) * 10;
long previousMillis = millis();
while (!serialRecivePacket())
<
unsigned long currentMillis = millis();
if (currentMillis — previousMillis > tpid) break;
>
while (!serialSendPlayerTId());
>
Шаг 11. Упакуем и распакуем пакет с картой
Дополнительные функции (например, getTrumpCard()) Вы можете посмотреть в полном скетче или написать собственные гораздо лучше 😉
Шаг 12. Напишем функцию синхронизации
Функция синхронизации по факту является ключевой в данном проекте. Целью функции синхронизации является реагирование при действиях игроков и обмен игровой информацией. Функция вызывается в ручном и автоматическом режиме из цикла loop(). Когда очередь игрока функция работает в ручном режиме и выполняется только после действий игрока. В то время эта же функция работает в автоматическом режиме на устройстве соперника.
Шаг 13. Кто же выиграл?
Функция whoWin() возвращает номер игрока, который выиграл или -1, если никто не выиграл.
По правилам игры считается, что если у игрока не осталось ни одной карты, то он выиграл. Если у игрока 10 (playerFieldAmount) и более карт, то он проиграл.
Шаг 14. Соберём весь код воедино и загрузим его в устройство
Внимание: это мой первый проект игры, поэтому приведенный код является beta-версией, который может содержать баги и ошибки. Спасибо за понимание!
Скачать скетч для Arduino IDE можно внизу урока в разделе Загрузки.
Шаг 15. Запуск
Соединим устройства при помощи последовательного порта (рис. 5.1). И нажмём красные кнопки на обоих устройствах (рис. 8). Попробуем сыграть! (рис. 8.1).
Рисунок 8. Первый запуск игры
Рисунок 8.1. Играем!
Дурак по сети на Python: часть 1
Давайте попробуем разработать сетевую игру на Python, чтобы можно было играть по локальной сети. Думаю, начать надо именно с логики игры, а потом добавить уже сетевое взаимодействие. Я выбрал в качестве игры – карточную игру «Дурак», чтобы, во-первых, не создавать очередные надоевшие крестики-нолики, а, во-вторых, чтобы добавить элемент синхронных взаимодействий вместо исключительно пошаговых (активный игрок может подкидывать карты, пока другой отбивается).
Начнем с определения некоторых констант в файле durak.py :
Посмотрим нашу эталонную колоду:
Мы не будем ее менять, просто при создании игры будем копировать этот список в колоду текущей игры. Каждая карта в колоде или в руке игрока – это кортеж из строки-достоинства и строки-масти.
Создадим класс игрока. Его свойства: список карт на руке и индекс игрока в массиве игроков (0 – для первого и 1 – для второго). Индекс нужен, чтобы определять текущего ходящего игрока. Игрок может брать недостающее число карт из колоды или просто добавлять себе в руку список карт, когда вынужден взять неотбитый им стол.
Приступим же к классу Durak – основному классу игровой логики:
Генератор случайных чисел можно указать из-вне, это нужно для отладки, чтобы каждый раз воспроизводилась одна и та же раздача, если ГСЧ не задать, то он будет создан на месте и игра будет случайна.
При инициализации, как и в реальной игре, мы берем колоду, перемешиваем ее, раздаем по 6 карт игрокам, берем козырь сверху, запоминаем его и кладем под низ. Кстати, вот функция rotate , которая сдвигает циклично список на n позиций влево (n или вправо (n > 0) :
Я не стал выбирать первого игрока по наличию младшего козыря, потому что обычно это нужно только в первый кон, а дальше ходят под дурака. И то, как договорятся. Просто назначаем первым игрока с индексом 0.
Игровое поле здесь – это словарь, где ключ – атакующая карта, а значение – отбивающая карта (если игрок отбился) или None (если он пока еще не отбился от конкретно этой атакующей карты).
Для получения списков карт на поле вводим такие свойства:
А эти свойства помогают определить, кто текущий игрок, а кто его соперник:
Рассмотрим теперь методы атаки и защиты:
Ходить можно с любой карты, если игровое поле пусто. Но подбрасывать можно только, если карта соответствует по достоинству или масти – этой проверкой заведует метод can_add_to_field :
Переходим к защите:
Метод, который определяет бьет ли первая карта вторую выглядит так. Обратите внимание, что предварительно надо преобразовать название достоинства карты в числовую характеристику – индекс в массиве достоинств по возрастанию (индекс шестерки – 0, семерки – 1, а у туза – 8).
Метод завершающий ход finish_turn возвращает результат хода. В зависимости от ситуации на столе могут быть такие варианты. 1) Отбиты все карты. Тогда ход переходит к игроку, который защищался. Оба добирают из колоды недостающее число карт. 2) Не отбил что-то, тогда право хода не меняется, атакующий добирает карты, а защищающийся собирает со стола все карты к себе в руку. 3) Игра завешена, так как карт в колоде больше нет, и один из соперников тоже избавился от всех карт. Тот, кто остался с картами на руках в конце игры – ДУРАК
Вот и вся логика. Один атакует attack , другой отбивается defend . В любой момент может быть вызван finish_turn , чтобы завершить ход. Смотрим на результат хода, и если игра окончена, то в поле winner будет индекс игрока-победителя.
Теперь реализуем локальную игру в консоли, как будто бы оба играют за одним компьютером. Функции по отрисовке состояния игры в консоль собраны в файле render.py. Не буду их разбирать подробно, так как они не так важны, а в будущем мы прикрутим графическую оболочку и консольные функции потеряют актуальность.
Сам же игровой интерфейс реализован в файле local_game.py:
Команды ( a #номер карты – атака, d #номер карты – защита, просто f – завершить ход, q – выход). Номера карт задаются с 1 (там будет нумерация возле карт).
Локальную версию игры можно пощупать в браузере через replit.
Весь код будет доступен в репозитории. О сетевой подсистеме игры я расскажу в следующих частях очень скоро!
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway
Дурак онлайн. Играть бесплатно
Карточная игра Дурак (онлайн) – это название самой популярной карточной игры в России. Ее название относится к человеку, который проигрывает игру. Существует несколько ее вариантов: подкидной, переводной и классический. На этом сайте Вы можете играть без регистрации с другими людьми.
Сколько карт “участвует”?
Между участниками распределяется уменьшенная покерная колода из 36 карт номиналами от 6 до туза.
Цель игры?
Победителем считается тот, кто избавиться быстрее всех от всех имеющихся у него карт. При этом следует отметить, что в раздаточной колоде не должно остаться ни одной карты.
Краткая история происхождения
Это простая крестьянская игра в карты, которой уже исполнилось 200 лет. Об этом возрасте можно говорить с уверенностью, так как есть упоминания о ней в произведениях Пушкина и Салтыкова-Щедрина, как о “пустяковой забаве”.
Благодаря революции 1917 года игра получила признание в обществе и перебралась в салуны. Сегодня в нее играют во многих странах. В Калифорнийском университете, например, есть даже такая традиция среди студентов, изучающих русский язык. По пятницам они собираются в неформальной обстановке и тренируют свои коммуникативные навыки, коротая время в “Дурака”.
Существует множество различных приложений, дающих возможность виртуально окунуться в эту “забаву”. Играть можно как на телефоне, так и на ноутбуке или персональном компьютере. ОСнновным ее преимуществом является то, что в нее можно научиться играть за пару минут, а навыки оттачивать годами.
Как начинается?
Для начала необходимо определить со сколькими участниками Вы готовы состязаться: “вдвоем”, “втроем” или “вчетвером”. Далее необходимо нажать на кнопку “Начать игру”. Чаще всего участники выбирают режим “вдвоем”.
Каждому игроку сдается по 6 карт рубашкой вверх. Верхняя карта оставшейся колоды кладется лицевой стороной вверх. Эта карта определяет козырную масть для игры. Остальная часть колоды размещается рубашками вверх поверх козыря и называется “раздаточной”. Игровой механизм определяет того, кто ходит первым (“нападающий”). Игрок, под которого ходит “нападающий” (“атакующий”), является “защитником” (“защищающимся”).
Как играть?
Игра состоит из 3-х фаз: атаки, защиты и поддержки. Чтобы выиграть игру, пользователь должен первым остаться без карт на руках с учетом того, что раздаточная колода пуста. Чтобы проиграть игру, пользователь должен быть единственным, у кого в руке остались карты.
Ход игры идет по часовой стрелке. Игрок, который “ходит”, действует как “нападающий”, а игрок, сидящий рядом с ним по часовой стрелке, действует как “защитник” (“защищающийся”). “Нападающий” (“атакующий”) бросает любую карту, из имеющихся у него на руках, а “защитник” должен отбить эту карту.
Карта может быть перебита картой большего номинала той же масти или козырем любого номинала. Если под “защищающегося” сходили козырем, то его можно перебить только козырем большего номинала. При этом следует отметить, что картой с самым большим номиналом является “туз” (карты по убыванию номинала-ранга: туз, король, дама, валет, десятка, девятка, восьмерка, семёрка и шестёрка). Если “защитник” не может или не хочет перебивать карту “нападающего”, то он должен ее забрать себе. Если “защитник” отбивает карту, то “атакующий” и другие участники могут подкинуть ему еще карты того же ранга, что и на столе. Чтобы одержать “победу” в этом раунде “защитник” должен побить все подкинутые карты тоже.
Под “защищающегося” нельзя подкинуть количество карт, которое превышает количество карт на его руках. Даже если у “защитника” много карт, то по правилам игры под него можно подкинуть максимум 6 штук.
Если “защитник” не может перебить одну или несколько карт, которыми он был атакован, то он должен забрать себе все подкинутые (свои и чужие) карты за столом. Если “защитнику” удается отбить все карты, то в следующем раунде он становится “атакующим”. При этом отбитые карты отбрасываются и помещаются в отдельную кучу под названием “отбой”.
После того, как раунд закончился, независимо от того, удалось ли “защитнику” отбить все карты или он всё забрал себе, игроки, у которых на руках меньше 6 карт, получают из раздаточной колоды дополнительные карты, чтобы у всех за столом было не менее 6-ти карт.
Если в раздаточной колоде не осталось карт, козырную карту, расположенную последней лицом вверх, берет тот, чья очередь брать карты. После этого игра продолжается до тех пор, пока все люди один за другим не избавятся от всех карт на руках. Человек, который остается с картами, называется “Дурак”.
Стратегии
Существует несколько хорошо известных стратегий, которые вы можете использовать. Однако тажке Вы можете выработать свой собственный стиль игры.
Базовая стратегия
Одна из самых основных и простых стратегий, которую часто используют новички, – это всегда избавляться от самых слабых карт любой ценой.
- Когда вы атакуете, всегда сначала используйте самые слабые карты.
- Продолжайте атаковать любыми действующими картами, которые слабее Вальта.
- Когда вы защищаетесь, всегда отбивайте подкидываемые карты, даже если вам нужно потратить впустую действительно имеющиеся козыри.
Эта стратегия ориентирована на избавление от карт, а не на ходы. Она очень проста и понятна и зависит от удачи, поэтому она больше всего подходит для новичков.
Стратегия коллекций
В этой стратегии игроку необходимо сосредоточиться на том, чтобы избавиться от одиночных карт и собрать по несколько карт с одинаковым номиналом.
- Если под Вас подкинули карту с номиналом, который у вас уже есть на руках, то необходимо ее взять вместо того, чтобы отбить.
- Защищающийся не должен отбивать подкидываемые карты картами, которые у вас в руке кратны. Например, если у вас есть три семерки и восьмерка, а вас атакуют шестеркой, на которую вы можете ответить семеркой или восьмеркой, то вы используете для покрытия восьмерку и сохраняете коллекцию 7-ок для своих атак.
- При каждой атаке (вашей очереди хода) игрок должен ходить наборами карт вместо одной карты. Атакуя наборами одного номинала и разной масти, вы заставляете защищающегося тратить впустую разные масти или более сильные карты, и тем самым ослабляете его. Когда вы атакуете коллекциями, у вас также есть более высокий шанс израсходовать козыри защитника или заставить его забрать и пропустить ход.
Эта стратегия направлена на то, чтобы значительно усложнить жизнь игроку, под которого ходят. Она используется только игроками, которые чувствуют себя комфортно в игре и принимают на себя определенный риск в надежде на то, что их усилия окупятся и усложнят жизнь другим игрокам.
Продвинутая стратегия
В этом случае пользователь сосредотачивается на том, чтобы держать сильные карты на руках на протяжении большей части игры, даже если это означает, что вам придется брать очень слабые карты.
- Если защитника атакуют картой, на которую можно ответить только картой сильнее 10, то игрок должен забрать ее вместо того, чтобы отбить.
- Когда нужно отбиться, нужно максимально долго отбиваться картами, не используя козырные. Вы атакуете только слабыми картами, а сильные сохраняете до конца игры.
- Если вам нужно атаковать и у вас есть только сильные карты, то вы атакуете только одной из них, даже если у вас есть набор с одинаковым номиналом.
- Сильные карты нужно начинать использовать только ближе к концу партии.
Эта стратегия ориентирована сильное нападение в самом конце партии. Она часто используется более профессиональными игроками и является самой популярной среди них.
Выигрышная стратегия учитывает психологию и математические способности игрока. Важно запоминать выбывающие карты, как в блэкджеке, так будет легче предугадать ход соперника по теории вероятностей. В игре Дурак онлайн много комбинаций – по этому параметру эту карточную головоломку можно сравнить разве что с шахматами. Поэтому, несмотря на его простоту, действительно можно научиться играть, просто следя за руками и продумывая каждый ход.
На этом сайте Вы можете играть в Дурака онлайн бесплатно на весь экран и без регистрации, наслаждаясь процессом с другими людьми, сидящими по ту сторону экрана.
App Store Дурак Онлайн. Легендарная карточная игра для iOS
Карточные игры захватывают ничуть не меньше, чем компьютерные. Отчасти из-за живого общения с соперниками, отчасти из-за своей мнимой непредсказуемости и упора на удачу. Уверен, все читатели в разное время играли в «Дурака». Кто-то мог даже выработать свои собственные стратегии. Предлагаю вспомнить всё, получив массу азарта в симуляторе дурака для iOS – Дурак Онлайн. Как вы уже догадались, здесь вы будете играть против настоящих соперников.
Правила игры в «дурака» знакомы всем ещё с детства. Немудрено: из всех карточных игр, эта является одной из наиболее простых в освоении и при этом одной из самых увлекательных. Будучи по-настоящему народной забавой, «дурак» имеет две самые распространённые разновидности: подкидной и переводной. В первом случае игроки могут присоединяться к чужим атакам на соперника, а во втором – мгновенно контратаковать, сбрасывая на поле карту такого же старшинства. Всё это доступно и здесь, в электронной версии.
Установив Дурак Онлайн, вы регистрируетесь в системе, желательно через Game Center. Теперь остается присоединиться к одной из пользовательских игровых комнат – и вы в игре. Подборка правил, с которыми хочется играть лично вам, настраивается в соответствующем меню. Там есть и подкидной, и переводной дурак, версии игры с большим и меньшим количеством карт, лимиты ставок и кое-что особенно интересное – шулерство.
В Дураке Онлайн можно жульничать. Если вы присоединились или создали комнату с поддержкой шулерства, любой игрок может попытаться обмануть соперника, побив его карту любой другой с игнорированием правил и старшинства. Если противник не заметит подвоха и не нажмёт соответствующую кнопку – считайте, что вам повезло. Но если вас поймают за обманом, вы лишитесь возможности жульничать до конца раунда. Справедливо и довольно интересно. Из опыта, каждый второй считает всех соперников болванами и пытается обмануть в первые же минуты игры.
Карточные баталии проводятся не только на азарт, но и на внутриигровую валюту. Чем выше уровень ставки в «комнате», тем больше суммы выигрыша. Не надо пугаться самого факта: в самом начале игрок получает более чем достаточный банк, которого хватит, чтобы рубиться с минимальными ставками в течение очень долгого времени. И даже если вы проиграете всё, пополнить счёт можно бесплатно каждый день. Помимо этого, в процессе раунда можно задействовать бонус-помощник: например, подсвечивание карт в руке, которыми можно ответить на атаку. Среди бонусов нет ничего такого, что может дать врагу или вам существенное преимущество. Правила «дурака» превыше всего, и все находятся в равных условиях.
В одной комнате могут играть от двух до шести человек. Можно создавать и закрытые раунды с доступом по паролю – например, для друзей. Как правило, игроков достаточно в любое время суток: даже вчера в три часа ночи я нашёл, с кем покидать карты. Общаться с соперниками можно посредством набора смайликов.
Дизайн приложения вполне традиционный. Понравилось, как просто и интуитивно реализовано сбрасывание карт: просто тянете их в центр. Можно так же пролистать содержимое руки, проведя пальцем по нижней части экрана – полезно, когда приходится брать карты соперника несколько ходов подряд. К слову, на ход даётся 15 секунд, и если соперник ничего не сделает, ему засчитают техническое поражение, а остальным – частичную победу.
Получилось отличное приложение для отличной игры – подходит, чтобы разнообразить длинный вечер или освежить поездку на транспорте. Азарта тут будет не меньше, чем при игре вживую. Наконец, Дурак Онлайн бесплатен и универсален – есть полноценная поддержка iPhone и iPad. Стоит как минимум попробовать.
iPhone + iPad: Бесплатно [Скачать из App Store]