acelash
@acelash
web developer

Как построить онлайн карточную игру на PHP и canvas?

Решил написать простенькую карточную(Дурак) онлайн игру. Для бэк-энда взял Laravel а фронт на канвасе + Fabric.js . И столкнулся с такой проблемой: как лучше организовать логику игры, в особенности - мультиплеер. Ниже попытаюсь вкратце рассказать как я все это вижу и прошу вас поделится вашим мнением по этому вопросу, опытом, советом.
Так вот.
Есть 3 таблицы в базе: users(это понятно), games( вся информация о играх: игрок 1, игрок2, чей ход, у кого какие карты(json), карты в колоде(json) и прочее ), queue(тут попадают игроки у которых еще нету противника).
1. Логинится человек на сайте, выбирает ставку и нажимает кнопку "играть".
2. Если в queue есть подходящий противник - делаем новую запись в таблице games с этими игроками и редиректим обоих на страницу с игрой. А если противника нету - делаем запись в queue с этим игроком и каждые пару секунд через ajax проверяем нашлось ли ему противника и когда найдется - редиректим его на игру.
3. Каждое изменение на поле игры - сохраняем в таблице games через тот же ajax.
4. Обновляем поле игры ajax запросами к таблице games которые идут непрерывно, один за другим: новый запрос запускается сразу же или через секунду после завершения предыдущего.

Вот, в принципе, все до чего я смог додуматься в данный момент и я не уверен что это самое лучшее решение. Хотелось бы узнать ваше мнение.
  • Вопрос задан
  • 2541 просмотр
Решения вопроса 1
riky
@riky
Laravel
Тоже сейчас делаю карточную игру онлайн. Клон древней astral tournament - пример https://youtu.be/qZbVjDvKSx4?t=50s

В основном для обучения. Делаю на nodejs (хотя в основном обычно работаю на php/symfony) нода для таких вещей лучше адаптирована, с сокетами работает эффективнее, а на пхп придется поизвращаться (либо как вы описали аякс запросами постоянными долбить сервер, либо вебсокеты тоже пытаться прикручивать).

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

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

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

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

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

также стоит пояснить как делаются ходы (а именно анимация ходов). если посмотреть видео - то там игрок выбирает карту - ходится и дальше начинается атака его существами. тут делается так - на сервер уходит название выкинутой карты, сервер полностью просчитывает все действия за ход (а взаимодействия там довольно сложные - у каждой карты свои уникальные способности и они могут складываться с другими картами). далее формирует список визуальных событий, например - вызвать карту, атака картой, существо получает урон, мощности стихии увеличилась, и тд. на клиент уходит этот список и он начинает их один за другим проигрывать, как сценарий, чтобы игроки могли пошагово проследить и понять что происходит.

в общем и целом все просто
1) на сервере и клиенте есть обработчики событий друг от друга.
2) с клиента идут события - команды игроков (создать игру, присоединится, сделать ход, сдаться, пропустить ход)
3) с сервера идут команды для изменения UI (добавить игру в список, открыть UI игры, запустить анимацию сценария хода)

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

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы