Żeby gra chodziła płynnie, potrzebujesz co najmniej WebSockets, żeby nie zarżnąć serwera requestami co sekundę (jeśli nie częściej). To oznacza zmianę podejścia do samej architektury serwera, który będzie musiał pracować jako demon. W przypadku PHP wystarczy użyć frameworka Ratchet. Chociaż jeszcze lepiej (i łatwiej IMO) użyć tandemu node.js + socket.io.
Powiedziałem "co najmniej WebSockets", bo jest jeszcze nowsza technologia, na którą warto spojrzeć: WebRTC, gdzie połączenia lecą przez P2P między przeglądarkami. Tutaj de facto serwer służyłby jedynie do znalezienia współgracza, a cała reszta odbywałaby się u klientów.
Samo generowanie planszy to zabawa z canvas w JS (względnie SVG, ale to może mieć o wiele mniejszą wydajność) – tutaj warto wykorzystać jakąś bibliotekę, np. Phaser.js (canvas jest strasznie low-levelowy). Natomiast synchronizacja wyświetlania pomiędzy graczami to coś w kierunku Operational Transforms, czyli wysyłanie informacji o tym, co się zmieniło, jako zbioru operacji do wykonania (tak działa np. collaborative editing w Google Docs). Oczywiście większość operacji, typu zabicie przeciwnika, musi być też potwierdzona przez serwer.