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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6728|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

c51單片機(jī)自制貪吃蛇游戲機(jī) 含程序代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:671091 發(fā)表于 2019-12-23 14:54 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
制作出來的貪吃蛇游戲機(jī)實(shí)物圖如下:


單片機(jī)源程序如下:
  1. #include"snake.h"
  2. #include<stdlib.h>
  3. #include"key.h"
  4. #include"display.h"
  5. #include"main.h"
  6. #include"delay.h"
  7. ///////////////////////////////////////////////
  8. ///////////////     貪吃蛇     ////////////////
  9. ///////////////////////////////////////////////


  10. void setDir(u8 *dir_1,u8 *dir_2,u8 value){
  11.         *dir_1 = 0;
  12.         *dir_2 = value;
  13. }

  14. void setHead(u8 *z,u8 dir){
  15.         *z+=dir;
  16.         if(*z == -1)*z = 7;
  17.         else if(*z == 8)*z = 0;
  18. }

  19. void moveSnakeXY(u8 *snakeXY,const u8 num,const u8 XY){
  20.         u8 i = 0;
  21.         while(i<num-1){
  22.                 snakeXY[i] = snakeXY[i+1];
  23.                 i++;
  24.         }
  25.         snakeXY[i] = XY;
  26. }

  27. void changeLED(u8 (*led)[LED_WIDTH],const u8 *x,const u8 *y,u8 num,u8 apx,u8 apy){
  28.         int i = 0;
  29.         cleanLED(led);
  30.         while(i < num){
  31.                  led[y[i]][x[i]] = 1;
  32.                 i++;
  33.         }
  34.         led[apy][apx] = 1;                                                                                                                                                 
  35. }

  36. void randXY(u8 *x,u8 *y,u8 (*led)[LED_WIDTH],u8 t){
  37.         srand(t);
  38.         do{
  39.                  *x = rand()%8;
  40.                 *y = rand()%8;
  41.         }while(led[*y][*x]); //若這個(gè)點(diǎn)上面為1,則繼續(xù),直到這個(gè)點(diǎn)上面為空
  42.         led[*y][*x] = 1;
  43. }
  44. void showDegree(u8 degree){
  45.         u8 i,j;
  46.         for(i = 0;i<LED_HEIGHT;i++)
  47.                 for(j = 0;j<=degree;j++)
  48.                         setPoint(j,i);       
  49. }
  50. u8 Snake(void){
  51.         #define BLOCKNUM 64        //蛇身數(shù)組大小
  52.         u8 degree = 0,snakeNum = 1,dirX = 1,dirY = 0,dirOX,dirOY; //難度等級(jí),當(dāng)前蛇身長(zhǎng)度,方向變量
  53.         u8 LED[LED_HEIGHT][LED_WIDTH];//界面顯示矩陣
  54.         u8 headX = 0,headY = 0,appleX,appleY;        //蛇頭位置變量   食物位置變量
  55.         u8 t,time; //移動(dòng)速度控制變量
  56.         u8 r = 0;
  57.         //蛇身位置數(shù)組
  58.         u8 snakeX[BLOCKNUM];
  59.         u8 snakeY[BLOCKNUM];
  60.         while(1){ //難度選擇
  61.                 showDegree(degree);
  62.                 if(keySelect())
  63.                         if(degree<7)degree++;
  64.                         else degree = 0;
  65.                 else if(keyStart())break;
  66.         }       
  67.         time = 100-degree*10;//延時(shí)長(zhǎng)度
  68.         cleanLED(LED);//清屏
  69.         LED[headY][headX] = 1;//顯示蛇頭
  70.         //將蛇頭保存到數(shù)組第一位
  71.         snakeX[0] = headX;
  72.         snakeY[0] = headY;
  73.         //運(yùn)動(dòng)方向初始化
  74.         dirOX = dirX;
  75.         dirOY = dirY;
  76.         //隨機(jī)食物出現(xiàn)的位置
  77.         randXY(&appleX,&appleY,LED,t);
  78.         t = 0;
  79.         while(1){
  80.                 /*
  81.                   游戲主循環(huán)
  82.                 */
  83.                 display(LED);//顯示       
  84. //                //按鍵操作檢測(cè),防止多余的按鍵判斷,獲取最近一次的方向               
  85.                 if(dirY!=-1 && (keyUP()||keyY()))setDir(&dirX,&dirY,-1);
  86.                 else if(dirY!=1 &&(keyDOWN()||keyA()))setDir(&dirX,&dirY,1);
  87.                 else if(dirX!=-1 &&(keyLEFT()||keyX()))setDir(&dirY,&dirX,-1);
  88.                 else if(dirX!=1 &&(keyRIGHT()||keyB()))setDir(&dirY,&dirX,1);
  89.                
  90.                 //暫停
  91.                 if(keyStart())
  92.                         while(!keyStart())
  93.                                 display(LED);
  94.                                                                 
  95.                 /*
  96.                         每隔一定時(shí)間進(jìn)行移動(dòng)
  97.                         以下代碼功能為移動(dòng)判斷與移動(dòng)操作
  98.                 */
  99.                 r++;//時(shí)間種子
  100.                 if(t++ >time){         //間隔性的移動(dòng)
  101.                         t = 0;
  102.                         if((dirX!=0 && dirOX ==0)||(dirY!=0 && dirOY==0)){//合法方向輸入引用
  103.                                  dirOX = dirX;
  104.                                 dirOY = dirY;
  105.                         }                               
  106.                         setHead(&headX,dirOX);        //按照合法的輸入方向提前運(yùn)動(dòng)一次
  107.                         setHead(&headY,dirOY);                       
  108.                         if(headY == appleY && headX == appleX){                //若蛇頭運(yùn)行的下一位是食物
  109.                                         //數(shù)組加長(zhǎng)
  110.                                         snakeNum++;
  111.                                          snakeX[snakeNum-1] = appleX;
  112.                                         snakeY[snakeNum-1] = appleY;
  113.                                         //下一個(gè)蘋果
  114.                                         randXY(&appleX,&appleY,LED,r);
  115.                         }else if(!LED[headY][headX]){                                //若前方為無障礙物
  116.                                  //前方無障礙
  117.                                 moveSnakeXY(snakeX,snakeNum,headX);
  118.                                 moveSnakeXY(snakeY,snakeNum,headY);
  119.                         }else if(headX == snakeX[0]&& headY == snakeY[0]){//
  120.                                 moveSnakeXY(snakeX,snakeNum,headX);
  121.                                 moveSnakeXY(snakeY,snakeNum,headY);
  122.                         }else {                                //若前方有障礙物體,則觸發(fā)蜂鳴器并返回錯(cuò)誤值                       
  123.                                 return GAMEOVER;
  124.                         }
  125.                         changeLED(LED,snakeX,snakeY,snakeNum,appleX,appleY);//顯示矩陣刷新
  126.                 }
  127.         }
  128.         return GAMEOVER;//游戲結(jié)束,返回錯(cuò)誤信息
  129. }                                                                                                        
復(fù)制代碼

所有資料51hei提供下載:
自制貪吃蛇游戲機(jī)資料.7z (80.24 KB, 下載次數(shù): 38)


1555753858494.jpeg (734.54 KB, 下載次數(shù): 171)

1555753858494.jpeg

1555753874610.jpeg (420.95 KB, 下載次數(shù): 166)

1555753874610.jpeg

1555753868443.jpeg (311.43 KB, 下載次數(shù): 180)

1555753868443.jpeg

1555753883588.jpeg (646.15 KB, 下載次數(shù): 172)

1555753883588.jpeg

Screenshot_20180517-123331.png (351.7 KB, 下載次數(shù): 181)

Screenshot_20180517-123331.png

Screenshot_20180517-123316.JPG (143.54 KB, 下載次數(shù): 168)

Screenshot_20180517-123316.JPG

Screenshot_20180517-122805.png (670.85 KB, 下載次數(shù): 210)

Screenshot_20180517-122805.png

接線圖.jpg (493.49 KB, 下載次數(shù): 166)

接線圖.jpg

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1013589 發(fā)表于 2022-3-28 08:22 | 只看該作者
天!死亡走線!
(但是還是好強(qiáng))
回復(fù)

使用道具 舉報(bào)

板凳
ID:977804 發(fā)表于 2022-3-28 21:08 來自觸屏版 | 只看該作者
方格點(diǎn)陣感覺比圓點(diǎn)舒服
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人深夜小视频 | 日韩aⅴ视频 | 亚洲女优在线播放 | 久久久久久久久久久久久久久久久久久久 | 国产在线麻豆精品入口 | 日韩欧美视频网站 | 亚洲第一区久久 | 午夜精品久久久久久久久久久久久 | www.狠狠操| 国产精品自在线 | 久久久久久久久久久爱 | 欧美黄色一区 | 在线免费黄色小视频 | 国产精品久久久99 | 81精品国产乱码久久久久久 | 91麻豆精品国产91久久久更新资源速度超快 | 9999国产精品欧美久久久久久 | 中文字幕国产视频 | 91精品在线播放 | 久久网日本 | 国产精品完整版 | 老司机67194精品线观看 | 自拍 亚洲 欧美 老师 丝袜 | 羞羞视频免费在线 | 婷婷丁香综合网 | 国产一区二区三区在线视频 | 日本一区二区视频 | 日韩午夜在线观看 | 国产免费一区二区三区最新6 | 国产精品美女久久久久久免费 | xxxxxx国产 | 国产区在线观看 | 亚洲精品欧美一区二区三区 | 精品麻豆剧传媒av国产九九九 | 欧美精品一区二区在线观看 | 久久久成人动漫 | 久久久久久久久91 | 成人午夜在线 | 国产视频福利一区 | 黄色网址在线免费观看 | 天天操天天射天天 |