Нужна таблица с состояниями полей, как описал
Владимир Коротенко и таблица с общим состоянием игры (game_id, user1_id, user2_id, next_move_user_id).
0. Сервер генерирует новую игру и рассылает её id обоим игрокам.
1. Игрок расставляет на своём поле корабли и сообщает расстановку серверу.
2. Сервер проверяет корректность расстановки и сохраняет её в базу данных.
3. Когда расстановка обоих игроков сохранена, сервер выбирает, за кем будет первый ход, и посылает сообщение о начале игры.
4. Игрок присылает на сервер свой ход (id_игры, id_игрока, строка, столбец).
5. Сервер проверяет корректность и результат хода, сохраняет новое состояние и посылает результат хода обоим игрокам.
6. Повторять с 4 пункта до выигрыша какого-либо игрока.