📄 main.lst
字号:
269 1 }
270 /**********************************************************
271 *函数名:MapCreate()
272 *功 能:地图生成程序
273 **********************************************************/
274 void MapCreate()
275 {
276 1 uchar i;
277 1 for (i=0;i<64;i++) //生成8X8的地图
278 1 {
279 2 switch (Map[i])//获得地图上的图形数据
280 2 { //将图形编号对应的数据写入显存
281 3 case 0:
282 3 WriteMemorizer(i,kong);//空
283 3 break;
284 3 case 1:
285 3 WriteMemorizer(i,qiang);//墙
286 3 break;
287 3 case 2:
288 3 WriteMemorizer(i,yuan);//圆
289 3 break;
290 3 case 3:
291 3 WriteMemorizer(i,xiangzi);//箱子
292 3 break;
293 3 case 4:
294 3 WriteMemorizer(i,lian);//脸
295 3 break;
296 3 case 5:
297 3 WriteMemorizer(i,shizi);//十字
298 3 break;
299 3 }
300 2 }
301 1 }
302 /**********************************************************
303 *函数名:GameDisplay()
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 6
304 *功 能:游戏图形显示程序(从左到右,从上到下)
305 * *point指向外部RAM存储的128X64的图片数据
306 **********************************************************/
307 void GameDisplay(uchar xdata *point)
308 {
309 1 uchar i,j;
310 1 LCDWriteCommand(0x34);//扩充指令集
311 1 LCDWriteCommand(0x36);//绘图显示开
312 1 for (i=0;i<32;i++) //写上半屏(32行)
313 1 {
314 2 LCDWriteCommand(0x80+i);//Y地址寄存器
315 2 LCDWriteCommand(0x80); //X地址(LCM自动加1)
316 2 for (j=0;j<16;j++)//16x8列
317 2 { //获得GamePic的首地址
318 3 LCDWriteData(*point);//写入一个字节图形数据
319 3 point++; //指向下一个图形字节
320 3 }
321 2 }
322 1 for (i=0;i<32;i++) //写下半屏
323 1 {
324 2 LCDWriteCommand(0x80+i);//Y地址寄存器
325 2 LCDWriteCommand(0x88); //X地址(LCM自动加1)
326 2 for (j=0;j<16;j++)//
327 2 {
328 3 LCDWriteData(*point);//写入一个字节图形数据
329 3 point++;
330 3 }
331 2 }
332 1 }
333 /**********************************************************
334 *函数名:ReadPosition()
335 *功 能:读得娃娃脸的当前坐标位置
336 *返 回:ReadPos
337 **********************************************************/
338 uchar ReadPosition()
339 {
340 1 uchar i;
341 1 uchar ReadPos; //定义变量存放娃娃脸的位置.
342 1 for (i=0;i<64;i++)//地图数据是64个字节
343 1 { //逐个比较找出娃娃脸
344 2 if(Map[i]==4) //娃娃脸的编号是4
345 2 {
346 3 ReadPos = i;//记录娃娃脸的坐标
347 3 break; //找到娃娃脸就跳出循环
348 3 }
349 2 }
350 1 return (ReadPos); //返回娃娃脸当前位置
351 1 }
352 /**********************************************************
353 *函数名:Readyuan()
354 *功 能:读得圆形的坐标位置(箱子移动目的地)
355 *在初次读入当前地图数据是,5(十字)也认为是圆,不然就出错,
356 *推动十字形后就少一个圆了.
357 **********************************************************/
358 void Readyuan()
359 {
360 1 uchar i,j=0;
361 1 for (i=0;i<64;i++)//地图数据是64个字节
362 1 { //圆形的编号是2
363 2 if (Map[i]==2||Map[i]==5) //找出圆形的位置
364 2 {//在编地图的时候也用十字形.
365 3 yuanPos[j] = i;//存放圆形的位置
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 7
366 3 j++; //计数圆形的个数
367 3 yuanPos[6] = j;//存放圆形的个数
368 3 }
369 2 }
370 1 }
371 /**********************************************************
372 *函数名:Refyuan()
373 *功 能:刷新显示圆形(箱子移动目的地)
374 **********************************************************/
375 void Refyuan()
376 {
377 1 uchar i; //yuanPos[6] 存放着圆形的个数(3--5个)
378 1 for (i=0;i<yuanPos[6];i++)//根据圆的个数来判断
379 1 { //判断圆形的坐标位置是否为0(空),是就显示圆形
380 2 if(Map[yuanPos[i]]==0) Map[yuanPos[i]]=2;
381 2 }
382 1 }
383 /**********************************************************
384 *函数名:Next()
385 *功 能:进入下一关
386 **********************************************************/
387 void Next()
388 { //圆形位置全变为十字形(5),说明推完了,过关
389 1 if (Map[yuanPos[0]]==5&&Map[yuanPos[1]]==5&&Map[yuanPos[2]]==5)
390 1 {//过关
391 2 guanka++; //进入下一关
392 2 if (guanka==20) guanka=0;//这里设置为20关
393 2 CopyMap(guanka);//复制地图数据
394 2 MapCreate(); //地图生成程序
395 2 GameDisplay(GamePic); //游戏界面显示程序
396 2 Readyuan(); //复制当前关卡圆形坐标和个数
397 2 }
398 1 }
399 /**********************************************************
400 *函数名:UpMove()
401 *功 能:娃娃脸向上移动
402 *说 明:向上移动是-8 (8X8的数据间隔是8)
403 *空(什么都不显示)=0,墙=1,圆=2,箱子=3,脸=4,十字=5
404 **********************************************************/
405 void UpMove()
406 {
407 1 uchar pos;
408 1 pos = ReadPosition(); //获得娃娃脸的位置
409 1 if (Map[pos-8]!=1) //判断移动方向前面是否是墙
410 1 {
411 2 switch (Map[pos-8])
412 2 {
413 3 case 0: //移动方向前面是空的执行这里
414 3 Map[pos-8] = 4;//娃娃脸的新位置
415 3 Map[pos] =0; //清空娃娃脸位置
416 3 break;
417 3 case 2: //是圆形执行这里
418 3 Map[pos-8] = 4;//娃娃脸的新位置
419 3 Map[pos] =0; //清空娃娃脸位置
420 3 break;
421 3 case 3: //移动方向前面是箱子执行这里
422 3 //箱子的前面不是墙或箱子或十字就可以移动
423 3 if (Map[pos-16]==0)
424 3 {
425 4 Map[pos-16]= 3;//显示箱子
426 4 Map[pos-8] = 4;//娃娃脸的新位置
427 4 Map[pos] = 0; //清空娃娃脸位置
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 8
428 4 }
429 3 else if (Map[pos-16]==2)
430 3 {
431 4 Map[pos-16]= 5;//显示十字形
432 4 Map[pos-8] = 4;//娃娃脸的新位置
433 4 Map[pos] = 0; //清空娃娃脸位置
434 4 }
435 3 break;
436 3 case 5: //移动方向前面是十字执行这里
437 3 //十字的前面不是墙或箱子或十字就可以移动
438 3 if (Map[pos-16]==0)
439 3 {
440 4 Map[pos-16]= 3;//显示箱子
441 4 Map[pos-8] = 4;//娃娃脸的新位置
442 4 Map[pos] = 0; //清空娃娃脸位置
443 4 }
444 3 else if (Map[pos-16]==2)
445 3 {
446 4 Map[pos-16]= 5;//显示十字形
447 4 Map[pos-8] = 4;//娃娃脸的新位置
448 4 Map[pos] = 0; //清空娃娃脸位置
449 4 }
450 3 break;
451 3 }
452 2 Refyuan(); //刷新圆形
453 2 MapCreate(); //刷新地图
454 2 GameDisplay(GamePic);//显示游戏界面
455 2 Next(); //判断是否满足进入下一关
456 2 }
457 1 }
458 /**********************************************************
459 *函数名:DownMove()
460 *功 能:娃娃脸向下移动 +8
461 **********************************************************/
462 void DownMove()
463 {
464 1 uchar pos;
465 1 pos = ReadPosition(); //获得娃娃脸的位置
466 1 if (Map[pos+8]!=1) //判断移动方向前面是否是墙
467 1 {
468 2 switch (Map[pos+8]) //得到娃娃脸前面的图形
469 2 {
470 3 case 0: //移动方向前面是空的执行这里
471 3 Map[pos+8] = 4;//娃娃脸的新位置
472 3 Map[pos] = 0; //清空娃娃脸位置
473 3 break;
474 3 case 2: //是圆形执行这里
475 3 Map[pos+8] = 4;//娃娃脸的新位置
476 3 Map[pos] = 0; //清空娃娃脸位置
477 3 break;
478 3 case 3: //移动方向前面是箱子执行这里
479 3 //箱子的前面不是墙或箱子或十字就可以移动
480 3 if (Map[pos+16]==0)
481 3 {
482 4 Map[pos+16]= 3;//显示箱子
483 4 Map[pos+8] = 4;//娃娃脸的新位置
484 4 Map[pos] = 0; //清空娃娃脸位置
485 4 }
486 3 else if(Map[pos+16]==2)
487 3 {
488 4 Map[pos+16]= 5;//显示十字形
489 4 Map[pos+8] = 4;//娃娃脸的新位置
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 9
490 4 Map[pos] = 0; //清空娃娃脸位置
491 4 }
492 3 break;
493 3 case 5: //移动方向前面是十字执行这里
494 3 //十字的前面不是墙或箱子或十字就可以移动
495 3 if (Map[pos+16]==0)
496 3 {
497 4 Map[pos+16]= 3;//显示箱子
498 4 Map[pos+8] = 4;//娃娃脸的新位置
499 4 Map[pos] = 0; //清空娃娃脸位置
500 4 }
501 3 else if(Map[pos+16]==2)
502 3 {
503 4 Map[pos+16]= 5;//显示十字形
504 4 Map[pos+8] = 4;//娃娃脸的新位置
505 4 Map[pos] = 0; //清空娃娃脸位置
506 4 }
507 3 break;
508 3 }
509 2 Refyuan(); //刷新圆形
510 2 MapCreate(); //刷新地图
511 2 GameDisplay(GamePic);//显示游戏界面
512 2 Next(); //判断是否满足进入下一关
513 2 }
514 1 }
515 /**********************************************************
516 *函数名:LeftMove()
517 *功 能:娃娃脸向左移动 -1
518 **********************************************************/
519 void LeftMove()
520 {
521 1 uchar pos;
522 1 pos = ReadPosition(); //获得娃娃脸的位置
523 1 if (Map[pos-1]!=1) //判断移动方向前面是否是墙
524 1 {
525 2 switch (Map[pos-1])
526 2 {
527 3 case 0: //移动方向前面是空的执行这里
528 3 Map[pos-1] = 4;//娃娃脸的新位置
529 3 Map[pos] =0; //清空娃娃脸位置
530 3 break;
531 3 case 2: //是圆形执行这里
532 3 Map[pos-1] = 4;//娃娃脸的新位置
533 3 Map[pos] =0; //清空娃娃脸位置
534 3 break;
535 3 case 3: //移动方向前面是箱子执行这里
536 3 //箱子的前面不是墙或箱子或十字就可以移动
537 3 if (Map[pos-2]==0)
538 3 {
539 4 Map[pos-2]= 3;//显示箱子
540 4 Map[pos-1]= 4;//娃娃脸的新位置
541 4 Map[pos] = 0; //清空娃娃脸位置
542 4 }
543 3 else if (Map[pos-2]==2)
544 3 {
545 4 Map[pos-2]= 5; //显示十字形
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -