Maksclub
@Maksclub
maksfedorov.ru

Как выбрать соседние плитки на доске 5 на 5 (6 на 6, не важно)?

Делаю задание, стоит задача отобрать все соседние клетки для доски 5 на 5
Сначала просто отбираю всех соседей
// Вертикальные соседи
        $nord = $blockIdFromClick - $n;
        $south = $blockIdFromClick + $n;

        // Горизонтальные
        $west = $blockIdFromClick - 1;
        $east = $blockIdFromClick + 1;

        // По диагонали (из правого верхнего угла)
        $nordEast = $blockIdFromClick - ($n-1);
        $southWest = $blockIdFromClick + ($n-1);

        // По диагонали (из левого верхнего угла)
        $nordWest = $blockIdFromClick - ($n+1);
        $southEast = $blockIdFromClick + ($n+1)


Как быть с клетками по краям ? Есть ли какой алгоритм?
А то приходит в голову только сравнение остатка от деления числа на разрядность сетки (в данном случае 5) :)
  • Вопрос задан
  • 321 просмотр
Решения вопроса 1
Stalker_RED
@Stalker_RED
Предположим, на входе координаты центральной клетки и размеры поля, и координаты отсчитываются от 0,0.

Для верхней и нижней строки проверяем не выходит ли она за границы. Внутри строки проверяем, нет ли выхода за границы по горизонтали.

Как-то так:
/**
 * @param int $x center
 * @param int $y center
 * @param int $width
 * @param int $height
 */
function getNeighbours($x, $y, $width, $height) {
    $result = [];

    // 1st row
    if ($y > 0) {
        $rowY = $y - 1;
        $result[0] = $x > 0 ? [$x - 1, $rowY] : null;
        $result[1] = [$x, $rowY];
        $result[2] = $x < $width - 1 ? [$x + 1, $rowY] : null;
    } else {
        $result[0] = $result[1] = $result[2] = null;
    }

    // 2nd row
    $rowY = $y;
    $result[3] = $x > 0 ? [$x - 1, $rowY] : null;
    $result[4] = [$x, $rowY];
    $result[5] = $x < $width - 1 ? [$x + 1, $rowY] : null;

    // 3rd row
    if ($y < $height) {
        $rowY = $y + 1;
        $result[6] = $x > 0 ? [$x - 1, $rowY] : null;
        $result[7] = [$x, $rowY];
        $result[8] = $x < $width - 1 ? [$x + 1, $rowY] : null;
    } else {
        $result[6] = $result[7] = $result[8] = null;
    }

    return $result;
}


Пример1
getNeighbours(5, 7, 10, 10);

Array
(
    [0] => Array
        (
            [0] => 4
            [1] => 6
        )

    [1] => Array
        (
            [0] => 5
            [1] => 6
        )

    [2] => Array
        (
            [0] => 6
            [1] => 6
        )

    [3] => Array
        (
            [0] => 4
            [1] => 7
        )

    [4] => Array
        (
            [0] => 5
            [1] => 7
        )

    [5] => Array
        (
            [0] => 6
            [1] => 7
        )

    [6] => Array
        (
            [0] => 4
            [1] => 8
        )

    [7] => Array
        (
            [0] => 5
            [1] => 8
        )

    [8] => Array
        (
            [0] => 6
            [1] => 8
        )

)
Пример2
getNeighbours(5, 3, 5, 5);

Array
(
    [0] => Array
        (
            [0] => 4
            [1] => 2
        )

    [1] => Array
        (
            [0] => 5
            [1] => 2
        )

    [2] => 
    [3] => Array
        (
            [0] => 4
            [1] => 3
        )

    [4] => Array
        (
            [0] => 5
            [1] => 3
        )

    [5] => 
    [6] => Array
        (
            [0] => 4
            [1] => 4
        )

    [7] => Array
        (
            [0] => 5
            [1] => 4
        )

    [8] => 
)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Ну правильно вам приходит в голову. Это если края доски как бы склеены. Если нет, то просто сравнивайте с размерностью доски.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы