Если в общих чертах, то всю или почти всю логику игры имеет смысл считать на сервере. Там же всё это дело синхронизировать. Клиент же, в свою очередь, только получает текущее состояние игры с сервера, отрисовывает его и передает на сервер действия пользователя.
Для отрисовки на клиенте лучше всего использовать
Canvas/WebGL. Проще это делать с помощью готовых игровых движков или графических библиотек (например
Phaser или
Pixi.js). Для передачи данных на сервер и обратно в реальном времени, стоит использовать
WebSockets.