-
Notifications
You must be signed in to change notification settings - Fork 13
/
353.贪吃蛇.py
84 lines (80 loc) · 2.52 KB
/
353.贪吃蛇.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 请你设计一个 贪吃蛇游戏,该游戏将会在一个 屏幕尺寸 = 宽度 x 高度 的屏幕上运行。如果你不熟悉这个游戏,可以 点击这里 在线试玩。
#
# 起初时,蛇在左上角的 (0, 0) 位置,身体长度为 1 个单位。
#
# 你将会被给出一个 (行, 列) 形式的食物位置序列。当蛇吃到食物时,身子的长度会增加 1 个单位,得分也会 +1。
#
# 食物不会同时出现,会按列表的顺序逐一显示在屏幕上。比方讲,第一个食物被蛇吃掉后,第二个食物才会出现。
#
# 当一个食物在屏幕上出现时,它被保证不能出现在被蛇身体占据的格子里。
#
# 对于每个 move() 操作,你需要返回当前得分或 -1(表示蛇与自己身体或墙相撞,意味游戏结束)。
#
# 示例:
#
# 给定 width = 3, height = 2, 食物序列为 food = [[1,2],[0,1]]。
#
# Snake snake = new Snake(width, height, food);
#
# 初始时,蛇的位置在 (0,0) 且第一个食物在 (1,2)。
#
# |S| | |
# | | |F|
#
# snake.move("R"); -> 函数返回 0
#
# | |S| |
# | | |F|
#
# snake.move("D"); -> 函数返回 0
#
# | | | |
# | |S|F|
#
# snake.move("R"); -> 函数返回 1 (蛇吃掉了第一个食物,同时第二个食物出现在位置 (0,1))
#
# | |F| |
# | |S|S|
#
# snake.move("U"); -> 函数返回 1
#
# | |F|S|
# | | |S|
#
# snake.move("L"); -> 函数返回 2 (蛇吃掉了第二个食物)
#
# | |S|S|
# | | |S|
#
# snake.move("U"); -> 函数返回 -1 (蛇与边界相撞,游戏结束)
class SnakeGame:
def __init__(self, width: int, height: int, food):
self.snake = list()
self.snake.append([0, 0])
self.head = [0, 0]
self.foods = food
self.width = width
self.height = height
self.score = 0
def move(self, direction: str) -> int:
x, y = self.head
if direction == 'U':
x -= 1
elif direction == 'L':
y -= 1
elif direction == 'R':
y += 1
elif direction == 'D':
x += 1
if x < 0 or y < 0 or x > self.height - 1 or y > self.width - 1:
return -1
self.head = [x, y]
self.snake = [self.head] + self.snake
if self.foods and self.head == self.foods[0]:
self.score += 1
self.foods = self.foods[1:]
else:
self.snake = self.snake[:-1]
if self.head in self.snake[1:]:
return -1
return self.score