欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開始

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

基于點(diǎn)陣的貪吃蛇游戲設(shè)計(jì)-51單片機(jī)初學(xué)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:90853 發(fā)表于 2015-9-23 11:12 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

基于點(diǎn)陣的貪吃蛇游戲設(shè)計(jì)


以上全部資料打包下載:
基于點(diǎn)陣的貪吃蛇游戲設(shè)計(jì).zip (538.51 KB, 下載次數(shù): 137)

本題目要求設(shè)計(jì)一款貪吃蛇游戲,顯示器采用8*8點(diǎn)陣,主控采用51單片機(jī),如果開發(fā)板上有點(diǎn)陣可以直接在上面進(jìn)行開發(fā)。

基本要求:
1、屏幕能夠顯示出一條蛇,并且能夠通過按鍵控制其移動(dòng)。
2、能夠隨機(jī)產(chǎn)生食物。
3、完成上面兩個(gè)要求的前提下,實(shí)現(xiàn)完整的游戲功能。
提高:
1、實(shí)現(xiàn)難度選擇功能。
2、加入關(guān)卡機(jī)制。
3、用鏈表或者隊(duì)列這類高級(jí)數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)程序功能。

參考電路:

點(diǎn)陣:
實(shí)際元件中,點(diǎn)陣的封裝不盡相同,因此需要測試出每個(gè)引腳的功能,以便正確連線。
注意,每個(gè)像素點(diǎn)的額定電壓在3v左右,電壓過大將會(huì)徹底損壞。
點(diǎn)陣的驅(qū)動(dòng)方法和數(shù)碼管一樣,通過動(dòng)態(tài)掃描來顯示。驅(qū)動(dòng)電路可以照搬數(shù)碼管,也可以直接接在單片機(jī)的IO口上,不過顯示亮度將會(huì)受到影響。

按鍵:
略。。

參考程序:
游戲的邏輯結(jié)構(gòu)大體都差不多,主要考驗(yàn)大家和硬件結(jié)合的能力。


編程的過程中大家不可避免的會(huì)遇見很多困難,希望大家多多堅(jiān)持,越過這道坎后相信大家的能力也會(huì)提升不少。最后祝大家編程愉快!

