[应用方案] 用单片机控制8*8点阵的贪吃蛇

[复制链接]
 楼主| lovecat2015 发表于 2016-5-15 22:37 | 显示全部楼层 |阅读模式
  1. #include<stc12.h>      //用六个按键四个方向键 一个暂停键 一个重新开始健
  2. #include<stdlib.h>      //P1控制正极 P0控制负极
  3. #define uint unsigned int    //
  4. #define uchar unsigned char
  5. int addx,addy,n,s1,s2,e,a,b,c,d,k;   //addx addy位移改变量  n蛇身长度 s1,s2新果实的位置
  6. uchar x[21];       //a重新开始标志 b暂停标志 e代表蛇身运动速度大小
  7. uchar y[21];       //两个数组用来储存蛇身的地址
  8. void key();
  9. void deal();
  10. void move(int);
  11. uchar mux(int);
  12. void delay(uint);
  13. void main()
  14. {
  15. n=3,e=300,addx=0,addy=0,k=0;        //最初游戏设定
  16. x[0]=7;y[0]=2;          //果实
  17. x[1]=7;y[1]=7;               //蛇尾
  18. x[2]=7;y[2]=6;          //蛇身
  19.   x[n]=7;y[n]=5;             //蛇头
  20. P0=0x7f;P1=0xe4;
  21. while(1)
  22. {
  23.   key();
  24.   if(b==0)
  25.   {
  26.   key();
  27.   move(e);
  28.   deal();
  29.   }
  30.   if(b==1)
  31.   { uint i;             //
  32.       for(i=0;i<=n;i++)         //
  33.         {             //
  34.        P0=255-mux(x);P1=mux(y);     //
  35.        delay(5);          //
  36.        P0=0xff;P1=0x00;              //和数码管的消影差不多的作用
  37.    }
  38.   }
  39. }
  40. }
  41. void move(int e)  //实现移动
  42. {
  43. uint i;
  44. if(k>0)
  45. {
  46.   while(e--)            //
  47.   {              //
  48.      for(i=0;i<=n;i++)          //
  49.        {              //
  50.       P0=255-mux(x);P1=mux(y);      //
  51.       key();            //
  52.       delay(5);           //
  53.       P0=0xff;P1=0x00;                  //和数码管的消影差不多的作用
  54.       }
  55.   }                 //
  56.   for(i=1;i<n;i++)          //
  57.   {x=x[i+1];y=y[i+1];}        //
  58.   x[n]=x+addx;y[n]=y+addy;       //              
  59. }
  60. }
  61. void deal()             //判断函数
  62. {
  63. uint i;
  64. if(x[n]>7|x[n]<0|y[n]>7|y[n]<0)       //撞墙而死
  65. {
  66.   P0=0xef;P1=0x5e;delay(10000);      //游戏结束标志         
  67.   n=3,e=300,addx=0,addy=0,a=0,b=0,k=0;     //最初游戏设定
  68.   x[0]=7;y[0]=2;          //果实
  69.   x[1]=7;y[1]=7;               //蛇尾
  70.   x[2]=7;y[2]=6;          //蛇身
  71.    x[n]=7;y[n]=5;             //蛇头
  72.   P0=0x7f;P1=0xe4;      
  73. }
  74. for(i=1;i<n;i++)          //撞自己而死
  75. {
  76.   if(x==x[n]&y==y[n])
  77.   {
  78.    P0=0xef;P1=0x5e;delay(30000);      //游戏结束标志
  79.    n=3,e=300,addx=0,addy=0,a=0,b=0,k=0;   //回到最初游戏设定
  80.    x[1]=7;y[1]=7;            //蛇尾
  81.    x[2]=7;y[2]=6;
  82.       x[n]=7;y[n]=5;          //蛇头
  83.    P0=0x7f;P1=0xe4;
  84.   }         
  85. }
  86. if((x[0]==x[n]+addx)&(y[0]==y[n]+addy))   //判断是否吃到果实
  87. {
  88.   n=n+1;
  89.   x[n]=x[0];y[n]=y[0];
  90.   if(n==13)         //判断是否过关
  91.   { e=e-50;          //
  92.    P0=0x00;P1=0xff;delay(30000);      //游戏结束标志
  93.    n=3,addx=0,addy=0,a=0,b=0,k=0;      //回到最初游戏设定
  94.    x[1]=7;y[1]=7;            //蛇尾
  95.    x[2]=7;y[2]=6;
  96.       x[n]=7;y[n]=5;          //蛇头
  97.    P0=0x7f;P1=0xe0;         
  98.   }
  99.   c=rand(); s1=c%10000%1000%100%10;
  100.   d=rand(); s2=d%10000%1000%100%10;   // 新的果实
  101.   if(s1>6)  s1=s1-3;
  102.   if(s2>6)  s2=s2-3;
  103.   x[0]=s1;y[0]=s2;       //
  104.   for(i=1;i<n;i++)       //判断是否与蛇身重合
  105.   {
  106.     if((x[0]==x)&(y[0]==y))
  107.     {
  108.      c=rand(); s1=c%10000%1000%100%10;
  109.    d=rand(); s2=d%10000%1000%100%10;  
  110.    if(s1>6)  s1=s1-3;
  111.    if(s2>6)  s2=s2-3;
  112.    x[0]=s1;y[0]=s2;      // 新的果实
  113.    i=1;
  114.     }
  115.     }
  116. }
  117. }
  118. void key()             //矩阵按键扫描
  119. {
  120. uchar t;
  121. P3=0xdf;
  122. t=P3;
  123. t=t&0x1c;
  124. if(t!=0x1c)
  125. {
  126.   delay(10);
  127.   t=P3;
  128.   t=t&0x1c;
  129.   if(t!=0x1c)
  130.    {
  131.     t=P3;
  132.    switch(t)
  133.    {
  134.     case 0xdb:a=1;break;
  135.     case 0xd7:k=1;break;
  136.     case 0xcf:b++;break;
  137.     default:  break;
  138.    }
  139.    while(t!=0x1c)
  140.    {
  141.     t=P3;
  142.     t=t&0x1c;
  143.    }
  144.    }
  145. }


 楼主| lovecat2015 发表于 2016-5-15 22:37 | 显示全部楼层
  1. P3=0xbf;
  2. t=P3;
  3. t=t&0x1c;
  4. if(t!=0x1c)
  5. {
  6.   delay(10);
  7.   t=P3;
  8.   t=t&0x1c;
  9.   if(t!=0x1c)
  10.    {
  11.     t=P3;
  12.    switch(t)
  13.    {
  14.     case 0xbb:k=2;break;
  15.     case 0xb7:k=3;break;
  16.     case 0xaf:k=4;break;
  17.     default:  break;
  18.    }
  19.    while(t!=0x1c)
  20.    {
  21.     t=P3;
  22.     t=t&0x1c;
  23.    }
  24.    }
  25. }
  26. b=b%2;
  27. switch(k)
  28. {
  29.   case 1: addy=-1,addx=0;break;
  30.   case 2: addx=1,addy=0;break;
  31.   case 3: addy=1,addx=0;break;
  32.   case 4: addx=-1,addy=0;break;
  33. }
  34. }
  35. uchar mux(int temp)      //十进制转化为十六进制
  36. {
  37. if(temp==7)return 128;
  38. if(temp==6)return 64;
  39. if(temp==5)return 32;
  40. if(temp==4)return 16;
  41. if(temp==3)return 8;
  42. if(temp==2)return 4;
  43. if(temp==1)return 2;
  44. if(temp==0)return 1;
  45.            return 0;
  46. }
  47. void delay(uint z)
  48. {
  49. uint x,y;
  50. for(x=z;x>0;x--)
  51.   for(y=110;y>0;y--);
  52. }
