找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)超級點陣貪吃蛇程序 MAX7219點陣屏顯示 數(shù)碼管計分

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:466381 發(fā)表于 2020-11-7 00:14 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
無聊寫了個貪吃蛇程序,用了stc89c52作為MCU,MAX7219點陣屏用于顯示,TM1637數(shù)碼管模塊用于記分。
雖然說游戲只有8*8的顯示;但是極其好玩。

制作出來的實物圖如下:


單片機(jī)源程序如下:
  1. #include "max7219.h"
  2. #include "reg52.h"
  3. #include "stdlib.h"
  4. #include "TM1637.h"
  5. #define u8 unsigned char
  6. #define u16 unsigned int
  7. u16 POINT;

  8. void Tanchishe_Init();
  9. void Write_She();
  10. void Move_She();
  11. bit Game_Over();
  12. u8 Key();
  13. void Create_Food();
  14. bit Eat_food();
  15. u8 start();
  16. u8 Last_X;
  17. u8 Last_Y;
  18. u8 S_Config;
  19. struct Snake
  20. {
  21.                 u8 direct;//方向  0上  1下   2左   3右
  22.                 u8 x_Snake[30];  //0為蛇頭
  23.                 u8 y_Snake[30];  //0為蛇尾
  24.                 u8 lenth;//長度
  25.                 u8 Food_X;//食物X
  26.                 u8 Food_Y;//食物Y
  27. }snake;
  28. void main()
  29. {
  30. //        u8 jx;        
  31.         P2=0xff;
  32.        
  33.         Init_MAX7219();
  34.         TM1637_display(POINT%10000/1000,POINT%1000/100,POINT%100/10,POINT%10,0);
  35.         while(1)
  36.         {
  37.                 put();
  38.                 Tanchishe_Init();
  39.                 S_Config=start();
  40.                 POINT=0;
  41.                 CLR();
  42.                 Write_She();
  43.                 Write_All();
  44.                 Delay_xms(500);
  45.        

  46.         while(!Game_Over())
  47.         {
  48.                 u8 HYM;
  49.                 u8 p=S_Config;
  50.                 Move_She();
  51.                 if(Eat_food())
  52.                 {
  53.                         Create_Food();
  54.                         POINT++;
  55.                 }
  56.                 TM1637_display(POINT%10000/1000,POINT%1000/100,POINT%100/10,POINT%10,0);
  57.                 CLR();
  58.                 Write_She();
  59.                 Write_All();
  60.                 while(p--)
  61.                 {
  62.                         HYM=Key();
  63.                         if(HYM!=4)
  64.                         {
  65.                                 snake.direct=HYM;
  66.                         }
  67.                         Delay_xms(2);
  68.                 }
  69.         }
  70.         //for(jx=1;jx<9;jx++)
  71.         //{
  72.         //        Write_Max7219(jx,0xff);
  73.         //}
  74.         }

  75.         //while(1);
  76. }

  77. u8 Key()
  78. {
  79.         u8 h;
  80.         switch(P2&0xf0)
  81.         {
  82.                 case 0x70:
  83.                 if(snake.direct!=1)
  84.                 {h=0;}
  85.                 else
  86.                 {h=4;}
  87.                 break;
  88.                 case 0xb0:
  89.                 if(snake.direct!=0)
  90.                 {h=1;}
  91.                 else
  92.                 {h=4;}
  93.                 break;
  94.                 case 0xd0:if(snake.direct!=3){h=2;}else{h=4;}break;
  95.                 case 0xe0:if(snake.direct!=2){h=3;}else{h=4;}break;
  96.                 default:h=4;break;
  97.         }
  98.         return h;
  99. }

  100. void Tanchishe_Init()
  101. {
  102.         snake.direct=3;
  103.         snake.x_Snake[0]=4;
  104.         snake.y_Snake[0]=2;
  105.         snake.x_Snake[1]=4;
  106.         snake.y_Snake[1]=3;
  107.         snake.x_Snake[2]=4;
  108.         snake.y_Snake[2]=4;       
  109.         snake.lenth=3;
  110. }

  111. void Write_She()
  112. {
  113.         int i;
  114.         for(i=0;i<snake.lenth;i++)
  115.         {
  116.                 Write_A_Dot(snake.x_Snake[i],snake.y_Snake[i]);
  117.         }
  118.         Write_A_Dot(snake.Food_X,snake.Food_Y);
  119. }

  120. void Move_She()
  121. {
  122.         u8 i=snake.lenth-1;
  123.         Last_X=snake.x_Snake[i];
  124.         Last_Y=snake.y_Snake[i];
  125.         switch(snake.direct)
  126.         {
  127.                 case 0:
  128.                 while(i>0)
  129.                 {
  130.                         snake.x_Snake[i]=snake.x_Snake[i-1];
  131.                         snake.y_Snake[i]=snake.y_Snake[i-1];
  132.                         i--;
  133.                 }
  134.                 snake.y_Snake[0]++;
  135.                 snake.y_Snake[0]%=8;
  136.                 break;
  137.                 case 1:
  138.                 while(i>0)
  139.                 {
  140.                         snake.x_Snake[i]=snake.x_Snake[i-1];
  141.                         snake.y_Snake[i]=snake.y_Snake[i-1];
  142.                         i--;
  143.                 }
  144.                 snake.y_Snake[0]--;       
  145.                 snake.y_Snake[0]%=8;
  146.                 break;
  147.                 case 2:
  148.                 while(i>0)
  149.                 {
  150.                         snake.x_Snake[i]=snake.x_Snake[i-1];
  151.                         snake.y_Snake[i]=snake.y_Snake[i-1];
  152.                         i--;
  153.                 }
  154.                 snake.x_Snake[0]--;
  155.                 snake.x_Snake[0]%=8;
  156.                 break;
  157.                 case 3:
  158.                 while(i>0)
  159.                 {
  160.                         snake.x_Snake[i]=snake.x_Snake[i-1];
  161.                         snake.y_Snake[i]=snake.y_Snake[i-1];
  162.                         i--;
  163.                 }
  164.                 snake.x_Snake[0]++;       
  165.                 snake.x_Snake[0]%=8;
  166.                 break;
  167.         }
  168. }


  169. void Create_Food()
  170. {
  171.         u16 x,y;
  172.         u8 j;
  173.         bit flag=0;
  174.         x=rand()/4096;
  175.         y=rand()/4096;
  176.         for(j=0;j<snake.lenth;j++)
  177.         {
  178.                 if(snake.x_Snake[j]==x&&snake.y_Snake[j]==y)
  179.                 {
  180.                         flag=1;
  181.                         break;
  182.                 }
  183.         }
  184.         if(flag)
  185.         {
  186.                 Create_Food();
  187.         }
  188.         else
  189.         {
  190.                 snake.Food_X=x;
  191.                 snake.Food_Y=y;
  192.         }
  193. }

  194. bit Eat_food()
  195. {
  196.         if(snake.Food_X==snake.x_Snake[0]&&snake.Food_Y==snake.y_Snake[0])
  197.         {
  198.                 snake.x_Snake[snake.lenth]=Last_X;
  199.                 snake.y_Snake[snake.lenth]=Last_Y;               
  200.                 snake.lenth++;               
  201.                 return 1;
  202.         }
  203.         else
  204.         {
  205.                 return 0;
  206.         }
  207. }

  208. bit Game_Over()
  209. {
  210.         u8 j;
  211.         for(j=1;j<snake.lenth;j++)
  212. ……………………

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

所有資料51hei提供下載:
超級貪吃蛇.zip (31.71 KB, 下載次數(shù): 55)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:988587 發(fā)表于 2021-12-6 14:43 | 只看該作者
請問有PCB和protues嗎?
回復(fù)

使用道具 舉報

板凳
ID:989532 發(fā)表于 2021-12-8 12:39 | 只看該作者
請問貪吃蛇有protues和接線圖嗎
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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