if lastDir.y==0 then --之所以加入这个判断是因为 只有在蛇左右移动的时候 改变到上下才有意义 同时也避免了让蛇后退。用上一帧的方向是因为避免在一帧内多次输入导致的错误。如果用当前方向dir,那么如果蛇的方向为right在一帧内快速按下up 和left就可以 ,就可以让蛇倒退了。
dir.x,dir.y=0,-1
end
elseif love.keyboard.isDown("down") then
if lastDir.y==0 then
dir.x,dir.y=0,1
end
elseif love.keyboard.isDown("left") then
if lastDir.x==0 then
dir.x,dir.y=-1,0
end
elseif love.keyboard.isDown("right") then
if lastDir.x==0 then
dir.x,dir.y=1,0
end
end
end
```
现在我们的蛇可以移动了,动的多了蛇就饿了,得吃东西,随机生成一个食物,注意不能在已占的位置生成。
```lua
local function newFood()
repeat
food.x= love.math.random(2,14) --不能在框上画食物哦
food.y= love.math.random(2,14)
until not check(food.x,food.y) --直到食物位置是个空位,实际上这是个不严谨的写法。更加好的做法是把可以用的位置做一个表,然后随机选取一个来作为食物的位置。
map[food.x][food.y]=true
end
```
吃到食物那么长度加1。游戏速度增加一些。
local function eat() table.insert(snake, {x=snake[1].x,y=snake[1].y}) –实际上 增加一节的位置可以是蛇上的任意点,因为下一帧会跳到上一次倒数第二的位置。 updateCD=updateCD*0.9 –cd速度打九折 newFood() –生成一个新的食物 end
1
2
接下来是碰撞判断,我们看地图蛇头位置是否被占。
local targetX,targetY=snake[1].x+dir.x,snake[1].y+dir.y –实际上检验的位置是移动后的蛇头 if check(targetX,targetY) then if targetX==food.x and targetY==food.y then –如果位置是食物就吃了它,并生成新的食物 eat() else –如果位置是墙就gameover了,这里注意有个return 因为游戏结束了,后面不需要再更新了。 gameover() return end end
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
最后,我们gameover画面啦。
```
local function gameover()
local title = "Game Over"
local message = "Your Score is "..tostring(#snake-5)
local buttons = {"Restart!", "Quit!", escapebutton = 2}
local pressedbutton = love.window.showMessageBox(title, message, buttons) --这个是个出对话框的命令,这个命令有自己的循环,当对话框存在时,游戏窗体的update是暂停的。