找回密码
 立即注册

QQ登录

只需一步,快速开始

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

共阳数码管计分8*8点阵贪吃蛇游戏单片机源码和proteus仿真

[复制链接]
跳转到指定楼层
楼主
基于51单片机的8*8点阵贪吃蛇游戏
1、器件:51单片机、点阵、数码管、三极管、按键等
2。可以累积分数


附上protues仿真、及程序


单片机源程序如下:

  1. #include <reg51.h>
  2. #include<stdlib.h>
  3. #define SNAKE 17                 //最大长度
  4. #define TIME 50                 //显示延时时间
  5. #define SPEED 40         //速度控制         


  6. //计分
  7. sbit sw=P3^0;     //十位公共极
  8. sbit gw=P3^1;          //个位公共极

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

  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];                         //蛇身的坐标 行
  19. unsigned char y[SNAKE+1];                     //蛇身的坐标 列
  20. unsigned char time,n,i,e;              //延时时间,当前蛇长,通用循环变量,当前速度               
  21. char addx,addy;                // 移动方向,同直角坐标系,addx为横向,addy为纵向
  22. bit again  ;//再次产生果实变量,


  23. //延时程序

  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. //判断具体的亮点

  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. //显示函数,按点从头到尾扫描,周期为SNAKE,扫描k个周期运动一格

  76. void time0 (unsigned char k,unsigned char f)          //显示k次
  77. {  
  78.   while(k--)
  79.    {  
  80.      
  81.      for(i=0;i<SNAKE+1;i++)                               //扫描整个虚拟蛇身
  82.        {
  83.              P2=mux(x[i]);   P0=255-mux(y[i]);              //按点依次显示
  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;                 //给运动速度赋初值
  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;                      //起始蛇长 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)                  //如果蛇达到最大长度,进入下一关
  117.                                       {
  118.                                          n=3;         e-=10;  //蛇身长从2开始,运动加速        
  119.                                           for(i=3;i<SNAKE+1;i++)  {x[i]=20; y[i]=20;}         //初始化虚拟蛇身
  120.                                 }  
  121.                                                                   
  122.                                         do                           //产生果实
  123.                                          {       
  124.                                                      x[0]=rand()%8;y[0]=rand()%8;//产生随机果实
  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);                                        //若重叠则再次产生
  129.                

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




  143. ……………………

  144. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
共阳数码管计分点阵贪吃蛇.rar (63.87 KB, 下载次数: 102)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:313328 发表于 2018-6-9 21:04 | 只看该作者
可以练习练习
回复

使用道具 举报

板凳
ID:166284 发表于 2021-6-21 14:57 | 只看该作者
其实,你可以再上传一个数码管的下雨模式 的代码 ,,,,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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