Как построить онлайн карточную игру на 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 которые идут непрерывно, один за другим: новый запрос запускается сразу же или через секунду после завершения предыдущего.
Вот, в принципе, все до чего я смог додуматься в данный момент и я не уверен что это самое лучшее решение. Хотелось бы узнать ваше мнение.
- Вопрос задан более трёх лет назад
- 2577 просмотров
Оценить 3 комментария
- Вконтакте
Тоже сейчас делаю карточную игру онлайн. Клон древней astral tournament - пример https://youtu.be/qZbVjDvKSx4?t=50s
В основном для обучения. Делаю на nodejs (хотя в основном обычно работаю на php/symfony) нода для таких вещей лучше адаптирована, с сокетами работает эффективнее, а на пхп придется поизвращаться (либо как вы описали аякс запросами постоянными долбить сервер, либо вебсокеты тоже пытаться прикручивать).
Собственно на ноде все просто. после создания вебсокета можно двухсторонне общаться, на клиенте и сервере можно отправлять события и подписываться на них. Вся логика на сервере - клиент тупой только отправляет события и отрисовывает присланные события.
когда игрок входит - он попадает на список игр, может присоединится к любой не начатой или может создать свою. в дальнейшем добавлю еще режим наблюдателя - чтобы смотреть любую активную игру.
пример: игрок нажимает кнопку создать игру - все что делается на клиенте - отправляется событие на сервер, сервер даже не отвечает ничего, он просто всем игрокам отправит событие - создана игра и ее параметры. игра тут же отрисуется на всех клиентах (в том числе у того кто создал).
если ктото выбирает эту игру в списке - опять на отправляется всего лишь сигнал - игрок присоединился к игре. дальше сервер создает им комнату и они оба будут получать события связанные с этой игрой, первое событие - что у них должен открыться экран с игрой.
ну и далее все аналогично - любой клик по сути на клиенте всего лишь отправляет событие на сервер о том что хочет сделать игрок. все рассчеты на сервере и на клиенты уже отправляются события для изменения UI. Таким образом мухлевать невозможно.
также стоит пояснить как делаются ходы (а именно анимация ходов). если посмотреть видео - то там игрок выбирает карту - ходится и дальше начинается атака его существами. тут делается так - на сервер уходит название выкинутой карты, сервер полностью просчитывает все действия за ход (а взаимодействия там довольно сложные - у каждой карты свои уникальные способности и они могут складываться с другими картами). далее формирует список визуальных событий, например - вызвать карту, атака картой, существо получает урон, мощности стихии увеличилась, и тд. на клиент уходит этот список и он начинает их один за другим проигрывать, как сценарий, чтобы игроки могли пошагово проследить и понять что происходит.
в общем и целом все просто 1) на сервере и клиенте есть обработчики событий друг от друга. 2) с клиента идут события - команды игроков (создать игру, присоединится, сделать ход, сдаться, пропустить ход) 3) с сервера идут команды для изменения UI (добавить игру в список, открыть UI игры, запустить анимацию сценария хода)
я думаю мог и на пхп это сделать, опыт с ним > 5 лет, а с нодой ничего особо серьезного не делал пока, хотя иногда пользуюсь ей. но с пхп это будет не лучшее решение.
к тому же с нодой есть возможность писать часть кода который будет выполняться и на клиенте и на сервере, тк язык один. у меня например пока это только описания карт, но в целом перспектива тоже интересная.