久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1543|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久一区 | 91丨九色丨国产在线 | 狠狠躁躁夜夜躁波多野结依 | 国产精品区二区三区日本 | 久久久久久久香蕉 | 久久久久国产 | 精品中文在线 | 久久草视频 | 国产精品欧美一区二区 | 久久久精品网 | 一区在线视频 | 国产乱码精品一区二区三区五月婷 | 日韩一区二区三区在线 | 午夜在线影院 | 日本韩国欧美在线观看 | 成人亚洲 | 亚洲视频欧美视频 | 色综合久| 国产不卡在线 | 先锋影音资源网站 | 91精品成人久久 | 久草.com| 欧美激情国产日韩精品一区18 | 91黄在线观看| 日韩精品一区二区三区中文在线 | 国产午夜精品视频 | 免费看片在线播放 | 夜夜夜夜夜夜曰天天天 | 日韩a视频| 久久一级大片 | 欧美黄色一区 | 黑人巨大精品 | 91.com视频| 日韩在线一区二区三区 | 99精品免费视频 | 日韩在线观看 | 国产我和子的乱视频网站 | 久久大陆 | 国产精品91久久久久久 | 精品九九九 | 国产探花在线精品一区二区 |