单片机论坛

 找回密码
 立即注册

QQ登录

只需一步快速开始

搜索
查看: 333|回复: 0
打印 上一主题 下一主题
收起左侧

基于protues arm2124仿真贪吃蛇程序

[复制链接]
跳转到指定楼层
楼主
mdk keil写的  直接导入hex文件就可以运行


单片机源程序如下:
  1. /*********************************************************************************************
  2. File Name  : snake.c
  3. Content    : snake management module
  4. **********************************************************************************************/
  5. #include "snake.h"


  6. /**********************************************************************************************
  7. 不允许被外部调用的函数受保护的对象
  8. **********************************************************************************************/
  9. static void Game_CreateFood(void);
  10. static void Game_AddSnake(void);
  11. static void Game_Over(void) ;
  12. static int  Game_Collide(void);
  13. static void Game_SnakeMove(void);


  14. /**********************************************************************************************
  15. 所引用别的文件中的全直量
  16. **********************************************************************************************/
  17. extern uint8 ucGameBegin_Flag;
  18. extern uint8 ucGamePause_Flag;
  19. extern uint8 ucGameOver_Flag;
  20. extern INT8U ucKey;
  21. extern INT8U ucLastKey;
  22. extern long long time ;

  23. /**********************************************************************************************
  24. 本文件中定义的全直量记录蛇的信息
  25. **********************************************************************************************/
  26. INT32U Snake[2][LEN]={{2,1,0},{3,3,3}};
  27. INT32U SHead = 3;
  28. INT32U SEnd = 0;
  29. INT32U Row_Food;
  30. INT32U Col_Food;
  31. INT32U uiScore = 0;
  32. uint16 uiLevel = 0;
  33. INT8U ucRow;
  34. INT8U ucCol;
  35. INT8U ucSnakeSpeed;


  36. /**********************************************************************************************
  37. 所取的一些游分需要的文字和图像的模
  38. **********************************************************************************************/
  39. INT8U ucGameOver[5][32] =
  40. {
  41.         {0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
  42. 0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20
  43. },
  44.         {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
  45. 0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00
  46. },
  47.         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
  48. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00
  49. },
  50.         {0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
  51. 0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00
  52. },
  53.         {0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  54. 0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  55. }
  56. } ;

  57. INT8U ucFuck[3][32] =
  58. {
  59.         {0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
  60. 0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00
  61. },
  62.         {0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,
  63. 0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00
  64. },
  65.         {0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
  66. 0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00
  67.         }
  68. };

  69. /*********************************************************************************************
  70. Function   : Game_CreateSnake(INT8U row, INT8U col)
  71. Content    : 创建一条蛇
  72. Parameter  : row               蛇位置的行
  73.                          col                           蛇位置的列
  74. Return     : none
  75. Date       : 2012/09/18
  76. Description: 创建一条蛇
  77. Remark     :
  78. **********************************************************************************************/
  79. void Game_CreateSnake(INT8U row, INT8U col)
  80. {
  81.         ucRow = row;
  82.         ucCol = col;

  83.         Snake[0][0] = row;
  84.         Snake[0][1] = row;
  85.         Snake[0][2] = row;

  86.         Snake[1][0] = col - 2;
  87.         Snake[1][1] = col - 1;
  88.         Snake[1][2] = col;

  89.         LCD2_DisPoint(row, col--);
  90.         LCD2_DisPoint(row, col--);
  91.         LCD2_DisPoint(row, col--);

  92.         SEnd = 0;
  93.         SHead = 3;
  94.         Game_CreateFood();
  95.         ucSnakeSpeed = 20;

  96.         LCD1_DisplaySco(uiScore);
  97.         LCD1_DisplayTime(time);
  98.         LCD1_ShowInt(0xcb, uiLevel);
  99. }

  100. /*********************************************************************************************
  101. Function   : Game_CreateFood(void)
  102. Content    : 食物生成的实现函数
  103. Parameter  : void
  104. Return     : none
  105. Date       : 2012/09/18
  106. Description: 食物生成的实现函数
  107. Remark     :
  108. **********************************************************************************************/
  109. void Game_CreateFood(void)
  110. {
  111. TEST:
  112.         do
  113.         {
  114.                 Row_Food = (int)rand() % 14 + 1;
  115.                 Col_Food = (int)rand() % 30 + 1;
  116.         }while(LCD2_IfPoint(Row_Food, Col_Food));
  117.         LCD2_DisPoint(Row_Food, Col_Food);
  118.         if(!LCD2_IfPoint(Row_Food, Col_Food))
  119.                 goto TEST;
  120.         return;
  121. }

  122. /*********************************************************************************************
  123. Function   : Game_AddSnake(void)
  124. Content    : 蛇节点的增加
  125. Parameter  : void
  126. Return     : none
  127. Date       : 2012/09/18
  128. Description: 蛇增加一个节点并重新随机生成一个食物
  129. Remark     :
  130. **********************************************************************************************/
  131. void Game_AddSnake(void)
  132. {

  133.         switch(ucKey)
  134.         {
  135.                 case UP:
  136.                 {
  137.                            Snake[0][SHead] = ucRow  - 1;
  138.                         Snake[1][SHead] = ucCol;
  139.                         if(SHead + 1 == LEN)
  140.                                 SHead = 0;
  141.                         else
  142.                                 SHead++;
  143.                         ucRow--;
  144.                         Game_CreateFood();
  145.                 }break;
  146.                 case DOWN:
  147.                 {
  148.                         Snake[0][SHead] = ucRow  + 1;
  149.                         Snake[1][SHead] = ucCol;
  150.                         if(SHead + 1 == LEN)
  151.                                 SHead = 0;
  152.                         else
  153.                                 SHead++;
  154.                         ucRow++;
  155.                         Game_CreateFood();
  156.                 }break;
  157.                 case LEFT:
  158.                 {
  159.                         Snake[0][SHead] = ucRow;
  160.                         Snake[1][SHead] = ucCol - 1;
  161.                         if(SHead + 1 == LEN)
  162.                                 SHead = 0;
  163.                         else
  164.                                 SHead++;
  165.                         ucCol--;
  166.                         Game_CreateFood();
  167.                 }break;
  168.                 case RIGHT:
  169.                 {
  170.                           Snake[0][SHead] = ucRow;
  171.                         Snake[1][SHead] = ucCol + 1;
  172.                         if(SHead + 1 == LEN)
  173.                                 SHead = 0;
  174.                         else
  175.                                 SHead++;
  176.                         ucCol++;
  177.                         Game_CreateFood();
  178.                 }break;
  179.         }
  180.         Music_AddSnake();
  181.         uiScore = uiScore + (22 - ucSnakeSpeed);
  182.         if((uiScore > (uiLevel * 2 + 1) * 6) && ucSnakeSpeed > 10)
  183.         {
  184.                 uiLevel++;
  185.                 if(ucSnakeSpeed > 10)
  186.                         ucSnakeSpeed = ucSnakeSpeed - 5;
  187.         }
  188.         LCD1_DisplaySco(uiScore);
  189.         LCD1_ShowInt(0xcb, uiLevel);
  190.         return;
  191. }

  192. /*********************************************************************************************
  193. Function   : Game_Over(void)
  194. Content    : 游戏结束
  195. Parameter  : void
  196. Return     : none
  197. Date       : 2012/09/18
  198. Description: 游戏结束界面的绘制
  199. Remark     :
  200. **********************************************************************************************/
  201. void Game_Over(void)
  202. {
  203.         ucGameBegin_Flag = 0;
  204.         ucGameOver_Flag = 1;
  205.         uiScore = 0;
  206.         uiLevel = 0;
  207.         time = 0;
  208.         ucSnakeSpeed = 20;
  209.         LCD2_Init();
  210.         LCD2_DispChinese(4, 30, ucGameOver, 5);
  211.         LCD2_DispChinese(2, 40, ucFuck, 3);
  212.         Music_GameOver();
  213.         return;
  214. }

  215. /*********************************************************************************************
  216. Function   : Game_Collide(void)
  217. Content    : 碰撞检测
  218. Parameter  : void
  219. Return     : int
  220. Date       : 2012/09/18
  221. Description: 蛇与障碍物的碰撞检测还有与食物的碰撞检测
  222. Remark     :
  223. **********************************************************************************************/
  224. int Game_Collide(void)
  225. {
  226.         switch(ucKey)
  227.         {
  228.                 case UP        :
  229.                 {
  230.                         if((ucRow - 1) == Row_Food && ucCol == Col_Food)
  231.                                    Game_AddSnake();
  232.                         else
  233.                         {
  234.                                 Game_Over();               
  235.                                 return 0;
  236.                         }
  237.                 }break;
  238.                 case DOWN:
  239.                 {
  240.                         if((ucRow + 1) == Row_Food && ucCol == Col_Food)
  241.                                    Game_AddSnake();
  242.                         else
  243.                         {
  244.                                 Game_Over();               
  245.                                 return 0;
  246.                         }
  247.                 }break;
  248.                 case LEFT:
  249.                 {
  250.                         if(ucRow == Row_Food && (ucCol - 1) == Col_Food)
  251.                                    Game_AddSnake();
  252.                         else
  253.                         {
  254.                                 Game_Over();               
  255.                                 return 0;
  256.                         }
  257.                 }break;
  258.                 case RIGHT:
  259.                 {
  260.                     if(ucRow == Row_Food && (ucCol + 1) == Col_Food)
  261.                                    Game_AddSnake();
  262.                         else
  263.                         {
  264.                                 Game_Over();               
  265.                                 return 0;
  266.                         }
  267.                 }break;
  268.         }
  269.         return 1;
  270. }

  271. /*********************************************************************************************
  272. Function   : Game_SnakeMove(void)
  273. Content    : 蛇的移动
  274. Parameter  : void
  275. Return     : none
  276. Date       : 2012/09/18
  277. Description: 蛇的移动
  278. Remark     :
  279. **********************************************************************************************/
  280. void Game_SnakeMove(void)
  281. {
  282.         int i;
  283.         while(ucGamePause_Flag)
  284.                 Key_Scan();
  285.         switch(ucKey)
  286.         {
  287.                 case UP:
  288.                 {       
  289.                         if(ucLastKey == DOWN)
  290.                         {
  291.                                 ucLastKey = DOWN;
  292.                                 if(LCD2_IfPoint(ucRow + 1, ucCol))
  293.                                         i = Game_Collide();
  294.                                 if(i == 0) return;
  295.                                 LCD2_DisPoint(++ucRow, ucCol);
  296.                                
  297.                         }
  298.                         else
  299.                         {
  300.                                 ucLastKey = UP;
  301.                                 if(LCD2_IfPoint(ucRow - 1, ucCol))
  302.                                         i = Game_Collide();
  303.                                 if(i == 0) return;
  304.                                    LCD2_DisPoint(--ucRow, ucCol);
  305.                        
  306.                         }
  307.                        
  308.                 }break;
  309.                 case DOWN:
  310.                 {
  311.                         if(ucLastKey == UP)
  312.                         {
  313.                                 ucLastKey = UP;
  314.                                 if(LCD2_IfPoint(ucRow - 1, ucCol))
  315.                                         i = Game_Collide();
  316.                                 if(i == 0) return;
  317.                                    LCD2_DisPoint(--ucRow, ucCol);
  318.                                
  319.                         }
  320.                         else
  321.                         {
  322.                                 ucLastKey = DOWN;
  323.                                 if(LCD2_IfPoint(ucRow + 1, ucCol))
  324.                                         i = Game_Collide();
  325.                                 if(i == 0) return;
  326.                                 LCD2_DisPoint(++ucRow, ucCol);
  327.                        
  328.                         }
  329.                        
  330.                 }break;
  331.                 case LEFT:
  332.                 {
  333.                         if(ucLastKey == RIGHT)
  334.                         {
  335.                                 ucLastKey = RIGHT;
  336.                                 if(LCD2_IfPoint(ucRow, ucCol + 1))
  337.                                         i = Game_Collide();
  338.                                 if(i == 0) return;
  339.                                 LCD2_DisPoint(ucRow, ++ucCol);
  340.                        
  341.                         }
  342.                         else
  343.                         {
  344.                                 ucLastKey = LEFT;
  345.                                 if(LCD2_IfPoint(ucRow, ucCol - 1))
  346.                                         i = Game_Collide();
  347.                                 if(i == 0) return;
  348.                                    LCD2_DisPoint(ucRow, --ucCol);
  349.                        
  350.                         }
  351.                        
  352.                 }break;
  353.                 case RIGHT :
  354.                 {
  355.                         if(ucLastKey == LEFT)
  356.                         {
  357.                                 ucLastKey = LEFT;
  358.                                 if(LCD2_IfPoint(ucRow, ucCol - 1))
  359.                                         i = Game_Collide();
  360.                                 if(i == 0) return;
  361.                                    LCD2_DisPoint(ucRow, --ucCol);
  362.                                


  363. 限于本文篇幅 余下代码请从51黑下载附件
复制代码

所有资料51hei提供下载:
my_snake.zip (312 KB, 下载问: 2)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

快速回复 返回顶部 返回列表
ձһhƬձƵ ձƵɫwww ձƵ:ɫ