部分源碼預(yù)覽(完整版本請(qǐng)下載附件):
  1. /*************8*8點(diǎn)陣  貪吃蛇   ***************.****/
  2. /*****定義的坐標(biāo)原點(diǎn)在左下角(0,0),右上角為(7,7)*********////

  3. #include <reg52.h>
  4. #include <stdlib.h>

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit we = P2^1;
  8. sbit du = P2^0;
  9. sbit CS88 = P2^2;//點(diǎn)陣使能

  10. sbit up = P3^4;  //上。下。左。右   
  11. sbit down = P3^5;
  12. sbit right = P3^7;
  13. sbit left = P3^6;

  14. sbit  k3 = P3^2;                   //外部中斷0,k3用做暫停;        

  15. char y_table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  16. char x_table[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

  17. char x[21];        
  18. char y[21]; //存放蛇身 + 食物 行、列坐標(biāo)

  19. int addx,addy;  //相對(duì)位移偏移
  20. uchar n;       //蛇長

  21. void delay(uint i)           //毫秒
  22. {
  23.         uint j;
  24.         for(;i>0;i--)
  25.                 for(j=110;j>0;j--);        
  26. }

  27. /**************************************************************
  28.                 判斷是否碰撞,是則返回1,否則返回0
  29. **************************************************************/
  30. int knock()                          
  31. {        int k=0,i;
  32.         if(x[1]>7||y[1]>7)k=1;                 //撞墻
  33.         for(i=2;i<n;i++)
  34.                 if((x[1]==x[i])&(y[1]==y[i]))k=1;  //撞自己
  35.         return k;
  36. }



  37. /**************************************************************
  38.                 顯示
  39. **************************************************************/
  40. void display(uchar n,uchar speed)                        //利用speed控制速度,speed越小,速度越快
  41. {
  42.         int j;
  43.         while(speed--)
  44.         {
  45.                 for(j=0;j<n;j++)
  46.                         {
  47.                                 du=1;                                                //消去鬼影
  48.                                 P0=0x00;
  49.                                 du=0;
  50.                                 P0=0xff;
  51.                                 CS88=1;
  52.                                 P0=0xff;
  53.                                 CS88=0;
  54.                                 P0=0x00;        

  55.                                 du=1;
  56.                                 P0=y_table[y[j]];
  57.                                 du=0;
  58.                                 P0=0xff;
  59.                                 CS88=1;
  60.                                 P0=x_table[x[j]];
  61.                                 CS88=0;
  62.                                 P0=0x00;        
  63.                                 delay(1);          //延時(shí)1毫秒                        
  64.                                 }
  65.                         }                                       
  66. }

  67. void pause_she() interrupt 0                   //暫停,獨(dú)立按鍵k3
  68. {
  69.         int speed=100,j;
  70.         while(speed--)
  71.         {        for(j=0;j<n;j++)
  72.                         {
  73.                                 du=1;                                                //消去鬼影
  74.                                 P0=0x00;
  75.                                 du=0;
  76.                                 P0=0xff;
  77.                                 CS88=1;
  78.                                 P0=0xff;
  79.                                 CS88=0;
  80.                                 P0=0x00;        

  81.                                 du=1;
  82.                                 P0=y_table[y[j]];
  83.                                 du=0;
  84.                                 P0=0xff;
  85.                                 CS88=1;
  86.                                 P0=x_table[x[j]];
  87.                                 CS88=0;
  88.                                 P0=0x00;        
  89.                                 delay(1);          //延時(shí)1毫秒               
  90.                         }
  91.         }
  92.         
  93. }


  94. void T0_time() interrupt 1   //每50ms掃描一次按鍵
  95. {
  96.         ET0=0;                        //先關(guān)閉定時(shí)器0中斷
  97.         TR0=0;                        //關(guān)閉定時(shí)器0
  98.         TH0=(65536-50000)/256;
  99.         TL0=(65536-50000)%256;  //重裝初值 ,掃描結(jié)束后再打開定時(shí)器0

  100.                         if(!left)
  101.                         {
  102.                                 addy=0;        
  103.                                 addx=-1;
  104.                          }
  105.                         if(!right)
  106.                         {
  107.                                 addy=0;
  108.                                 addx=1;
  109.                         }
  110.                         if(!up)
  111.                         {
  112.                                 addx=0;
  113.                                 addy=1;
  114.                         }
  115.                         if(!down)
  116.                         {
  117.                                 addx=0;
  118.                                 addy=-1;
  119.                         }
  120.         ET0=1;   //打開定時(shí)器0中斷
  121.         TR0=1;        //啟動(dòng)定時(shí)器0
  122. }
  123. void main()
  124. {  
  125.         TMOD=0x01;                        //設(shè)置定時(shí)器0的工作方式1
  126.         TH0=(65536-50000)/256;
  127.         TL0=(65536-50000)%256;  // 每50ms就申請(qǐng)中斷一次
  128.         EA=1;
  129.         EX0=1;   //開外部中斷0
  130.         ET0=1;   //打開定時(shí)器0中斷
  131.         TR0=1;        //啟動(dòng)定時(shí)器0
  132.         while (1)         //主循環(huán)
  133.         {               
  134.                           
  135.                         int speed=80;
  136.                         int i,again;  

  137.                          du=0;   //關(guān)點(diǎn)陣的行,即y
  138.                         we=0;   //關(guān)數(shù)碼管
  139.                         CS88=0;  //關(guān)點(diǎn)陣的列,即x
  140.         
  141.                         /*****初始化*****/
  142.                         n=4;                        //蛇長為n-1,開始的時(shí)候蛇長為2
  143.                         x[1]=3;
  144.                         y[1]=6;                        //x[1],y[1],固定放置蛇頭
  145.         
  146.                         x[2]=4;
  147.                         y[2]=6;        
  148.                         
  149.                         x[3]=5;
  150.                         y[3]=6;                //放置蛇尾
  151.                         
  152.                         x[0]=2;
  153.                         y[0]=2;         //放置果實(shí)
  154.         
  155.                         addx=0;addy=0;

  156.                 while(1)     
  157.                 {        
  158.                         display(n,speed);         //顯示
  159.                            if(knock())
  160.                         {
  161.                                 speed=80;
  162.                                 break;
  163.                         }                          //判斷碰撞
  164.                 if((x[0]==x[1]+addx)&(y[0]==y[1]+addy))         //是否吃東西
  165.             {
  166.                              n++;
  167.                              if(n==21)
  168.                             {
  169.                                         speed=80;
  170.                                          break;
  171.                             }
  172.                                 do
  173.                                 {        x[0]=rand()%8;y[0]=rand()%8;//產(chǎn)生隨機(jī)果實(shí)
  174.                                         again=0;
  175.                                         for(i=1;i<n;i++)                        //判斷是否與蛇身重疊
  176.                                         {        if((x[0]==x[i])&(y[0]==y[i]))
  177.                                                 again=1;  }
  178.                                 }while(again);                                        //若重疊則再次產(chǎn)生

  179.            }
  180.                for(i=n-1;i>1;i--)
  181.                         {
  182.                                 x[i]=x[i-1];
  183.                                 y[i]=y[i-1];
  184.                         }      
  185.                     x[1]=x[2]+addx;y[1]=y[2]+addy;                    //移動(dòng)               
  186.                 }
  187.         }        
  188. }


復(fù)制代碼

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2016-5-2 03:25 | 只看該作者
51黑有你更精彩!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:204070 發(fā)表于 2017-6-1 17:22 | 只看該作者
很厲害啊
回復(fù)

使用道具 舉報(bào)

地板
ID:276997 發(fā)表于 2018-1-18 20:06 | 只看該作者
厲害,拿到其他開發(fā)板上可以直接用嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:252629 發(fā)表于 2018-4-11 15:03 | 只看該作者
厲害了,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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