> For the complete documentation index, see [llms.txt](https://longxingtan.gitbook.io/mle-interview/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://longxingtan.gitbook.io/mle-interview/01_leetcode/17_design/353.-design-snake-game.md).

# \*353. Design Snake Game

<https://leetcode.com/problems/design-snake-game/>

## solution

```python
import collections

class SnakeGame:
    def __init__(self, width: int, height: int, food: List[List[int]]):
        self.width = width
        self.height = height

        self.food = collections.deque(food)
        self.score = 0

        self.snake = collections.deque([(0, 0)])
        self.snake_positions = set([(0, 0)])

    def move(self, direction: str) -> int:
        head_row, head_col = self.snake[0]

        if direction == 'U':
            head_row -= 1
        elif direction == 'D':
            head_row += 1
        elif direction == 'L':
            head_col -= 1
        elif direction == 'R':
            head_col += 1

        if head_row < 0 or head_row >= self.height or head_col < 0 or head_col >= self.width:
            return -1

        if self.food and [head_row, head_col] == self.food[0]:
            self.food.popleft()  # Eat the food
            self.score += 1  # Increase the score
        else:
            tail = self.snake.pop()
            self.snake_positions.remove(tail)

        if (head_row, head_col) in self.snake_positions:
            return -1

        self.snake.appendleft((head_row, head_col))
        self.snake_positions.add((head_row, head_col))
        return self.score
```

时间复杂度：O()\
空间复杂度：O()
