找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机IO口直接驱动点阵贪吃蛇

[复制链接]
跳转到指定楼层
楼主
ID:536598 发表于 2019-9-14 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前由于任务用51单片机做了一个贪吃蛇系统,因为没有驱动芯片,最后是直接用IO口驱动点阵,唯一的缺点是不大亮。做好一个贪吃蛇,需要考虑很多方面的东西,怎么控制它的方向,怎么控制食物的随机生成,怎么控制蛇的死亡等等,下面附上部分源代码:

main.c

  1. #include<reg52.h>
  2. #include"main.h"
  3. #include"delay.h"
  4. #include"key.h"
  5. #include"display.h"
  6. #include"gamelist.h"

  7. void main()        
  8. {
  9. u8 gameSelect = 0; //ÓÎÏ·Ñ¡Ôñ
  10. while(1)
  11. {
  12.   (*Game[gameSelect])();
  13.    
  14. }  
  15. }

  16. key.c

  17. #include"key.h"
  18. #include"main.h"
  19. #include"delay.h"
  20. ///////////////     °´¼ü¼ì²âº¯Êý      ///////////////////
  21. u8 keySelect(void){
  22. if(!KSelect){
  23.   delayMs(KEY_DELAY_MS);
  24.   if(!KSelect)
  25.    while(!KSelect);
  26.    return 1;
  27. }
  28. return 0;
  29. }
  30. u8 keyStart(void){
  31. if(!KStart){
  32.   delayMs(KEY_DELAY_MS);
  33.   if(!KStart){
  34.     while(!KStart);
  35.    return 1;
  36.   }
  37. }
  38. return 0;
  39. }
  40. u8 keyUP(void){
  41. if(!KU){
  42.   delayMs(KEY_DELAY_MS);
  43.   if(!KU)
  44.    return 1;
  45. }
  46. return 0;
  47. }
  48. u8 keyDOWN(void){
  49. if(!KD){
  50.   delayMs(KEY_DELAY_MS);
  51.   if(!KD)
  52.    return 1;
  53. }
  54. return 0;
  55. }
  56. u8 keyLEFT(void){
  57. if(!KL){
  58.   delayMs(KEY_DELAY_MS);
  59.   if(!KL)
  60.    return 1;
  61. }
  62. return 0;
  63. }
  64. u8 keyRIGHT(void){
  65. if(!KR){
  66.   delayMs(KEY_DELAY_MS);
  67.   if(!KR)return 1;
  68. }
  69. return 0;
  70. }
  71. u8 keyY(void){
  72. if(!KY){
  73.   delayMs(KEY_DELAY_MS);
  74.   if(!KY)
  75.    return 1;
  76. }
  77. return 0;
  78. }
  79. u8 keyX(void){
  80. if(!KX){
  81.   delayMs(KEY_DELAY_MS);
  82.   if(!KX)
  83.    return 1;
  84. }
  85. return 0;
  86. }
  87. u8 keyA(void){
  88. if(!KA){
  89.   delayMs(KEY_DELAY_MS);
  90.   if(!KA)
  91.    return 1;
  92. }
  93. return 0;
  94. }
  95. u8 keyB(void){
  96. if(!KB){
  97.   delayMs(KEY_DELAY_MS);
  98.   if(!KB)
  99.    return 1;
  100. }
  101. return 0;
  102. }

  103. snack.c

  104. #include"snake.h"
  105. #include<stdlib.h>
  106. #include"key.h"
  107. #include"display.h"
  108. #include"main.h"
  109. #include"delay.h"

  110. void setDir(u8 *dir_1,u8 *dir_2,u8 value){
  111.   *dir_1 = 0;
  112. *dir_2 = value;
  113. }
  114. void setHead(u8 *z,u8 dir){
  115. *z+=dir;
  116. if(*z == -1)*z = 7;
  117. else if(*z == 8)*z = 0;
  118. }
  119. void moveSnakeXY(u8 *snakeXY,const u8 num,const u8 XY){
  120. u8 i = 0;
  121. while(i<num-1){
  122.   snakeXY[i] = snakeXY[i+1];
  123.   i++;
  124. }
  125. snakeXY[i] = XY;
  126. }
  127. void changeLED(u8 (*led)[LED_WIDTH],const u8 *x,const u8 *y,u8 num,u8 apx,u8 apy){
  128. int i = 0;
  129. cleanLED(led);
  130. while(i < num){
  131.    led[y[i]][x[i]] = 1;
  132.   i++;
  133. }
  134. led[apy][apx] = 1;                    
  135. }
  136. void randXY(u8 *x,u8 *y,u8 (*led)[LED_WIDTH],u8 t){
  137. srand(t);
  138. do{
  139.    *x = rand()%8;
  140.   *y = rand()%8;
  141. }while(led[*y][*x]);
  142. led[*y][*x] = 1;
  143. }
  144. void showDegree(u8 degree){
  145. u8 i,j;
  146. for(i = 0;i<LED_HEIGHT;i++)
  147.   for(j = 0;j<=degree;j++)
  148.    setPoint(j,i);
  149. }
  150. u8 Snake(void){
  151. #define BLOCKNUM 64
  152.   u8 degree = 0,snakeNum = 1,dirX = 1,dirY = 0,dirOX,dirOY;
  153. u8 LED[LED_HEIGHT][LED_WIDTH];
  154. u8 headX = 0,headY = 0,appleX,appleY;
  155. u8 t,time;
  156. u8 r = 0;
  157. u8 snakeX[BLOCKNUM];
  158. u8 snakeY[BLOCKNUM];
  159. while(1){
  160.   showDegree(degree);
  161.   if(keySelect())
  162.    if(degree<7)degree++;
  163.    else degree = 0;
  164.   else if(keyStart())break;
  165. }
  166. time = 100-degree*10;
  167. cleanLED(LED);
  168. LED[headY][headX] = 1;
  169. snakeX[0] = headX;
  170. snakeY[0] = headY;
  171. dirOX = dirX;
  172. dirOY = dirY;
  173. randXY(&appleX,&appleY,LED,t);
  174. t = 0;
  175. while(1){
  176.   display(LED);
  177.   if(dirY!=-1 && (keyUP()||keyY()))setDir(&dirX,&dirY,-1);
  178.   else if(dirY!=1 &&(keyDOWN()||keyA()))setDir(&dirX,&dirY,1);
  179.   else if(dirX!=-1 &&(keyLEFT()||keyX()))setDir(&dirY,&dirX,-1);
  180.   else if(dirX!=1 &&(keyRIGHT()||keyB()))setDir(&dirY,&dirX,1);
  181.   

  182.   if(keyStart())
  183.    while(!keyStart())
  184.     display(LED);
  185.       
  186.   r++;
  187.   if(t++ >time){
  188.    t = 0;
  189.    if((dirX!=0 && dirOX ==0)||(dirY!=0 && dirOY==0)){
  190.      dirOX = dirX;
  191.     dirOY = dirY;
  192.    }   
  193.    setHead(&headX,dirOX);
  194.    setHead(&headY,dirOY);   
  195.    if(headY == appleY && headX == appleX){
  196.      snakeNum++;
  197.       snakeX[snakeNum-1] = appleX;
  198.      snakeY[snakeNum-1] = appleY;
  199.      randXY(&appleX,&appleY,LED,r);
  200.    }else if(!LED[headY][headX]){   
  201.      //Ç°·½ÎÞÕÏ°­
  202.     moveSnakeXY(snakeX,snakeNum,headX);
  203.     moveSnakeXY(snakeY,snakeNum,headY);
  204.    }else if(headX == snakeX[0]&& headY == snakeY[0]){//
  205.     moveSnakeXY(snakeX,snakeNum,headX);
  206.     moveSnakeXY(snakeY,snakeNum,headY);
  207.    }else {   
  208.     return GAMEOVER;
  209.    }
  210.    changeLED(LED,snakeX,snakeY,snakeNum,appleX,appleY);
  211.   }
  212. }
  213. return GAMEOVER;
复制代码



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

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表