(Вернее одна из его многочисленых вариаций в которую мы с друзьями играем большую часть жизни)
Многопользовательская карточная игра на WebSocket с уникальными правилами и специальными картами.
- Стандартная колода из 52 карт (без джокеров) или 36 карт
- 4 классические масти:
♥️ Черви,♦️ Бубны,♣️ Трефы,♠️ Пики - 13 рангов: 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A
- Когда колода заканчивается, все карты из сброса (кроме верхней) перемешиваются и становятся новой колодой
- Каждому игроку раздаётся по 5 карт
- Одна карта кладётся рубашкой вниз на поле (первый ход дилера)
- Колода кладётся рядом
- Ход делает игрок после дилера
- Первая карта имеет эффект:
- Если 6 или 7: Следующий игрок берёт карты и пропускает ход
- Если 8: Следующий игрок должен брать карты или положить двойку (не действует при 36 карт/колода)
- Если A: Следующий игрок пропускает ход
- Если Q: Дилер автоматически выбирает масть (случайную)
- Карты кладутся по принципу масть на масть или номинал на номинал
- Взятие карт:
- Можно взять карту из колоды даже если есть чем ходить (только 1 раз за ход)
- После взятия карты появляется кнопка "Пропустить ход"
- Вы можете:
- Сыграть любую подходящую карту из руки (включая только что взятую)
- Или нажать "Пропустить ход" чтобы передать ход следующему игроку
- Верхняя карта на поле остаётся лежать пока её не покроют следующей картой
Шестёрка (6): Следующий игрок берёт 1 карту и пропускает ход
Семёрка (7): Следующий игрок берёт 2 карты и пропускает ход
Восьмёрка (8) (не действует при 36 карт/колода): Следующий игрок должен:
- Из руки: Может положить только любую двойку (2) любой масти
- Из колоды: Берёт карты пока не попадётся:
- Любая двойка (2)
- Любая дама (Q)
- Карта той же масти что и восьмёрка
Туз (A): Следующий игрок пропускает ход
Дама (Q):
- Можно положить на любую карту
- Игрок выбирает следующую масть
- Выбранная масть отображается над картой на поле в золотом бейдже
- Индикатор масти остаётся пока её не покроют другой картой
- Следующий игрок должен положить карту выбранной масти (или даму)
- ВАЖНО: Если дама - последняя карта, вычитается 20 очков (пиковая дама - 40 очков)
Побеждает тот, кто первым сбросил все карты.
Остальным начисляются очки за оставшиеся карты:
- Цифры (2-10) = номинал карты
- Валет (J) = 2 очка
- Дама (Q) = 20 очков (пиковая дама = 40 очков)
- Король (K) = 4 очка
- Туз (A) = 11 очков
Специальные правила:
- Победа дамой: Вычитается 20 очков (пиковая дама - 40)
- Ровно 101 очко: Счёт обнуляется до 0
- Больше 101 очка: Игрок выбывает из игры
- Дилер следующего раунда: Проигравший предыдущего раунда
- Python 3.8+
pip install -r requirements.txtpython server.pyСервер запустится на:
- WebSocket:
ws://localhost:8765 - HTTP:
http://localhost:8080
- Откройте браузер и перейдите на
http://localhost:8080 - Введите никнейм и создайте комнату или присоединитесь к существующей
- Дождитесь минимум 2 игроков
- Все игроки нажимают "Готов"
- Игра начинается автоматически!
-
Хост:
- Узнайте свой IP адрес:
- Linux/Mac:
ip addrилиifconfig - Windows:
ipconfig
- Linux/Mac:
- Откройте
http://localhost:8080илиhttp://ВАШ_IP:8080 - Создайте комнату
- Узнайте свой IP адрес:
-
Другие игроки:
- Откройте
http://IP_ХОСТА:8080в браузере - Присоединитесь к комнате
- Откройте
-
Важно: Убедитесь что порты 8080 и 8765 открыты в файрволе
Примечание: Каждый игрок видит только свои карты! Карты других игроков скрыты.
Если вы используете reverse proxy (nginx, caddy и т.д.) с доменами:
-
Настройте reverse proxy:
- HTTP/HTTPS домен (например
domain.com) →localhost:8080 - WebSocket домен (например
ws.domain.com) →localhost:8765
- HTTP/HTTPS домен (например
-
Раскомментируйте в
client/index.html:<meta name="ws-host" content="ws.domain.com">
Укажите ваш WebSocket домен без протокола (wss:// добавится автоматически)
-
Пример конфигурации nginx:
# HTTP сервер server { listen 443 ssl; server_name domain.com; location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; } } # WebSocket сервер server { listen 443 ssl; server_name ws.domain.com; location / { proxy_pass http://localhost:8765; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
czech-fool/
├── server.py # Серверная часть на Python
├── database_postgres.py # Серверная часть базы данных
├── requirements.txt # Зависимости Python
├── client/
│ ├── index.html # HTML интерфейс
│ ├── style.css # Стили
│ ├── game.js # Клиентская логика
│ ├── sw.js # Service Worker для PWA
│ ├── manifest.json # PWA манифест
│ ├── rules.md # Правила игры (Markdown)
│ ├── sounds/ # Звуковые эффекты (.aac)
│ └── icons/ # Иконки для PWA
├── rules.md # Правила игры
├── czech-fool.service # Шаблон systemd service
└── README.md # Документация
- Backend: Python, websockets, aiohttp, PostgreSQL
- Frontend: Vanilla JavaScript, HTML5, CSS3
- Протокол: WebSocket для real-time коммуникации
- База данных: PostgreSQL для сохранения состояния игры
- Хранилище: localStorage для идентификации игроков
- ✅ Real-time многопользовательская игра (2-4 игрока)
- ✅ Круговой игровой стол с визуальным отображением
- ✅ Карты противников отображаются рубашками по количеству
- ✅ Полная реализация всех правил и специальных карт
- ✅ Система подсчёта очков с особыми правилами (101 очко)
- ✅ Игра с ботами (можно играть с 1, 2 или 3 ботами)
- ✅ Умные боты с приоритетом специальных карт и оценкой очков
- ✅ Сохранение состояния игры в PostgreSQL
- ✅ URL для комнат:
/room/{room_id} - ✅ Продолжение игры после обновления страницы
- ✅ localStorage для идентификации игроков
- ✅ Автоматическое переподключение при разрыве связи
- ✅ Page Visibility API - игра останавливается в фоне
- ✅ Современный и красивый UI с градиентами
- ✅ Адаптивный дизайн (десктоп + мобильные)
- ✅ Анимации карт и действий
- ✅ Звуковые эффекты для всех игровых событий (.aac)
- ✅ Лог игры (последние 10 событий)
- ✅ Чат для общения между игроками
- ✅ Правила игры встроены в интерфейс (Markdown)
- ✅ Горячие клавиши:
T/Е- открыть чатEnter- отправить сообщениеПробел- взять карту / пропустить ход
- ✅ Кнопки управления звуком, полноэкранным режимом
- ✅ Установка как приложение на телефон/десктоп
- ✅ Service Worker для оффлайн-кэширования
- ✅ Манифест с иконками и настройками
- ✅ Работает без интернета (после первой загрузки)
Круговое расположение игроков:
- Центр: Текущая карта на поле + колода справа
- Внизу: Ваши карты (повёрнуты к вам)
- Сверху: Противник (2 игрока) - карты рубашками
- Слева: Противник (3+ игрока) - карты сгруппированы
- Справа: Противник (4 игрока) - карты сгруппированы
- Подсветка: Текущий игрок подсвечивается жёлтым с анимацией
- При создании/присоединении к комнате URL меняется на
/room/{room_id} - Ваш
player_idсохраняется в localStorage - При обновлении страницы игра автоматически восстанавливается
- При выходе из комнаты localStorage очищается
- Все состояние игры хранится в PostgreSQL базе данных
Приятной игры! 🎮