Задача: 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;
}
}👉Новости 👉Платформа