📄 game.lst
字号:
165 void GameOver(void)
166 {
167 1 unsigned char n;
168 1 Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隐出食物
169 1 for(n=1;n<snake.node;n++)
170 1 {
171 2 Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,0);//消隐食物,蛇头已到墙壁内,故不用消去
-
172 2 }
173 1 if(snake.life==0)//如果蛇还活着
174 1 Lcd_WriteStr(2,1,"过关");
175 1 else //如果蛇死了
176 1 Lcd_WriteStr(2,1,"输了");
177 1 Lcd_WriteStr(1,2,"游戏结束");
178 1 }
C51 COMPILER V8.02 GAME 03/12/2009 22:02:27 PAGE 4
179
180 /********************************
181 游戏的具体过程,也是贪吃蛇算法的关键部分
182 *********************************/
183 void GamePlay(void)
184 {
185 1 unsigned char n;
186 1 InitRandom(TL0);
187 1 food.yes=1;//1表示需要出现新事物,0表示已经存在食物尚未吃掉
188 1 snake.life=0;//表示蛇还活着
189 1 snake.direction=DOWN;
190 1 snake.x[0]=6;snake.y[0]=6;
191 1 snake.x[1]=3;snake.y[1]=6;
192 1 snake.node=2;
193 1 PrintScore();
194 1 PrintSpeed();
195 1 while(1)
196 1 {
197 2 if(food.yes==1)
198 2 {
199 3 while(1)
200 3 {
201 4 food.x=Random()*85+3;
202 4 food.y=Random()*55+3;//获得随机数
203 4
204 4 while(food.x%3!=0)
205 4 food.x++;
206 4 while(food.y%3!=0)
207 4 food.y++;
208 4 for(n=0;n<snake.node;n++)//判断产生的食物坐标是否和蛇身重合
209 4 {
210 5 if((food.x==snake.x[n])&&(food.y==snake.y[n]))
211 5 break;
212 5 }
213 4 if(n==snake.node)
214 4 {
215 5 food.yes=0;
216 5 break;//产生有效的食物坐标
217 5 }
218 4 }
219 3 }
220 2 if(food.yes==0)
221 2 {
222 3 Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,1);
223 3 }
224 2 for(n=snake.node-1;n>0;n--)
225 2 {
226 3 snake.x[n]=snake.x[n-1];
227 3 snake.y[n]=snake.y[n-1];
228 3 }
229 2 switch(snake.direction)
230 2 {
231 3 case DOWN:snake.x[0]+=3;break;
232 3 case UP:snake.x[0]-=3;break;
233 3 case RIGHT:snake.y[0]-=3;break;
234 3 case LEFT:snake.y[0]+=3;break;
235 3 default:break;
236 3 }
237 2 for(n=3;n<snake.node;n++)//从第三节开始判断蛇头是否咬到自己
238 2 {
239 3 if(snake.x[n]==snake.x[0]&&snake.y[n]==snake.y[0])
240 3 {
C51 COMPILER V8.02 GAME 03/12/2009 22:02:27 PAGE 5
241 4 GameOver();
242 4 snake.life=1;
243 4 break;
244 4 }
245 3 }
246 2 if(snake.x[0]<3||snake.x[0]>=90||snake.y[0]<3||snake.y[0]>=60)//判蛇头是否撞到墙壁
247 2 {
248 3 GameOver();
249 3 snake.life=1;
250 3 }
251 2 if(snake.life==1)
252 2 break;//蛇死,则跳出while(1)循环
253 2 if(snake.x[0]==food.x&&snake.y[0]==food.y)//判蛇是否吃到食物
254 2 {
255 3 Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隐食物
256 3 snake.x[snake.node]=200;
257 3 snake.y[snake.node]=200;//产生蛇新的节坐标先放在看不见的位置
258 3 snake.node++;//蛇节数加1
259 3 food.yes=1;//食物标志置1
260 3 if(++Score>=PASSSCORE)
261 3 {
262 4 PrintScore();
263 4 GameOver();
264 4 break;
265 4 }
266 3 PrintScore();
267 3 }
268 2 for(n=0;n<snake.node;n++)
269 2 {
270 3 Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,1);
271 3 }//根据蛇的节数画出蛇
272 2 delay(Speed*1000);
273 2 Lcd_Rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+2,snake.y[snake.node-1]+
-2,0);
274 2 switch(KeyBuffer)
275 2 {
276 3 case FUNC:
277 3 KeyBuffer=0;
278 3 if(++Speed>=10)
279 3 Speed=1;
280 3 PrintSpeed();
281 3 break;
282 3 case DOWN:
283 3 KeyBuffer=0;
284 3 if(snake.direction!=UP)
285 3 snake.direction=DOWN;
286 3 break;
287 3 case UP:
288 3 KeyBuffer=0;
289 3 if(snake.direction!=DOWN)
290 3 snake.direction=UP;
291 3 break;
292 3 case RIGHT:
293 3 KeyBuffer=0;
294 3 if(snake.direction!=LEFT)
295 3 snake.direction=RIGHT;
296 3 break;
297 3 case LEFT:
298 3 KeyBuffer=0;
299 3 if(snake.direction!=RIGHT)
300 3 snake.direction=LEFT;
301 3 break;
C51 COMPILER V8.02 GAME 03/12/2009 22:02:27 PAGE 6
302 3 default:
303 3 break;
304 3 }
305 2 }//结束while(1)
306 1 }
307
308 void Main()
309 {
310 1 InitCpu();//初始化CPU
311 1 Lcd_Reset(); //初始化LCD屏
312 1 Lcd_Clear(0);//清屏
313 1 DrawBoard();//画界面
314 1 GamePlay();//玩游戏
315 1 GameOver();//游戏结束
316 1 while(1);//要想重玩,只能重启,可继续完善该游戏
317 1 }
318
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1295 ----
CONSTANT SIZE = 28 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 64 12
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -