单片机学习小组
直播中

efwedfd

8年用户 1033经验值
擅长:EMC/EMI设计
私信 关注

如何利用单片机去实现一个贪吃蛇小游戏呢

如何利用单片机去实现一个贪吃蛇小游戏呢?其代码程序该怎样去实现呢?

回帖(1)

杨欢

2022-1-20 14:38:59

#include
#define uchar unsigned char
#define SNAKE 22             //最大长度
#define TIME 40               //显示延时时间
#define SPEED 88              //速度控制
#define  keyenable 1

***it led = P0^0;
***it up=P3^2;
***it down=P3^4;
***it right=P3^3;
***it left=P3^1;

uchar x[SNAKE+1];
uchar y[SNAKE+1];         
uchar time,n,i,e;         //延时时间,当前蛇长,通用循环变量,当前速度               
char fx,fy;             //位移偏移量

/***************************
        延时程序
****************************/
void delay(char MS)
{
        char us,usn;
        while(MS!=0)
        {
                usn = 0;
                while(usn!=0)
                {
                        us=0xff;
                        while (us!=0)
                        {us--;};
                        usn--;
                }
                MS--;
        }
}
/****************************
          判断碰撞
*****************************/
bit knock()
{
        bit k;
        k=0;
        if(x[1]>7||y[1]>7)
                k=1;                           //撞墙
        for(i=2;i                 if((x[1]==x)&(y[1]==y))
                        k=1;                       //撞自己
        return k;
}
/*****************************
      上下左右键位处理
******************************/
void turnkey()
{
        if(keyenable)
        {
                if(left)
                {
                        fy=0;
                        if(fx!=1)
                                fx=-1;
                        else fx=1;
                }
                if(right)
                {
                        fy=0;
                        if(fx!=-1)
                                fx=1;
                        else fx=-1;
                }
                if(up)
                {
                        fx=0;
                        if(fy!=-1)
                                fy=1;
                        else fy=-1;
                }
                if(down)
                {
                        fx=0;
                        if(fy!=1)
                                fy=-1;
                        else fy=1;
                }
        }
}
/*******************************
          乘方程序
********************************/
uchar mux(uchar 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 timer0(uchar k)
{
        while(k--)
        {
                for(i=0;i                 {
                        P2=mux(x);
                        P1=255-mux(y);
                        turnkey();                   //上下左右键位处理
                        delay(TIME);                //显示延迟
                        P2=0x00;
                        P1=0xff;
                }
        }
}
/*******************************
             主程序
*******************************/       
void main(void)
{
        e=SPEED;
        P0=0x00;
        P1=0xff;
        P2=0x00;
        P3=0x00;
        while(1)      
        {
                for(i=3;i                         x=100;
                for(i=3;i                         y=100;                       //初始化
                x[0]=4;
                y[0]=4;                            //设置食物                           
                n=3;                              //贪吃蛇长
                x[1]=1;y[1]=0;                      //贪吃蛇头
                x[2]=0;y[2]=0;                      //贪吃蛇尾
                fx=0;
                fy=0;                              //位移偏移
                while(1)
                {
                        if(keyenable)
                                break;
                                timer0(1);
                }
                while(1)         
                 {
                        timer0(e);
                          if(knock())
                        {
                                e=SPEED;
                                break;
                        }                                //判断碰撞
                if((x[0]==x[1]+fx)&(y[0]==y[1]+fy))  //是否吃东西
                {
                                n++;
                                  if(n==SNAKE+1)
                                  {
                                        n=3;
                                        e=e+10;
                                          for(i=3;i                                                 x=100;
                                  for(i=3;i                                                 y=100;
                                 }
                          x[0]=x[n-2];
                          y[0]=y[n-2];
                        }
                           for(i=n-1;i>1;i--)
                        {
                                x=x[i-1];
                                y=y[i-1];
                        }        
                          x[1]=x[2]+fx;
                        y[1]=y[2]+fy;                     //移动
                 }                                                                            
        }                       
}



代码有少许缺陷,比如食物只会从蛇的尾部出来。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分