打印
[应用方案]

用单片机控制8*8点阵的贪吃蛇

[复制链接]
1902|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lovecat2015|  楼主 | 2016-5-15 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<stc12.h>      //用六个按键四个方向键 一个暂停键 一个重新开始健
#include<stdlib.h>      //P1控制正极 P0控制负极
#define uint unsigned int    //
#define uchar unsigned char
int addx,addy,n,s1,s2,e,a,b,c,d,k;   //addx addy位移改变量  n蛇身长度 s1,s2新果实的位置
uchar x[21];       //a重新开始标志 b暂停标志 e代表蛇身运动速度大小
uchar y[21];       //两个数组用来储存蛇身的地址
void key();
void deal();
void move(int);
uchar mux(int);
void delay(uint);
void main()
{
n=3,e=300,addx=0,addy=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;
while(1)
{
  key();
  if(b==0)
  {
  key();
  move(e);
  deal();
  }
  if(b==1)
  { uint i;             //
      for(i=0;i<=n;i++)         //
        {             //
       P0=255-mux(x);P1=mux(y);     //
       delay(5);          //
       P0=0xff;P1=0x00;              //和数码管的消影差不多的作用
   }
  }
}
}
void move(int e)  //实现移动
{
uint i;
if(k>0)
{
  while(e--)            //
  {              //
     for(i=0;i<=n;i++)          //
       {              //
      P0=255-mux(x);P1=mux(y);      //
      key();            //
      delay(5);           //
      P0=0xff;P1=0x00;                  //和数码管的消影差不多的作用
      }
  }                 //
  for(i=1;i<n;i++)          //
  {x=x[i+1];y=y[i+1];}        //
  x[n]=x+addx;y[n]=y+addy;       //              
}
}
void deal()             //判断函数
{
uint i;
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;      
}
for(i=1;i<n;i++)          //撞自己而死
{
  if(x==x[n]&y==y[n])
  {
   P0=0xef;P1=0x5e;delay(30000);      //游戏结束标志
   n=3,e=300,addx=0,addy=0,a=0,b=0,k=0;   //回到最初游戏设定
   x[1]=7;y[1]=7;            //蛇尾
   x[2]=7;y[2]=6;
      x[n]=7;y[n]=5;          //蛇头
   P0=0x7f;P1=0xe4;
  }         
}
if((x[0]==x[n]+addx)&(y[0]==y[n]+addy))   //判断是否吃到果实
{
  n=n+1;
  x[n]=x[0];y[n]=y[0];
  if(n==13)         //判断是否过关
  { e=e-50;          //
   P0=0x00;P1=0xff;delay(30000);      //游戏结束标志
   n=3,addx=0,addy=0,a=0,b=0,k=0;      //回到最初游戏设定
   x[1]=7;y[1]=7;            //蛇尾
   x[2]=7;y[2]=6;
      x[n]=7;y[n]=5;          //蛇头
   P0=0x7f;P1=0xe0;         
  }
  c=rand(); s1=c%10000%1000%100%10;
  d=rand(); s2=d%10000%1000%100%10;   // 新的果实
  if(s1>6)  s1=s1-3;
  if(s2>6)  s2=s2-3;
  x[0]=s1;y[0]=s2;       //
  for(i=1;i<n;i++)       //判断是否与蛇身重合
  {
    if((x[0]==x)&(y[0]==y))
    {
     c=rand(); s1=c%10000%1000%100%10;
   d=rand(); s2=d%10000%1000%100%10;  
   if(s1>6)  s1=s1-3;
   if(s2>6)  s2=s2-3;
   x[0]=s1;y[0]=s2;      // 新的果实
   i=1;
    }
    }
}
}
void key()             //矩阵按键扫描
{
uchar t;
P3=0xdf;
t=P3;
t=t&0x1c;
if(t!=0x1c)
{
  delay(10);
  t=P3;
  t=t&0x1c;
  if(t!=0x1c)
   {
    t=P3;
   switch(t)
   {
    case 0xdb:a=1;break;
    case 0xd7:k=1;break;
    case 0xcf:b++;break;
    default:  break;
   }
   while(t!=0x1c)
   {
    t=P3;
    t=t&0x1c;
   }
   }
}


沙发
lovecat2015|  楼主 | 2016-5-15 22:37 | 只看该作者
P3=0xbf;
t=P3;
t=t&0x1c;
if(t!=0x1c)
{
  delay(10);
  t=P3;
  t=t&0x1c;
  if(t!=0x1c)
   {
    t=P3;
   switch(t)
   {
    case 0xbb:k=2;break;
    case 0xb7:k=3;break;
    case 0xaf:k=4;break;
    default:  break;
   }
   while(t!=0x1c)
   {
    t=P3;
    t=t&0x1c;
   }
   }
}
b=b%2;
switch(k)
{
  case 1: addy=-1,addx=0;break;
  case 2: addx=1,addy=0;break;
  case 3: addy=1,addx=0;break;
  case 4: addx=-1,addy=0;break;
}
}
uchar mux(int temp)      //十进制转化为十六进制
{
if(temp==7)return 128;
if(temp==6)return 64;
if(temp==5)return 32;
if(temp==4)return 16;
if(temp==3)return 8;
if(temp==2)return 4;
if(temp==1)return 2;
if(temp==0)return 1;
           return 0;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

使用特权

评论回复
板凳
ideafor| | 2016-5-18 22:11 | 只看该作者
硬件是如何搭建的呢?lcd用的是spi接口的吗

使用特权

评论回复
地板
yiyigirl2014| | 2016-5-18 22:56 | 只看该作者
能轻松写出这种程序的,直接计算机3级水平刚刚的。

使用特权

评论回复
5
捉虫天师| | 2016-7-30 16:33 | 只看该作者
这高级,立体玩贪吃蛇

使用特权

评论回复
6
稳稳の幸福| | 2016-7-30 16:52 | 只看该作者
非常不错,保存下来作为学习的资料。

使用特权

评论回复
7
玛尼玛尼哄| | 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;      
}

使用特权

评论回复
8
heisexingqisi| | 2016-7-30 20:08 | 只看该作者
主要采用了for循环来控制三维向量的变化。

使用特权

评论回复
9
zhuotuzi| | 2016-7-31 21:14 | 只看该作者
8*8点阵模块是采用2片74HC595芯片驱动红色8X8点阵管,只需要使用控制器3路IO口,根据点阵管动态扫描原理进行显示,可以显示多种图案。

使用特权

评论回复
10
yiyigirl2014| | 2016-7-31 22:14 | 只看该作者
如果做的时候把硬件分离出来,方便移植就好了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

816

帖子

0

粉丝