Sobes.tech
Back to questions
Middle+
4

Как бы вы искали соседей, если бы реализовывали игровое поле через одномерный массив вместо двумерного?

Companies where asked
АэрофлотАэрофлот

Answer from AI

sobes.tech AI

Если игровое поле хранится в одномерном массиве, то для поиска соседей нужно знать ширину поля (например, width). Тогда позиция клетки с координатами (x, y) соответствует индексу index = y * width + x.

Чтобы найти соседей, нужно вычислить индексы соседних клеток с учётом границ поля:

  • Сосед слева: index - 1 (если x > 0)
  • Сосед справа: index + 1 (если x < width - 1)
  • Сосед сверху: index - width (если y > 0)
  • Сосед снизу: index + width (если y < height - 1)

Если нужны диагональные соседи, добавляем:

  • Верхний левый: index - width - 1 (если x > 0 и y > 0)
  • Верхний правый: index - width + 1 (если x < width - 1 и y > 0)
  • Нижний левый: index + width - 1 (если x > 0 и y < height - 1)
  • Нижний правый: index + width + 1 (если x < width - 1 и y < height - 1)

Пример на JavaScript:

function getNeighbors(index, width, height) {
  const x = index % width;
  const y = Math.floor(index / width);
  const neighbors = [];

  if (x > 0) neighbors.push(index - 1); // слева
  if (x < width - 1) neighbors.push(index + 1); // справа
  if (y > 0) neighbors.push(index - width); // сверху
  if (y < height - 1) neighbors.push(index + width); // снизу

  // Диагонали
  if (x > 0 && y > 0) neighbors.push(index - width - 1); // верхний левый
  if (x < width - 1 && y > 0) neighbors.push(index - width + 1); // верхний правый
  if (x > 0 && y < height - 1) neighbors.push(index + width - 1); // нижний левый
  if (x < width - 1 && y < height - 1) neighbors.push(index + width + 1); // нижний правый

  return neighbors;
}

Таким образом, используя арифметику индексов и проверку границ, можно эффективно находить соседей в одномерном массиве.