Морской бой с# Алгоритм расстановки кораблей
Я пишу морской бой на с# и мне нужно сделать функцию, которая проверяет,свободны ли ячейки рядом с нужной мне ячейкой.Это нужно чтобы между кораблями было расстояние хотя бы в ячейку.У меня не получается.Неправильно строит корабли.Видимо,я накосячил в условиях,но не понимаю где.В карте map 1 - есть корабль,0 - пусто.Карта имеет размер 10х10.Я че-то очень намудрил, но логикой руководствовался такой.Для углов нужно 2 ячейки проверить,для границ(без углов) 3 ячейки, для внутренней части 4.
Мой код:
// верхняя граница
if (x >= 0 && x <= 9 && y == 0)
{
// левый верхний угол
if (x == 0) if (map[x + 1, y] == 1 || map[x, y + 1] == 1) return false;
// правый верхний угол
else if (x == 9) if (map[x + 1, y] == 1 || map[x, y - 1] == 1) return false;
// граница без углов
else if (x > 0 && x < 9) if (map[x - 1, y] == 1 || map[x, y + 1] == 1 || map[x + 1, y] == 1)
return false;
}
// нижняя граница
if (x >= 0 && x <= 9 && y == 9)
{
// левый нижний угол
if (x == 0) if (map[x, y - 1] == 1 || map[x + 1, y] == 1) return false;
// правый нижний угол
else if (x == 9) if (map[x, y - 1] == 1 || map[x - 1, y] == 1) return false;
// граница без углов
else if (x > 0 && x < 9) if (map[x - 1, y] == 1 || map[x, y - 1] == 1 || map[x + 1, y] == 1)
return false;
}
// левая граница
if (y >= 0 && y <= 9 && x == 0)
{
// левый верхний угол
if (y == 0) if (map[x + 1, y] == 1 || map[x, y + 1] == 1) return false;
// левый нижний угол
else if (y == 9) if (map[x, y - 1] == 1 || map[x + 1, y] == 1) return false;
// граница без углов
else if (y > 0 && y < 9) if (map[x, y - 1] == 1 || map[x + 1, y] == 1 || map[x, y + 1] == 1)
return false;
}
//правая граница
if (y >= 0 && y <= 9 && x == 9)
{
// правый верхний угол
if (y == 0) if (map[x - 1, y] == 1 || map[x, y + 1] == 1) return false;
// правый нижний угол
else if (y == 9) if (map[x - 1, y] == 1 || map[x, y - 1] == 1) return false;
// граница без углов
else if (y > 0 && y < 9) if (map[x, y - 1] == 1 || map[x - 1, y] == 1 || map[x, y + 1] == 1)
return false;
}
// внутренняя часть
if (x != 0 && y != 0 && x != 9 && y != 9)
{
if (map[x, y - 1] == 1 || map[x, y + 1] == 1 || map[x + 1, y] == 1 || map[x - 1, y] == 1) return false;
}
return true;
Ответы (1 шт):
Я применил такое решение: для расстановки кораблей использовал пятно, которое включает 1 клетку по периметру корабля. Для однопалубного пятно будет 3х3, для двухпалубного 4х3. И поле для расстановки 12х12 (10х10 с каёмкой по краям).
Расстановку нужно начинать с больших кораблей.