На игровом поле будут располагаться четыре однопалубных корабля. В двумерном массиве однопалубный корабль будет отмечен единицей "1". Корабли не могут располагаться рядом, вокруг каждого должны быть свободные ячейки. Свободные ячейки вокруг корабля в двумерном массиве будут отмечены минус единицей "-1". Значение минус единица "-1"будет признаком того, что в эту ячейку уже нельзя поместить палубу корабля. При каждой генерации кораблей –их расположение должно выбираться случайным образом. После генерации четырех однопалубных кораблей в двумерном массиве получится следующее (см. рис. 9).
Рис. 9
Расположение кораблей каждый раз должно выбираться случайно.
Схема генерации одного однопалубного корабля будет заключаться в следующем:
1. Выбираем случайную ячейку
2. Если ячейка содержит нулевое значение, то размещаем в ней корабль
3. Если ячейка занята, то выбираем следующую случайную ячейку
4. Так продолжаем до тех пор, пока не найдем ячейку с нулевым значением
5. В выбранную ячейку помещаем единицу"1"
6. Пространство вокруг окружаем минус единицами "-1"
Создадим отдельный метод для установки одного значения при окружении:
// Установить один элемент окружения
private void setOkr(int[][] mas, int i, int j, int val)
{
// Если не происходит выход за пределы массива
// и в ячейке нулевое значение
if (testMasPoz(i, j) && (mas[i][j] == 0))
// Устанавливаем необходимое значение
setMasValue(mas, i, j, val);
}
Метод setOkr() помещает одно значение для окружения в элемент массива.Прежде всего, происходит проверка, что нет выхода за пределы массива testMasPoz(i,j). И вторая проверка, что в ячейке находится нулевое значение.
При выполнении двух условий происходит установка нового значения.
Чтобы выполнить полное окружение необходимо установить значение вокруг элемента, а значит в восьми местах.Для этого добавим метод:
//Окружение одной ячейки вокруг
private void okrBegin(int[][] mas, int i, int j, int val) {
setOkr(mas, i-1, j-1, val); // сверху слева
setOkr(mas, i-1, j, val); // сверху
setOkr(mas, i-1, j+1, val); // сверху справа
setOkr(mas, i, j+1, val); // справа
setOkr(mas, i+1, j+1, val); // снизу справа
setOkr(mas, i+1, j, val); // снизу
setOkr(mas, i+1, j-1, val); // снизу слева
setOkr(mas, i, j-1, val); // слева
}
Метод okrBegin() перебирает все ячейки вокруг и устанавливает в них нужное значение. Если происходит выход за границы массива –эта ситуация контролируется в методе setOkr().
Теперь можно добавить метод для генерации четырех однопалубных кораблей:
//Создание четырех однопалубных кораблей
private void make1P(int[][] mas) {
// Циклfor делает четыре шага - для четырех кораблей
for (int k = 1; k <= 4; k++) {
// Глухой циклwhile
while (true) {
// Находим случайную позицию на игровом поле
int i = (int) (Math.random() * 10);
int j = (int) (Math.random() * 10);
// Проверяем, что там ничего нет и можно разместить
// корабль
if (mas[i][j] == 0) {
// Размещаем однопалубный корабль
mas[i][j] = 1;
// Выполняем окружение
okrBegin(mas, i, j, -1);
// Прерываем цикл
break;
}
}
}
}
Метод make1P() создает четыре однопалубных корабля. Верхний цикл for
выполняет четыре шага. Внутренний "глухой" цикл whileвыполняется до тех пор, пока не будет найдена свободная случайная ячейка с нулевым значением.После нахождения подходящей ячейки в нее записывается значение единица, происходит окружение минус единицами вокруг и прерывание цикла.
Теперь необходимо перейти в метод start() и вызвать метод генерации однопалубных кораблей:
//Запуск игры - начало игры
public void start() {
//Очищаем игровое поле игрока
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
masPlay[i][j] = 0;
}
}
//Генерация однопалубных кораблей
// для игрового поля Игрока
make1P(masPlay);
}
Запустим приложение и проверим результат (см. рис.10). При повторных нажатиях на кнопку Новая игра–корабли будут размещаться уже по-другому.