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

    riky
    @riky
    Laravel
    Тоже сейчас делаю карточную игру онлайн. Клон древней astral tournament - пример https://youtu.be/qZbVjDvKSx4?t=50s

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

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

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

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

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

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

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

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

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

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