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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8897|回復: 4
收起左側

基于點陣的貪吃蛇游戲設計-51單片機初學

[復制鏈接]
ID:90853 發表于 2015-9-23 11:12 | 顯示全部樓層 |閱讀模式

基于點陣的貪吃蛇游戲設計
0.png

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

本題目要求設計一款貪吃蛇游戲,顯示器采用8*8點陣,主控采用51單片機,如果開發板上有點陣可以直接在上面進行開發。
0.png 0.png
基本要求:
1、屏幕能夠顯示出一條蛇,并且能夠通過按鍵控制其移動。
2、能夠隨機產生食物。
3、完成上面兩個要求的前提下,實現完整的游戲功能。
提高:
1、實現難度選擇功能。
2、加入關卡機制。
3、用鏈表或者隊列這類高級數據結構來實現程序功能。

參考電路:
0.png 0.png 0.png
點陣:
實際元件中,點陣的封裝不盡相同,因此需要測試出每個引腳的功能,以便正確連線。
注意,每個像素點的額定電壓在3v左右,電壓過大將會徹底損壞。
點陣的驅動方法和數碼管一樣,通過動態掃描來顯示。驅動電路可以照搬數碼管,也可以直接接在單片機的IO口上,不過顯示亮度將會受到影響。

按鍵:
略。。

參考程序:
游戲的邏輯結構大體都差不多,主要考驗大家和硬件結合的能力。


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

部分源碼預覽(完整版本請下載附件):
  1. /*************8*8點陣  貪吃蛇   ***************.****/
  2. /*****定義的坐標原點在左下角(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;//點陣使能

  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]; //存放蛇身 + 食物 行、列坐標

  19. int addx,addy;  //相對位移偏移
  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);          //延時1毫秒                        
  64.                                 }
  65.                         }                                       
  66. }

  67. void pause_she() interrupt 0                   //暫停,獨立按鍵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);          //延時1毫秒               
  90.                         }
  91.         }
  92.         
  93. }


  94. void T0_time() interrupt 1   //每50ms掃描一次按鍵
  95. {
  96.         ET0=0;                        //先關閉定時器0中斷
  97.         TR0=0;                        //關閉定時器0
  98.         TH0=(65536-50000)/256;
  99.         TL0=(65536-50000)%256;  //重裝初值 ,掃描結束后再打開定時器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;   //打開定時器0中斷
  121.         TR0=1;        //啟動定時器0
  122. }
  123. void main()
  124. {  
  125.         TMOD=0x01;                        //設置定時器0的工作方式1
  126.         TH0=(65536-50000)/256;
  127.         TL0=(65536-50000)%256;  // 每50ms就申請中斷一次
  128.         EA=1;
  129.         EX0=1;   //開外部中斷0
  130.         ET0=1;   //打開定時器0中斷
  131.         TR0=1;        //啟動定時器0
  132.         while (1)         //主循環
  133.         {               
  134.                           
  135.                         int speed=80;
  136.                         int i,again;  

  137.                          du=0;   //關點陣的行,即y
  138.                         we=0;   //關數碼管
  139.                         CS88=0;  //關點陣的列,即x
  140.         
  141.                         /*****初始化*****/
  142.                         n=4;                        //蛇長為n-1,開始的時候蛇長為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;         //放置果實
  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;//產生隨機果實
  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);                                        //若重疊則再次產生

  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;                    //移動               
  186.                 }
  187.         }        
  188. }


復制代碼

回復

使用道具 舉報

ID:1 發表于 2016-5-2 03:25 | 顯示全部樓層
51黑有你更精彩。。
回復

使用道具 舉報

ID:204070 發表于 2017-6-1 17:22 | 顯示全部樓層
很厲害啊
回復

使用道具 舉報

ID:276997 發表于 2018-1-18 20:06 | 顯示全部樓層
厲害,拿到其他開發板上可以直接用嗎
回復

使用道具 舉報

ID:252629 發表于 2018-4-11 15:03 | 顯示全部樓層
厲害了,學習學習
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品美女www爽爽爽 | 在线黄av| 成人欧美一区二区三区色青冈 | 午夜小电影 | 一区二区在线不卡 | 国产午夜精品久久久久免费视高清 | 亚洲人在线观看视频 | 中文在线观看视频 | 亚洲成色777777在线观看影院 | 日韩精品在线看 | 国产伦精品一区二区三区高清 | 亚洲一级视频在线 | 午夜影院操 | 九九九久久国产免费 | 亚洲一区影院 | 中文字幕在线不卡播放 | 欧美精品欧美精品系列 | 日韩精品一区二区三区视频播放 | 特级生活片| 综合久久一区 | 日韩在线欧美 | 97狠狠干| 九色91视频| 欧美一级免费看 | 精品国产乱码久久久久久丨区2区 | 亚洲欧美精品国产一级在线 | 精品9999 | 亚洲激情专区 | ww亚洲ww亚在线观看 | 欧洲免费毛片 | 亚洲精品电影网在线观看 | 精品一级电影 | 欧美日韩视频在线 | 亚洲精品www. | 亚洲第一色av | 日本午夜视频 | 日本欧美国产在线观看 | 久久久久久久久中文字幕 | 区一区二在线观看 | 91麻豆精品国产91久久久久久 | 国产成人精品一区二区三 |