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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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


單片機源程序如下:
  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]); //若這個點上面為1,則繼續(xù),直到這個點上面為空
  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; //難度等級,當前蛇身長度,方向變量
  53.         u8 LED[LED_HEIGHT][LED_WIDTH];//界面顯示矩陣
  54.         u8 headX = 0,headY = 0,appleX,appleY;        //蛇頭位置變量   食物位置變量
  55.         u8 t,time; //移動速度控制變量
  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;//延時長度
  68.         cleanLED(LED);//清屏
  69.         LED[headY][headX] = 1;//顯示蛇頭
  70.         //將蛇頭保存到數(shù)組第一位
  71.         snakeX[0] = headX;
  72.         snakeY[0] = headY;
  73.         //運動方向初始化
  74.         dirOX = dirX;
  75.         dirOY = dirY;
  76.         //隨機食物出現(xiàn)的位置
  77.         randXY(&appleX,&appleY,LED,t);
  78.         t = 0;
  79.         while(1){
  80.                 /*
  81.                   游戲主循環(huán)
  82.                 */
  83.                 display(LED);//顯示       
  84. //                //按鍵操作檢測,防止多余的按鍵判斷,獲取最近一次的方向               
  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.                         每隔一定時間進行移動
  97.                         以下代碼功能為移動判斷與移動操作
  98.                 */
  99.                 r++;//時間種子
  100.                 if(t++ >time){         //間隔性的移動
  101.                         t = 0;
  102.                         if((dirX!=0 && dirOX ==0)||(dirY!=0 && dirOY==0)){//合法方向輸入引用
  103.                                  dirOX = dirX;
  104.                                 dirOY = dirY;
  105.                         }                               
  106.                         setHead(&headX,dirOX);        //按照合法的輸入方向提前運動一次
  107.                         setHead(&headY,dirOY);                       
  108.                         if(headY == appleY && headX == appleX){                //若蛇頭運行的下一位是食物
  109.                                         //數(shù)組加長
  110.                                         snakeNum++;
  111.                                          snakeX[snakeNum-1] = appleX;
  112.                                         snakeY[snakeNum-1] = appleY;
  113.                                         //下一個蘋果
  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ā)蜂鳴器并返回錯誤值                       
  123.                                 return GAMEOVER;
  124.                         }
  125.                         changeLED(LED,snakeX,snakeY,snakeNum,appleX,appleY);//顯示矩陣刷新
  126.                 }
  127.         }
  128.         return GAMEOVER;//游戲結(jié)束,返回錯誤信息
  129. }                                                                                                        
復制代碼

所有資料51hei提供下載:
自制貪吃蛇游戲機資料.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

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区不卡 | 黄a大片| 精品久久久久久久久久久下田 | 久久99精品久久久水蜜桃 | 玖玖玖在线 | 久久激情视频 | 最新一级毛片 | 久久免费精品 | 久久国 | 日韩不卡视频在线 | 成人免费观看视频 | 国产精品久久久久久久久免费高清 | 91豆花视频 | 国产乱码精品一区二区三区忘忧草 | 久久久久免费精品国产小说色大师 | 99婷婷| 国产免费让你躁在线视频 | 欧美日韩亚洲二区 | 久久国产综合 | 伊人网91 | 午夜久久久 | 欧美精品91 | 久久久久av| 亚洲狠狠 | 亚洲天堂一区 | 噜噜噜噜狠狠狠7777视频 | 蜜桃在线视频 | 亚洲男人天堂av | 亚洲天天干 | 精品在线播放 | 久久国产精品免费视频 | 欧美理论片在线 | 久草免费福利 | 国产乱码精品一区二区三区中文 | 亚洲1区 | 综合国产第二页 | 久久亚洲国产精品日日av夜夜 | 欧美日本韩国一区二区 | 日韩一区二区福利视频 | 在线三级电影 | 欧美成人精品一区 |