Создание игры «Морской бой» станет настоящим испытанием для ваших навыков программирования. Самой сложной задачей при создании игры Node JS Battleship было размещение разнонаправленных кораблей.

Мы рассмотрим, как можно разместить разнонаправленные корабли — но сначала давайте рассмотрим наши цели для этой задачи:

1. Случайным образом расставьте корабли разной длины (на 2–5 клеток).

2. Корабли должны идти вправо, влево, вверх и вниз

3. Корабли не должны пересекаться или выходить за пределы игрового поля.

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

Давайте начнем наше приключение с создания функции для генерации случайного местоположения кораблей.

Эта функция принимает три параметра:

1. Доска

2. Макс (размер сетки, например, 5х5, 8х8, 10х10)

3. Корабль (каждый объект корабля в массиве кораблей)

Мы запускаем функцию, зная, что корабль не был размещен (!didPlace). Переменные valid и directionString созданы, потому что они понадобятся на следующем этапе нашего приключения (определение направления и размещение кораблей).

Следующим оператором в функции является цикл while. В этом цикле мы, по сути, говорим: ПОКА наши корабли не размещены (т. е. didPlace ложно), сделайте следующее:

1. Получите координату случайного числа для осей x и y (с помощью функции getRandomInt)

2. Используйте функцию generateRandomDirection, чтобы выбрать направление для размещения корабля.

3. После того, как generateRandomDirection проверит наличие всех необходимых мест для размера корабля в заданном направлении.

4. Затем… ЕСЛИ ВСЕ эти вещи верны, разместите корабли (используя функцию placeShip).

5. Наконец, установите didPlace = true, так как корабль был размещен и теперь находится на доске!

Этот процесс представляет собой тернистый путь. Давайте рассмотрим это более подробно ниже.

Первым шагом является генерация случайных чисел координат для корабля. Это делается с помощью методов Math.floor и Math.random с использованием максимального размера сетки в качестве параметра (поэтому мы не получаем числа координат за пределами сетки).

Следующим шагом является генерация случайного направления для корабля (примеры кода ниже показывают 2 из 4 направлений).

Чтобы функция generateRandomDirection могла получить доступ к переменным valid и directionString, они должны быть сначала определены. Мы знаем, что наша функция должна размещать корабли в 4 разных направлениях: вправо, влево, вверх и вниз. Чтобы выбрать направление случайным образом, мы присвоим номер каждому возможному направлению (например, вправо = 1, влево = 2 и т. д.).

Как только направление определено, мы должны проверить наличие ячеек, которые нам понадобятся для данного корабля. Начиная со сгенерированной случайной координаты, мы используем цикл for, чтобы убедиться, что ни одно из мест, необходимых для корабля, не является:

1. За пределами доски,

2. Заполняется буквой «S» или

3. Не определено.

Если эти параметры соблюдены, переменные directionString и valid возвращаются обратно в функцию generateRandomLocation, и мы приступаем к размещению нашего корабля.

Теперь, когда условие if (действительно) выполнено, функция generateRandomLocation передает значение корабля и его координаты x и y в placeShip. Затем цикл while останавливается установкой didPlace в значение true.

Функция placeShip принимает следующие параметры: координаты x и y, символ (в данном случае «S» для кораблей), борт, направление и корабль. Корабль размещается на основе параметра направления. Например, если directionString имеет значение «правильно», переменные будут переданы в оператор if (направление === «право»).

Затем используется цикл for для перебора размера корабля (например, корабля с 2 или 4 ячейками), размещения символа «S» в координатах и, наконец, подталкивания этих значений координат. в свойство ship.coordinate объекта корабля.

Мы, наконец, подошли к концу нашего приключения с кораблями, размещенными на доске, готовыми к удару. Какое интересное приключение!

До следующего раза, удачного кодирования!