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

QQ登錄

只需一步,快速開(kāi)始

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

共陽(yáng)數(shù)碼管計(jì)分8*8點(diǎn)陣貪吃蛇游戲單片機(jī)源碼和proteus仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于51單片機(jī)的8*8點(diǎn)陣貪吃蛇游戲
1、器件:51單片機(jī)、點(diǎn)陣、數(shù)碼管、三極管、按鍵等
2。可以累積分?jǐn)?shù)


附上protues仿真、及程序


單片機(jī)源程序如下:

  1. #include <reg51.h>
  2. #include<stdlib.h>
  3. #define SNAKE 17                 //最大長(zhǎng)度
  4. #define TIME 50                 //顯示延時(shí)時(shí)間
  5. #define SPEED 40         //速度控制         


  6. //計(jì)分
  7. sbit sw=P3^0;     //十位公共極
  8. sbit gw=P3^1;          //個(gè)位公共極

  9. unsigned char tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,
  10.                        0x92,0x82,0xf8,0x80,0x90};           //個(gè)位

  11. unsigned char tab2[]= {0xc0,0xf9,0xa4,0xb0};          //十位
  12. sbit pause=P3^7;


  13. //定義方向   
  14. sbit  left=P3^3;
  15. sbit  down=P3^4;
  16. sbit right=P3^5;  
  17. sbit  up=P3^6;

  18. unsigned char x[SNAKE+1];                         //蛇身的坐標(biāo) 行
  19. unsigned char y[SNAKE+1];                     //蛇身的坐標(biāo) 列
  20. unsigned char time,n,i,e;              //延時(shí)時(shí)間,當(dāng)前蛇長(zhǎng),通用循環(huán)變量,當(dāng)前速度               
  21. char addx,addy;                // 移動(dòng)方向,同直角坐標(biāo)系,addx為橫向,addy為縱向
  22. bit again  ;//再次產(chǎn)生果實(shí)變量,


  23. //延時(shí)程序

  24. void delay(char MS)
  25. {
  26.   while(MS--)
  27.   ;

  28. }


  29. //判斷碰撞

  30. bit knock()
  31. {   bit k;
  32.       k=0;
  33.       if(x[1]>7||y[1]>7)  { k=1;}                             //撞墻
  34.      for(i=2;i<n;i++)
  35.            if((x[1]==x[i])&(y[1]==y[i]))    {k=1; } //撞自己
  36.     return k;       
  37. }



  38. //鍵位處理

  39. void turnkey()
  40. {
  41.    if(right==0)     {addy=0;   if(addx!=-1)  addx=1;           else   addx=-1;}
  42.      if(left==0)      {addy=0;  if(addx!=1)  addx=-1;         else addx=1;}
  43.        if(down==0)     {addx=0;   if(addy!=1)   addy=-1;       else addy=1;}
  44.         if(up==0)      {addx=0;   if(addy!=-1)   addy=1;   else addy=-1;}
  45. }


  46.                                            

  47. void score(unsigned char j)                               
  48. {
  49.        if(j<40)   
  50.            { P1=tab1[j%10];
  51.              gw=1;
  52.            delay(TIME+10) ;
  53.                 gw=0;
  54.      
  55.            P1=tab2[j/10];
  56.             sw=1;
  57.           delay(TIME+10);         
  58.                 sw=0;
  59.        }   
  60.                                                            
  61. }       
  62. //判斷具體的亮點(diǎn)

  63. char mux(unsigned char temp)
  64. {       
  65.    if(temp==7)     return 128;
  66.       if(temp==6)      return 64;
  67.          if(temp==5)     return 32;
  68.             if(temp==4)    return 16;
  69.               if(temp==3)   return 8;
  70.                 if(temp==2)   return 4;
  71.                  if(temp==1)   return 2;
  72.                    if(temp==0)   return 1;
  73.    return 0;
  74. }
  75. //顯示函數(shù),按點(diǎn)從頭到尾掃描,周期為SNAKE,掃描k個(gè)周期運(yùn)動(dòng)一格

  76. void time0 (unsigned char k,unsigned char f)          //顯示k次
  77. {  
  78.   while(k--)
  79.    {  
  80.      
  81.      for(i=0;i<SNAKE+1;i++)                               //掃描整個(gè)虛擬蛇身
  82.        {
  83.              P2=mux(x[i]);   P0=255-mux(y[i]);              //按點(diǎn)依次顯示
  84.                    turnkey();                              //上下左右鍵位處理
  85.          score(f);                                        //顯示延遲
  86.                   P2=0x00;  P0=0xff;                                   //滅燈
  87.                
  88.        }
  89.     }
  90. }

  91. void main(void)
  92. {
  93. unsigned char f=0; pause=1;
  94.    e=SPEED;                 //給運(yùn)動(dòng)速度賦初值
  95.    while(1)      
  96.    {
  97.      for(i=3;i<SNAKE+1;i++)     {   x[i]=20;         y[i]=20;  }          //初始化虛擬蛇身
  98.              
  99.         x[0]=4;   y[0]=4;           //果子位置                           
  100.            n=3;                      //起始蛇長(zhǎng) n-=1                           
  101.         x[1]=1;   y[1]=0;                //蛇頭                       
  102.         x[2]=0;   y[2]=0;                   //蛇尾1                    
  103.                                                                                                                          
  104.         addx=0;   addy=0;                                       //位移偏移
  105.                                                                                                                     
  106.                   while(1)         
  107.             {
  108.                time0(e,f) ;
  109.                                  
  110.                  if( knock() )    { e=SPEED;break; }                          //判斷碰撞

  111.                    if( (x[0]==x[1]+addx) & (y[0]==y[1]+addy) )         //如果吃到東西
  112.                    {       
  113.                                       if(f<40)   {         f++;   score(f);  }                    //加分
  114.                                                  else f=0;                                                                          
  115.                                  n++;                          //蛇身加1
  116.                                       if(n==SNAKE+1)                  //如果蛇達(dá)到最大長(zhǎng)度,進(jìn)入下一關(guān)
  117.                                       {
  118.                                          n=3;         e-=10;  //蛇身長(zhǎng)從2開(kāi)始,運(yùn)動(dòng)加速        
  119.                                           for(i=3;i<SNAKE+1;i++)  {x[i]=20; y[i]=20;}         //初始化虛擬蛇身
  120.                                 }  
  121.                                                                   
  122.                                         do                           //產(chǎn)生果實(shí)
  123.                                          {       
  124.                                                      x[0]=rand()%8;y[0]=rand()%8;//產(chǎn)生隨機(jī)果實(shí)
  125.                                                     again=0;
  126.                                                      for(i=1;i<n;i++)                        //判斷是否與蛇身重疊
  127.                                                      if((x[0]==x[i])&(y[0]==y[i]))    again=1;
  128.                                      }while(again);                                        //若重疊則再次產(chǎn)生
  129.                

  130.                     }
  131.                                          if(pause)
  132.                                          {
  133.                        for(i=n-1;i>1;i--)                                              //蛇身從尾到頭移動(dòng)
  134.                                          {x[i]=x[i-1];y[i]=y[i-1];}   
  135.                             x[1]=x[2]+addx;    y[1]=y[2]+addy;                    //蛇頭移動(dòng)1格
  136.                                     }                 
  137.                                           
  138.                                                        
  139.                           }
  140.                                          
  141.                      }               
  142. }




  143. ……………………

  144. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載:
共陽(yáng)數(shù)碼管計(jì)分點(diǎn)陣貪吃蛇.rar (63.87 KB, 下載次數(shù): 102)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:313328 發(fā)表于 2018-6-9 21:04 | 只看該作者
可以練習(xí)練習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:166284 發(fā)表于 2021-6-21 14:57 | 只看該作者
其實(shí),你可以再上傳一個(gè)數(shù)碼管的下雨模式 的代碼 ,,,,謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表