找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2489|回复: 2
打印 上一主题 下一主题
收起左侧

单片机超级点阵贪吃蛇程序 MAX7219点阵屏显示 数码管计分

[复制链接]
跳转到指定楼层
楼主
无聊写了个贪吃蛇程序,用了stc89c52作为MCU,MAX7219点阵屏用于显示,TM1637数码管模块用于记分。
虽然说游戏只有8*8的显示;但是极其好玩。

制作出来的实物图如下:


单片机源程序如下:
  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黑下载附件…………
复制代码

所有资料51hei提供下载:
超级贪吃蛇.zip (31.71 KB, 下载次数: 55)

评分

参与人数 1黑币 +70 收起 理由
admin + 70 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:988587 发表于 2021-12-6 14:43 | 只看该作者
请问有PCB和protues吗?
回复

使用道具 举报

板凳
ID:989532 发表于 2021-12-8 12:39 | 只看该作者
请问贪吃蛇有protues和接线图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表