ideafor 发表于 2016-5-18 22:11 | 显示全部楼层
硬件是如何搭建的呢?lcd用的是spi接口的吗
yiyigirl2014 发表于 2016-5-18 22:56 | 显示全部楼层
能轻松写出这种程序的,直接计算机3级水平刚刚的。
捉虫天师 发表于 2016-7-30 16:33 | 显示全部楼层
这高级,立体玩贪吃蛇
稳稳の幸福 发表于 2016-7-30 16:52 | 显示全部楼层
非常不错,保存下来作为学习的资料。
玛尼玛尼哄 发表于 2016-7-30 17:36 | 显示全部楼层
if(x[n]>7|x[n]<0|y[n]>7|y[n]<0)       //撞墙而死
{
  P0=0xef;P1=0x5e;delay(10000);      //游戏结束标志         
  n=3,e=300,addx=0,addy=0,a=0,b=0,k=0;     //最初游戏设定
  x[0]=7;y[0]=2;          //果实
  x[1]=7;y[1]=7;               //蛇尾
  x[2]=7;y[2]=6;          //蛇身
   x[n]=7;y[n]=5;             //蛇头
  P0=0x7f;P1=0xe4;      
}
heisexingqisi 发表于 2016-7-30 20:08 | 显示全部楼层
主要采用了for循环来控制三维向量的变化。
zhuotuzi 发表于 2016-7-31 21:14 | 显示全部楼层
8*8点阵模块是采用2片74HC595芯片驱动红色8X8点阵管,只需要使用控制器3路IO口,根据点阵管动态扫描原理进行显示,可以显示多种图案。
yiyigirl2014 发表于 2016-7-31 22:14 | 显示全部楼层
如果做的时候把硬件分离出来,方便移植就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

816

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

80

主题

816

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部