---
# System prepended metadata

title: Морской бой

---

# Морской бой

Давайте попробуем создайть простую игру, используя классы ES6 и навыки декомпозиции . Для тех кто забыл правила их можно подсмотреть в [Википедии](https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D1%80%D1%81%D0%BA%D0%BE%D0%B9_%D0%B1%D0%BE%D0%B9_(%D0%B8%D0%B3%D1%80%D0%B0)) 

## Правила 

Игра должна работать следующим образом:

- Режимы игры: ИИ vs ИИ, Игрок vs ИИ
- Экран должен содержать два поля. Поля должны отображаться динамически в .js без использования canvas или images.
- Корабли игроков должны располагаться на поле автоматически и случайным образом при каждом запуске игры.
-  ИИ должен иметь простую логику. Например, если на поле есть поврежденный корабль, ПК должен попытаться его добить.
-  Вам также нужно отображать историю для каждого шага ПК (ИИ)

На странице также должны быть отображены параметры игры:
 - У пользователя должна быть возможность увидеть корабли противника, если это необходимо. 
 -  Пока идет игра, мы можем видеть пораженные ячейки, поврежденные/затонувшие корабли.
 - Пользователь может настроить скорость игры (скорость "хождения" ИИ)

У каждого игрока есть след набор кораблей:

- линкор /четырехпалубный /четырехтрубный (4 клетки) - 1 ед.
- крейсер /трехпалубный /трехтрубный (3 клетки) - 2 ед.
- эсминец /двухэтажный /двухтрубный(2 клетки) - 3 ед.
- подводная лодка /однопалубная /однотрубная(1 клетка) - 4 ед.

## На какие шаги стоит разбить реализацию

- Создать класс Ship который отвечает за рендер корабля и хранит его состоятие (к-во подбитых ячеек), утонул или нет
- Создать класс Field который умеет рисовать сетку n*n, хранит и генерирует корабли, определяет показывать ли их на поле. 

  **Hint**: 
  
  * На этапе разработки класса Field важно будет убедиться что корабли появляются на нужных местах и не залезают друг на друга.

- Создать класс Player который привязываетcя к полю и идентифицирует "ходит" ли реальный человек или ПК(ИИ). 
- Создать класс Game который следит чей ход, обрабатывает очередность ходов и определяет статус игры

  **Hints:**
   * В Game сначала убедиться что игра корректно отрабатывает для одного игрока. 
   * Потом добавить второго и написать логику переключения. Можно играть с самим собой

- Добавить логику для ИИ, запоминание пройденных ходов, попал\не попал в корабль, достреливание по направлению корабля при попадании, скорость хода (например через setTimeout) и т.д.
