TGViewer
PHP Backend | YeaHub PHP Backend | YeaHub @yeahub_php_backend · 376 subscribers
Post #22 59
#ЛитКод
Задача: 353. Design Snake Game

Разработайте игру "Змейка", которая играется на устройстве с экраном размером height x width. Поиграйте в игру онлайн, если вы не знакомы с ней.

Змейка изначально находится в верхнем левом углу (0, 0) с длиной в 1 единицу.
Вам дан массив food, где food[i] = (ri, ci) представляет собой строку и столбец позиции пищи, которую змейка может съесть. Когда змейка съедает кусочек пищи, ее длина и очки игры увеличиваются на 1.
Каждый кусочек пищи появляется по очереди на экране, то есть второй кусочек пищи не появится, пока змейка не съест первый кусочек пищи.
Когда кусочек пищи появляется на экране, гарантируется, что он не появится на блоке, занятом змейкой.
Игра заканчивается, если змейка выходит за пределы экрана (врезается в стену) или если ее голова занимает пространство, которое занимает ее тело после движения (например, змейка длиной 4 не может врезаться в себя).

Реализуйте класс SnakeGame:
SnakeGame(int width, int height, int[][] food) Инициализирует объект с экраном размером height x width и позициями пищи.
int move(String direction) Возвращает счет игры после применения одного движения змейки в направлении. Если игра окончена, верните -1.

Пример:
Input
["SnakeGame", "move", "move", "move", "move", "move", "move"]
[[3, 2, [[1, 2], [0, 1]]], ["R"], ["D"], ["R"], ["U"], ["L"], ["U"]]
Output
[null, 0, 0, 1, 1, 2, -1]


👨‍💻 Алгоритм:

1⃣Инициализируйте объекты игры, такие как экран, еда, положение змейки и счетчик, в конструкторе.

2⃣Реализуйте функцию для вычисления нового положения головы змейки на основе направления движения.

3⃣Обновите положение змейки и проверьте условия завершения игры. Верните текущий счет или -1, если игра закончена.

😊 Решение:
class SnakeGame {
private $width;
private $height;
private $food;
private $score;
private $snake;
private $snakeSet;
private $foodIndex;

function __construct($width, $height, $food) {
$this->width = $width;
$this->height = $height;
$this->food = $food;
$this->score = 0;
$this->snake = [[0, 0]];
$this->snakeSet = ['0,0' => true];
$this->foodIndex = 0;
}

function move($direction) {
$head = $this->snake[0];
$newHead = $head;

switch ($direction) {
case "U":
$newHead[0]--;
break;
case "D":
$newHead[0]++;
break;
case "L":
$newHead[1]--;
break;
case "R":
$newHead[1]++;
break;
}

if ($newHead[0] < 0 || $newHead[0] >= $this->height || $newHead[1] < 0 || $newHead[1] >= $this->width) {
return -1;
}

$newHeadStr = implode(',', $newHead);
if (isset($this->snakeSet[$newHeadStr]) && $newHeadStr !== implode(',', end($this->snake))) {
return -1;
}

if ($this->foodIndex < count($this->food) && $newHead[0] === $this->food[$this->foodIndex][0] && $newHead[1] === $this->food[$this->foodIndex][1]) {
$this->foodIndex++;
} else {
$tail = array_pop($this->snake);
unset($this->snakeSet[implode(',', $tail)]);
}

array_unshift($this->snake, $newHead);
$this->snakeSet[$newHeadStr] = true;

return count($this->snake) - 1;
}
}


👉Новости 👉Платформа
More from @yeahub_php_backend
  1. Oct 15, 2026#Собес #OpenShift #Kubernetes #container_platform 🤔 Что такое OpenShift и как он использу…
  2. Oct 12, 2026#Собес #storage #disk #flysystem 🤔 Было ли взаимодействие с файлами (например, через Stor…
  3. Oct 9, 2026#channel #плейлисты 📚 Просто о сложном. CutCode Этот канал — маст-хэв для любого PHP-разр…
  4. Oct 8, 2026#Собес #memory_layout #data_structures #cache_locality 🤔 Как отличие в расположении элеме…
  5. Oct 7, 2026#Собес #collector #garbage #promotion 🤔 Middle PHP Backend-разработчик в Альфа Страховани…
  6. Oct 5, 2026#Собес #profiling #performance 🤔 Если выяснили, что тормозит бэкенд — как бы вы отлаживал…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →