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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5747|回復: 9
收起左側

16x16點陣貪吃蛇 單片機源程序 帶注釋

  [復制鏈接]
ID:633559 發表于 2020-1-21 23:21 | 顯示全部樓層 |閱讀模式
一年前做的小玩意了,硬件丟失了,程序還在,以前都是寫在一個文件內,翻出來分成幾個文件,程序注釋寫的很詳細,希望對初入單片機的師兄有所幫助 3.png

單片機源程序如下:
  1. //=================================================================================================================================================================
  2. //軟件功能:貪吃蛇
  3. //硬件描述:最小系統+4x(8x8點陣)+ (1x(HC154)+3x(74HC14D)) + 1x(HC595)
  4. //程序描述:74595.c中有串進并出程序
  5. //          delay.c中有延遲函數
  6. //          dispaly.c中有點陣顯示函數
  7. //          anjian.c中有按鍵函數
  8. //          related.c中有初始化參數函數、游戲結束圖案函數、點陣顯示清除函數、糖果隨機函數、蛇顯示變化函數
  9. //功能概括描述:16x16點陣用于顯示、5個按鍵有旋轉按鍵、上、下、左、右按鍵
  10. //              上、下、左、右按鍵用于控制蛇上下左右移動
  11. //              有轉折點判斷(理論上蛇可以打15折)、蛇碰壁判斷、蛇速度改變判斷
  12. //=================================================================================================================================================================
  13. #include "reg52.h"                                                                                               //51頭文件
  14. #include "intrins.h"                                                                                             //部分運算符所需頭文件
  15. #include "74595.h"                                                                                               //74595程序
  16. #include "delay.h"
  17. #include "display.h"
  18. #include "anjian.h"
  19. #include "related.h"
  20. #define uchar unsigned char
  21. #define uint unsigned int
  22. //=================================================================================================================================================================
  23. //sbit Beep=P2^7;                                                                                                         //蜂鳴器
  24. uint HUANCUN[16],STX,SWX,GCUNY;                       //緩存顯示數組,蛇頭橫坐標,蛇尾橫坐標,轉折點存儲數組,果子位置存儲
  25. uchar SSS,t,STY,SWY,GUO,CBN,GCUNX,Q,cus;                         //蛇方向變量,定時器計時變量,蛇頭縱坐標,蛇尾縱坐標,轉折點反向存儲數組,糖果,計時變量,隨機數,蛇方向前一個狀態變量
  26. uchar idata ZZS[16];
  27. uint idata ZZD[16];
  28. //=================================================================================================================================================================
  29. void Init()                                                                                   //初始化
  30. {
  31.         TMOD=0x01;                                                                                                   //工作方式1
  32.         EA=1;                                                                                                               //CPU中斷開啟
  33.         ET0=1;                                                                                                             //定時器T0中斷開啟
  34.         TH0=(65536-5000)/256;                                                                 //定時5ms
  35.         TL0=(65536-5000)%256;
  36.         TR0=0;                                                                                                             //定時器關閉狀態
  37.         KS=1;                                                                                                               //開始鍵置高電平
  38. //        Beep=0;
  39. }
  40. //=================================================================================================================================================================
  41. void main()
  42. {
  43.         Init();
  44.         while(1)
  45.         {
  46.           Q=rand()%256;                                                 //隨機代碼放在while(1)函數中不停運轉
  47.                 if(TR0==0){                                                   //如果定時器在關閉狀態
  48.                         J_S();                                                           //清除緩存
  49.                         K_S();                                                           //各種數據初始化
  50.                 }else{
  51.                    if(GUO!=1){                                         //如果沒有糖果         
  52.                      SUI_JI();                                         //調用隨機子程序
  53.                            t--;                                                           //蛇的速度加快
  54.                            CBN=t;                                                   //CBN用于保存改變后的t
  55.                    }
  56.                  }
  57.                 XIANSI();                                                           //循環顯示函數
  58.         }
  59. }
  60. //=================================================================================================================================================================
  61. void time0() interrupt 1
  62. {
  63.         TH0=(65536-5000)/256;
  64.         TL0=(65536-5000)%256;
  65.         AN_J();                                       //調用按鍵子程序         
  66.         if((--CBN==0)||(cus!=SSS)){
  67.           CBN=t;                                                                               //CBN隨t的變化而變化
  68.           SE_BH();                                                                             //調用蛇變子程序
  69.         }
  70. }
  71. //=================================================================================================================================================================
復制代碼
  1. #include "related.h"
  2. //=================================================================================================================================================================
  3. extern uchar SSS,t,STY,SWY,GUO,GCUNX,Q;
  4. extern uint HUANCUN[16],STX,SWX,GCUNY;
  5. extern uchar idata ZZS[16];
  6. extern uint idata ZZD[16];
  7. //=================================================================================================================================================================
  8. //功能描述:開始鍵按下后,初始化各種參數
  9. //=================================================================================================================================================================
  10. void K_S()
  11. {
  12.         uchar i;
  13.         if(KS==0){                                                                  //如果開始鍵按下           
  14.           QC_HC();
  15.           SSS=2;                                                                    //蛇方向向右
  16.           t=50;                                                                      //蛇初始速度
  17.           SWY=7;                                                                    //蛇尾初始縱坐標
  18.           STY=7;                                                                    //蛇頭初始縱坐標
  19.           STX=0x0040;                                                          //蛇頭初始橫坐標
  20.           SWX=0x0100;                                                          //蛇尾初始橫坐標
  21.           HUANCUN[7]=0x01c0;                                //初始化蛇全身
  22.           ZZS[0]=SSS;                                                          //存儲蛇的方向
  23.           for(i=0;i<16;i++){
  24.             ZZD[i]=0xffff;
  25.           }
  26.           GUO=0;                                                                    //無糖果
  27.           TR0=1;                                                                    //定時器開啟
  28.         }
  29. }
  30. //=================================================================================================================================================================
  31. //功能描述:游戲結束后顯示預設圖案
  32. //=================================================================================================================================================================
  33. void J_S()                                                                                      //結束子程序
  34. {
  35.         QC_HC();
  36.   HUANCUN[2]=0x0ff0;                                                                                  //顯示笑臉
  37.         HUANCUN[3]=0x1008;
  38.          HUANCUN[4]=0x2424;
  39.   HUANCUN[5]=0x2a54;
  40.         HUANCUN[6]=0x2004;
  41.         HUANCUN[7]=0x2004;
  42.         HUANCUN[8]=0x2004;
  43.         HUANCUN[9]=0x2004;
  44.   HUANCUN[10]=0x2244;
  45.         HUANCUN[11]=0x2184;
  46.         HUANCUN[12]=0x1008;
  47.   HUANCUN[13]=0x0ff0;
  48. }
  49. //=================================================================================================================================================================
  50. //功能描述:16x16點陣顯示清除
  51. //=================================================================================================================================================================
  52. void QC_HC()                                                                                                  //清除緩存子程序
  53. {
  54.         uchar i;
  55.         for(i=0;i<16;i++){                                                                  //緩存清零
  56.           HUANCUN[i]=0;
  57.         }         
  58. }
  59. //=================================================================================================================================================================
  60. //功能說明:”糖果“隨機函數
  61. //程序說明:Q取0~255之間的數,對應16x16點陣上的256個點
  62. //          Q/16取16x16點陣的哪一行,0x0001<<(Q%16)取16x16點陣的哪一列
  63. //          Q隨機出一個數后,有可能點陣上的點是亮著的,要重新隨機,直到隨機到沒亮著的點
  64. //          然后改變對應緩存顯示數組HUANCUN[]里的數據
  65. //          16x16點陣是以左上角為原點的一個坐標(不過y軸不是負的),記錄下對應點的橫坐標和縱坐標
  66. //          改變“糖果”的狀態變量GUO=1,就是說當前有“糖果”在
  67. //=================================================================================================================================================================
  68. void SUI_JI()
  69. {
  70.         while(HUANCUN[Q/16]&(0x0001<<(Q%16)))        //判斷隨機數對應的點陣上的點是否是滅的狀態
  71.         {
  72.                 Q=rand()%256;                                                                                           //如果是亮的,那么再隨機一次,直到隨機到滅的點
  73.         }
  74.         HUANCUN[Q/16]|=(0x0001<<(Q%16));                         //讓這個點亮起來
  75.         GCUNX=Q/16;                                                                                                     //記錄該點的橫坐標和縱坐標
  76.         GCUNY=(0x0001<<(Q%16));
  77.         GUO=1;                                                                                                                     //記錄糖果狀態
  78. }
  79. //=================================================================================================================================================================
  80. //功能說明:當蛇尾處在轉折點處時,這個轉折點數據沒用了,判斷蛇還有沒有轉折點,如果有,覆蓋掉這個轉折點
  81. //          根據改變后的轉折點,確定蛇尾的坐標
  82. //=================================================================================================================================================================
  83. void ZZ_X()
  84. {
  85.         uchar i;
  86.         if(ZZS[1]!=0){                                                                          //如果有第二個轉折點                                                                                   
  87.           for(i=0;i<15;i++){                                                        //把第一個轉折點覆蓋   
  88.                   ZZD[i]=ZZD[i+1];
  89.                   ZZS[i]=ZZS[i+1];                                                                  
  90.           }
  91.         }
  92.         switch(ZZS[0])                                                                                                  //判斷改變后蛇的方向,而后改變蛇尾坐標
  93.         {
  94.                 case 1:
  95.                         SWY--;
  96.                   break;   
  97.           case 2:
  98.                         SWX>>=1;
  99.                   break;
  100.                 case 3:
  101.                         SWY++;
  102.                   break;
  103.                 case 4:
  104.                         SWX<<=1;
  105.                   break;               
  106.         }        
  107. }
  108. //=================================================================================================================================================================
  109. //思維說明:蛇移動是不是要判斷前面有沒有障礙物?這個障礙物有可能是蛇的身體,也有可能是糖果。還有,蛇會不會碰壁呢?
  110. //程序說明:根據蛇的方向(SSS)來分成4種情況,
  111. //          蛇頭就是一個點,這個點被記錄下橫(STY)和縱坐標(STX),再加上記錄下的方向(SSS),可以確定蛇頭的下一個位置
  112. //          當SSS=1時,蛇向上移動,把蛇頭橫坐標(STX)和緩存顯示數組HUANCUN[STY-1]相與,確定該位置是否被點亮,為什么是STY-1呢?點陣第一行對應HUANCUN[0]
  113. //          當該位置沒被點亮時,表示蛇可以移動上去了,把蛇頭的坐標改變
  114. //          否則,把該位置的坐標和糖果的坐標比較,如果是糖果位置,蛇頭一樣可變。其他情況游戲結束,關定時器TR0        
  115. //          其他3種情況分析同上
  116. //          蛇尾也不能忘了,一條蛇只標蛇頭可不行
  117. //          如果蛇吃了糖果,那么蛇頭長了一點,蛇尾不用變,蛇頭坐標變后跳出函數就行了
  118. //          否則,就要讓蛇尾滅掉HUANCUN[SWY]&=(~SWX);
  119. //          再則,一條蛇可會轉彎的哦,那么必須要有轉折點,不止一個,要判斷,如果需要的話,要做改變
  120. //=================================================================================================================================================================
  121. void SE_BH()                                                                                                   //蛇變子程序
  122. {
  123.         switch(SSS)
  124.   {
  125.                 case 1:
  126.                         if(STY>0){                                         //大于0是要判斷的,因為下面HUANCUN[STY-1]
  127.                     if((HUANCUN[STY-1]&STX)==0)                                                     //判斷下一個蛇坐標是否是滅的
  128.                 STY--;                                                                                                     //蛇頭坐標改變
  129.                 else{
  130.                                if(((STY-1)==GCUNX)&&(STX==GCUNY)){                       //否則,判斷該點是否是糖果點                                   
  131.                     STY--;                                                                                           //蛇頭坐標改變
  132.                                 GUO=0;                                                                                           //糖果變量清零
  133.                                            }else
  134.                                        TR0=0;                                                                                    //定時器關閉
  135.                                            return;                                                                                             //跳出
  136.                       }
  137.                         }else{
  138.                                  TR0=0;
  139.                                  return;
  140.                          }
  141.       break;
  142.                 case 2:
  143.                   if((HUANCUN[STY]&(STX>>1))==0)
  144.               STX>>=1;
  145.               else{
  146.                        if((STY==GCUNX)&&((STX>>1)==GCUNY)){
  147.                   STX>>=1;                                                                               //蛇頭橫坐標右移一位
  148.                         GUO=0;
  149.                       }else
  150.                          TR0=0;
  151.                       return;
  152.                                 }
  153.                         break;  
  154.     case 3:
  155.                   if((HUANCUN[STY+1]&STX)==0)
  156.               STY++;                                                                                           //蛇頭縱坐標減一位
  157.               else{
  158.                 if(((STY+1)==GCUNX)&&(STX==GCUNY)){
  159.                   STY++;
  160.                         GUO=0;
  161.                              }else
  162.                                 TR0=0;
  163.                       return;
  164.                                 }
  165.                   break;                                                               
  166.     case 4:
  167.                   if((HUANCUN[STY]&(STX<<1))==0)
  168.               STX<<=1;
  169.               else{
  170.                 if((STY==GCUNX)&&((STX<<1)==GCUNY)){
  171.                   STX<<=1;
  172.                         GUO=0;
  173.                       }else  
  174.                          TR0=0;
  175.                       return;
  176.                     }
  177.                         break;
  178.   }
  179.         if((STX!=0)&&(STY>=0)&&(STY<16)){                                        //如果蛇頭沒超出邊界
  180.           HUANCUN[STY]|=STX;                                                    //讓蛇頭亮起
  181.           HUANCUN[SWY]&=(~SWX);                                      //讓蛇尾滅掉
  182.           switch(ZZS[0])
  183.           {
  184.                         case 1:
  185.                                 if(SWY!=ZZD[0])
  186.                                         SWY--;
  187.                             else ZZ_X();
  188.                                 break;
  189.                         case 2:
  190.                                 if(SWX!=ZZD[0])
  191.                                         SWX>>=1;
  192.                             else ZZ_X();
  193.                                 break;
  194.                         case 3:
  195.                                 if(SWY!=ZZD[0])
  196.                                         SWY++;
  197.                                          else ZZ_X();
  198.                                 break;
  199.                         case 4:
  200.                                 if(SWX!=ZZD[0])
  201.                                         SWX<<=1;
  202.                             else ZZ_X();
  203.                                 break;
  204.           }
  205.         }else{
  206.                  TR0=0;
  207. //                 return;
  208.    }        
  209. }
  210. //=================================================================================================================================================================
復制代碼

  1. #include "anjian.h"

  2. extern uchar cus,STY,SSS;
  3. extern uint STX;
  4. extern uchar idata ZZS[16];
  5. extern uint idata ZZD[16];
  6. //=================================================================================================================================================================
  7. //思維說明:4個按鍵控制蛇的方向,當蛇往一個方向移動的時候,控制蛇在這一線上的移動方向的兩個按鍵會失效,只有兩個鍵有用
  8. //程序說明:SSS表示蛇方向的一個變量,有4個方向,取值范圍是1~4
  9. //          當蛇的方向改變是,存儲轉折點的橫或縱坐標放在數組ZZD[],存儲轉折點的方向存在ZZS[]
  10. //          蛇尾是跟著存儲起來的轉折點轉向的,一個點的坐標用橫坐標和縱坐標兩個坐標表示的,這里為了節省存儲空間,
  11. //          當蛇在橫向上移動的時候,可以只存橫坐標,為什么存橫坐標?因為這個時候縱坐標不變
  12. //          當蛇在縱向上移動的時候,可以只存縱坐標
  13. //=================================================================================================================================================================
  14. void AN_J()                                                                                    //按鍵子程序
  15. {
  16.         static uchar a=1,b=1,c=1,d=1;                                  //定義4個方向鍵的狀態變量
  17.         uchar i;
  18.         cus=SSS;                                                                                    //保存蛇的方向
  19.         if(SHANG!=a){                                                                          //比較按鍵當前狀態和前一個狀態是否一致
  20.           if(a==1){                                                                                  //前一個狀態是否是高電平  
  21.             if((SSS!=1)&&(SSS!=3)){                                          //蛇的狀態是左右的時候,才生效         
  22.                    SSS=1;
  23.                   }
  24.           }
  25.           a=SHANG;                                                                                  //鎖住,直到下一次按鍵按下才會再進來
  26.         }
  27.         if(YOU!=b){
  28.           if(b==1){
  29.             if((SSS!=2)&&(SSS!=4)){
  30.                     SSS=2;
  31.                   }
  32.           }
  33.           b=YOU;
  34.         }
  35.         if(XIA!=c){
  36.           if(c==1){   
  37.             if((SSS!=1)&&(SSS!=3)){         
  38.                     SSS=3;
  39.                   }
  40.           }
  41.           c=XIA;
  42.         }
  43.         if(ZUO!=d){
  44.           if(d==1){
  45.             if((SSS!=2)&&(SSS!=4)){
  46.                     SSS=4;
  47.                   }
  48.           }
  49.           d=ZUO;
  50.         }
  51.         if(cus!=SSS){                                                                            //如果蛇的方向改變了
  52.           for(i=0;i<16;i++){                                                        //從第一個轉折點開始判斷   
  53.             if(ZZD[i]==0xffff){                              //如果轉折點是0xffff,說明后面沒有轉折點了                  
  54.                           ZZS[i+1]=SSS;                                                          //把當前蛇的方向存儲起來
  55.                           if((cus==1)||(cus==3)){                        //如果蛇前一個方向是上下               
  56.                             ZZD[i]=STY;                                                          //把轉折點的縱坐標存儲起來
  57.                           }else ZZD[i]=STX;                                                //否則,存橫坐標
  58.                           break;                                                                            //跳出
  59.                   }
  60.           }
  61.         }
  62. }
  63. //=================================================================================================================================================================
復制代碼

原理圖: 無
仿真: 無
代碼: 貪吃蛇.rar (58.42 KB, 下載次數: 101)

評分

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

查看全部評分

回復

使用道具 舉報

ID:935960 發表于 2021-6-14 18:25 | 顯示全部樓層
原理圖有嗎?
回復

使用道具 舉報

ID:554271 發表于 2021-6-22 15:28 | 顯示全部樓層
請問博主有那個原理圖嗎?
回復

使用道具 舉報

ID:981729 發表于 2021-11-17 09:18 | 顯示全部樓層
請問樓主有原理圖嗎
回復

使用道具 舉報

ID:633559 發表于 2022-1-18 21:33 | 顯示全部樓層
呵,現在看來當是做的太水了,找了下工程還在

俄羅斯方塊.rar

807.26 KB, 下載次數: 12, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:633559 發表于 2022-1-18 21:34 | 顯示全部樓層

找了下,還在,上傳了
回復

使用道具 舉報

ID:633559 發表于 2022-1-18 21:43 | 顯示全部樓層
想進步要學習 發表于 2022-1-18 21:33
呵,現在看來當是做的太水了,找了下工程還在

哎呀,想起來了,這圖不對,當是8255沒弄成,后面弄了個洞洞板焊了兩個74LS595替換這部分電路了
回復

使用道具 舉報

ID:292494 發表于 2022-2-7 21:24 來自手機 | 顯示全部樓層
rand()這個函數是什么意思
回復

使用道具 舉報

ID:883031 發表于 2022-2-8 10:47 | 顯示全部樓層
看世界 發表于 2022-2-7 21:24
rand()這個函數是什么意思

Rand()rand函數沒有參數,rand函數返回一個大于等于0小于1的隨機數。
回復

使用道具 舉報

ID:1106340 發表于 2023-12-29 20:40 | 顯示全部樓層
有沒有原理圖啊鐵子
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本久久综合网 | 国产女人第一次做爰毛片 | 国产精品99精品久久免费 | 国际精品鲁一鲁一区二区小说 | 男女午夜激情视频 | 日韩精品免费在线观看 | 玖玖久久| 99精品视频在线 | 日韩手机在线看片 | 国产综合av | 中文二区 | 精品视频在线播放 | 在线观看不卡av | 国产亚洲黄色片 | 日韩视频精品 | 日韩毛片免费看 | 国产资源视频 | 欧美精品一区免费 | 99亚洲精品 | 99久久国产综合精品麻豆 | 国产欧美一区二区三区在线看 | 黄色大片视频 | 色婷婷综合久久久中字幕精品久久 | 91国产在线播放 | 欧美久久免费观看 | 91在线精品一区二区 | 色综合一区二区三区 | 黑人巨大精品欧美一区二区免费 | 亚洲国产区 | 欧美日韩专区 | 国产精品久久久久久婷婷天堂 | 亚洲精品资源 | 亚洲视频一区二区三区 | 日韩综合在线 | 亚洲 欧美 在线 一区 | 亚洲精品视频在线 | 免费特黄视频 | 一区二区视频在线 | 男人午夜视频 | 狠狠色综合久久丁香婷婷 | 国产黄色av网站 |