1214|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

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. 不允许被外部调用的函数,受保护的对象
  10. **********************************************************************************************/
  11. static void Game_CreateFood(void);
  12. static void Game_AddSnake(void);
  13. static void Game_Over(void) ;
  14. static int  Game_Collide(void);
  15. static void Game_SnakeMove(void);
  16.  
  17.  
  18. /**********************************************************************************************
  19. 所引用别的文件中的全局变量
  20. **********************************************************************************************/
  21. extern uint8 ucGameBegin_Flag;
  22. extern uint8 ucGamePause_Flag;
  23. extern uint8 ucGameOver_Flag;
  24. extern INT8U ucKey;
  25. extern INT8U ucLastKey;
  26. extern long long time ;
  27.  
  28. /**********************************************************************************************
  29. 本文件中定义的全局变量,记录蛇的信息
  30. **********************************************************************************************/
  31. INT32U Snake[2][LEN]={{2,1,0},{3,3,3}};
  32. INT32U SHead = 3;
  33. INT32U SEnd = 0;
  34. INT32U Row_Food;
  35. INT32U Col_Food;
  36. INT32U uiScore = 0;
  37. uint16 uiLevel = 0;
  38. INT8U ucRow;
  39. INT8U ucCol;
  40. INT8U ucSnakeSpeed;
  41.  
  42.  
  43. /**********************************************************************************************
  44. 所取的一些游戏中需要的文字和图像的模
  45. **********************************************************************************************/
  46. INT8U ucGameOver[5][32] = 
  47. {
  48.         {0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
  49. 0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20
  50. },
  51.         {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
  52. 0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00
  53. },
  54.         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
  55. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00
  56. },
  57.         {0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
  58. 0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00
  59. },
  60.         {0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  61. 0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  62. }
  63. } ;
  64.  
  65. INT8U ucFuck[3][32] = 
  66. {
  67.         {0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
  68. 0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00
  69. },
  70.         {0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,
  71. 0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00
  72. },
  73.         {0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
  74. 0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00
  75.         }
  76. };
  77.  
  78. /*********************************************************************************************
  79. Function   : Game_CreateSnake(INT8U row, INT8U col)
  80. Content    : 创建一条蛇
  81. Parameter  : row               蛇位置的行
  82.                          col                           蛇位置的列
  83. Return     : none
  84. Date       : 2012/09/18 
  85. Description: 创建一条蛇
  86. Remark     : 
  87. **********************************************************************************************/ 
  88. void Game_CreateSnake(INT8U row, INT8U col)
  89. {
  90.         ucRow = row;
  91.         ucCol = col;
  92.  
  93.         Snake[0][0] = row;
  94.         Snake[0][1] = row;
  95.         Snake[0][2] = row;
  96.  
  97.         Snake[1][0] = col - 2;
  98.         Snake[1][1] = col - 1;
  99.         Snake[1][2] = col; 
  100.  
  101.         LCD2_DisPoint(row, col--);
  102.         LCD2_DisPoint(row, col--);
  103.         LCD2_DisPoint(row, col--);
  104.  
  105.         SEnd = 0;
  106.         SHead = 3;
  107.         Game_CreateFood();
  108.         ucSnakeSpeed = 20;
  109.  
  110.         LCD1_DisplaySco(uiScore);
  111.         LCD1_DisplayTime(time);
  112.         LCD1_ShowInt(0xcb, uiLevel);
  113. }
  114.  
  115. /*********************************************************************************************
  116. Function   : Game_CreateFood(void)
  117. Content    : 食物生成的实现函数
  118. Parameter  : void
  119. Return     : none
  120. Date       : 2012/09/18 
  121. Description: 食物生成的实现函数
  122. Remark     : 
  123. **********************************************************************************************/ 
  124. void Game_CreateFood(void)
  125. {
  126. TEST:
  127.         do
  128.         {
  129.                 Row_Food = (int)rand() % 14 + 1;
  130.                 Col_Food = (int)rand() % 30 + 1;
  131.         }while(LCD2_IfPoint(Row_Food, Col_Food));
  132.         LCD2_DisPoint(Row_Food, Col_Food);
  133.         if(!LCD2_IfPoint(Row_Food, Col_Food))
  134.                 goto TEST;
  135.         return;
  136. }
  137.  
  138. /*********************************************************************************************
  139. Function   : Game_AddSnake(void)
  140. Content    : 蛇节点的增加
  141. Parameter  : void
  142. Return     : none
  143. Date       : 2012/09/18 
  144. Description: 蛇增加一个节点,并重新随机生成一个食物
  145. Remark     : 
  146. **********************************************************************************************/ 
  147. void Game_AddSnake(void)
  148. {
  149.  
  150.         switch(ucKey)
  151.         {
  152.                 case UP:
  153.                 {
  154.                            Snake[0][SHead] = ucRow  - 1;
  155.                         Snake[1][SHead] = ucCol;
  156.                         if(SHead + 1 == LEN)
  157.                                 SHead = 0;
  158.                         else
  159.                                 SHead++;
  160.                         ucRow--;
  161.                         Game_CreateFood();
  162.                 }break;
  163.                 case DOWN:
  164.                 {
  165.                         Snake[0][SHead] = ucRow  + 1;
  166.                         Snake[1][SHead] = ucCol;
  167.                         if(SHead + 1 == LEN)
  168.                                 SHead = 0;
  169.                         else
  170.                                 SHead++;
  171.                         ucRow++;
  172.                         Game_CreateFood();
  173.                 }break;
  174.                 case LEFT:
  175.                 {
  176.                         Snake[0][SHead] = ucRow;
  177.                         Snake[1][SHead] = ucCol - 1;
  178.                         if(SHead + 1 == LEN)
  179.                                 SHead = 0;
  180.                         else
  181.                                 SHead++;
  182.                         ucCol--;
  183.                         Game_CreateFood();
  184.                 }break;
  185.                 case RIGHT:
  186.                 {
  187.                           Snake[0][SHead] = ucRow;
  188.                         Snake[1][SHead] = ucCol + 1;
  189.                         if(SHead + 1 == LEN)
  190.                                 SHead = 0;
  191.                         else
  192.                                 SHead++;
  193.                         ucCol++;
  194.                         Game_CreateFood();
  195.                 }break;
  196.         }
  197.         Music_AddSnake();
  198.         uiScore = uiScore + (22 - ucSnakeSpeed);
  199.         if((uiScore > (uiLevel * 2 + 1) * 6) && ucSnakeSpeed > 10)
  200.         {
  201.                 uiLevel++;
  202.                 if(ucSnakeSpeed > 10)
  203.                         ucSnakeSpeed = ucSnakeSpeed - 5;
  204.         }
  205.         LCD1_DisplaySco(uiScore);
  206.         LCD1_ShowInt(0xcb, uiLevel);
  207.         return;
  208. }
  209.  
  210. /*********************************************************************************************
  211. Function   : Game_Over(void)
  212. Content    : 游戏结束
  213. Parameter  : void
  214. Return     : none
  215. Date       : 2012/09/18 
  216. Description: 游戏结束界面的绘制
  217. Remark     : 
  218. **********************************************************************************************/ 
  219. void Game_Over(void)
  220. {
  221.         ucGameBegin_Flag = 0;
  222.         ucGameOver_Flag = 1;
  223.         uiScore = 0;
  224.         uiLevel = 0;
  225.         time = 0;
  226.         ucSnakeSpeed = 20;
  227.         LCD2_Init();
  228.         LCD2_DispChinese(4, 30, ucGameOver, 5);
  229.         LCD2_DispChinese(2, 40, ucFuck, 3);
  230.         Music_GameOver();
  231.         return;
  232. }
  233.  
  234. /*********************************************************************************************
  235. Function   : Game_Collide(void)
  236. Content    : 碰撞检测
  237. Parameter  : void
  238. Return     : int 
  239. Date       : 2012/09/18 
  240. Description: 蛇与障碍物的碰撞检测,还有与食物的碰撞检测
  241. Remark     : 
  242. **********************************************************************************************/ 
  243. int Game_Collide(void)
  244. {
  245.         switch(ucKey)
  246.         {
  247.                 case UP        :
  248.                 {
  249.                         if((ucRow - 1) == Row_Food && ucCol == Col_Food)
  250.                                    Game_AddSnake();
  251.                         else
  252.                         {
  253.                                 Game_Over();                
  254.                                 return 0;
  255.                         }
  256.                 }break;
  257.                 case DOWN:
  258.                 {
  259.                         if((ucRow + 1) == Row_Food && ucCol == Col_Food)
  260.                                    Game_AddSnake();
  261.                         else
  262.                         {
  263.                                 Game_Over();                
  264.                                 return 0;
  265.                         }
  266.                 }break;
  267.                 case LEFT:
  268.                 {
  269.                         if(ucRow == Row_Food && (ucCol - 1) == Col_Food)
  270.                                    Game_AddSnake();
  271.                         else
  272.                         {
  273.                                 Game_Over();                
  274.                                 return 0;
  275.                         }
  276.                 }break;
  277.                 case RIGHT:
  278.                 {
  279.                     if(ucRow == Row_Food && (ucCol + 1) == Col_Food)
  280.                                    Game_AddSnake();
  281.                         else
  282.                         {
  283.                                 Game_Over();                
  284.                                 return 0;
  285.                         }
  286.                 }break;
  287.         }
  288.         return 1;
  289. }
  290.  
  291. /*********************************************************************************************
  292. Function   : Game_SnakeMove(void)
  293. Content    : 蛇的移动
  294. Parameter  : void
  295. Return     : none
  296. Date       : 2012/09/18 
  297. Description: 蛇的移动
  298. Remark     : 
  299. **********************************************************************************************/ 
  300. void Game_SnakeMove(void)
  301. {
  302.         int i;
  303.         while(ucGamePause_Flag)
  304.                 Key_Scan();
  305.         switch(ucKey)
  306.         {
  307.                 case UP:
  308.                 {        
  309.                         if(ucLastKey == DOWN)
  310.                         {
  311.                                 ucLastKey = DOWN;
  312.                                 if(LCD2_IfPoint(ucRow + 1, ucCol))
  313.                                         i = Game_Collide();
  314.                                 if(i == 0) return;
  315.                                 LCD2_DisPoint(++ucRow, ucCol);
  316.                                 
  317.                         }
  318.                         else
  319.                         {
  320.                                 ucLastKey = UP;
  321.                                 if(LCD2_IfPoint(ucRow - 1, ucCol))
  322.                                         i = Game_Collide();
  323.                                 if(i == 0) return;
  324.                                    LCD2_DisPoint(--ucRow, ucCol);
  325.                         
  326.                         }
  327.                         
  328.                 }break;
  329.                 case DOWN:
  330.                 {
  331.                         if(ucLastKey == UP)
  332.                         {
  333.                                 ucLastKey = UP;
  334.                                 if(LCD2_IfPoint(ucRow - 1, ucCol))
  335.                                         i = Game_Collide();
  336.                                 if(i == 0) return;
  337.                                    LCD2_DisPoint(--ucRow, ucCol);
  338.                                 
  339.                         }
  340.                         else
  341.                         {
  342.                                 ucLastKey = DOWN;
  343.                                 if(LCD2_IfPoint(ucRow + 1, ucCol))
  344.                                         i = Game_Collide();
  345.                                 if(i == 0) return;
  346.                                 LCD2_DisPoint(++ucRow, ucCol);
  347.                         
  348.                         }
  349.                         
  350.                 }break;
  351.                 case LEFT:
  352.                 {
  353.                         if(ucLastKey == RIGHT)
  354.                         {
  355.                                 ucLastKey = RIGHT;
  356.                                 if(LCD2_IfPoint(ucRow, ucCol + 1))
  357.                                         i = Game_Collide();
  358.                                 if(i == 0) return;
  359.                                 LCD2_DisPoint(ucRow, ++ucCol);
  360.                         
  361.                         }
  362.                         else
  363.                         {
  364.                                 ucLastKey = LEFT;
  365.                                 if(LCD2_IfPoint(ucRow, ucCol - 1))
  366.                                         i = Game_Collide();
  367.                                 if(i == 0) return;
  368.                                    LCD2_DisPoint(ucRow, --ucCol);
  369.                         
  370.                         }
  371.                         
  372.                 }break;
  373.                 case RIGHT :
  374.                 {
  375.                         if(ucLastKey == LEFT)
  376.                         {
  377.                                 ucLastKey = LEFT;
  378.                                 if(LCD2_IfPoint(ucRow, ucCol - 1))
  379.                                         i = Game_Collide();
  380.                                 if(i == 0) return;
  381.                                    LCD2_DisPoint(ucRow, --ucCol);
  382.                                 
  383. ……………………
  384.  
  385. ………
  386.  

复制代码

 

 
点赞 关注(1)

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表