这是我用51单片机做的贪吃蛇
缺陷之一是这个随机函数每局随机的食物位置都一样
以下为代码
#include<reg51.h>
#include<intrins.h>
#include<stdlib.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
sbit k1=P3^1; //左
sbit k2=P3^0; //上
sbit k3=P3^2; //下
sbit k4=P3^3; //右
u8 x0=1,y0=0; //蛇头的坐标
u8 x1=0,y1=0; //蛇尾的坐标
u8 m=0,n=0; //食物的坐标
u8 exist=0; //食物是否存在
u8 di=4; //蛇的方向
int dx=1,dy=0; //蛇头横纵的方向
int dx1=1,dy1=0; //蛇尾横纵的方向
u16 t=0; //计时器的变量
u8 length=2; //蛇长
u8 crol=1,i=0,a=1,b=0;
u8 code ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 ledduan[]={0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00};
u8 snake_x[30]={0,1};
u8 snake_y[30]={0,0};
void delay(unsigned int i)
{
while(i--);
}
void send(unsigned char dat)
{
unsigned char i;
SRCLK=0;
RCLK=0;
for(i=0;i<8;i++)
{
SER=dat>>7;
dat<<=1;
SRCLK=1;
_nop_();
_nop_();
SRCLK=0;
}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
void Timer0Init()
{
TMOD|=0x01;
TH0=0xfc;
TL0=0x18;
ET0=1;
EA=1;
TR0=1;
}
void win() //若游戏结束,进入死循环
{
ledduan[0]=0x40;
ledduan[1]=0x8c;
ledduan[2]=0x42;
ledduan[3]=0x01;
ledduan[4]=0x01;
ledduan[5]=0x42;
ledduan[6]=0x8c;
ledduan[7]=0x40;
while(1)
{
P0=0x7f;
for(i=0;i<8;i++)
{
P0=ledwei[i];
send(ledduan[i]);
delay(100);
send(0x00);
}
}
}
void over() //若蛇死,进入死循环
{
ledduan[0]=0x80;
ledduan[1]=0xf1;
ledduan[2]=0x82;
ledduan[3]=0x04;
ledduan[4]=0x04;
ledduan[5]=0x82;
ledduan[6]=0xf1;
ledduan[7]=0x80;
while(1)
{
P0=0x7f;
for(i=0;i<8;i++)
{
P0=ledwei[i];
send(ledduan[i]);
delay(100);
send(0x00);
}
}
}
void judge() //判断蛇是否撞墙
{
if(x0>7||x0<0||y0>7||y1<0)
{
over();
}
}
void judge1() //判断蛇是否撞自己
{
u8 i;
for(i=0;i<30;i++)
{
if(x0==snake_x[i]&&y0==snake_y[i])over();
}
}
void add(u8 x,u8 y)
{
crol<<=(7-y);
ledduan[x]|=crol;
crol=1;
}
void delete(u8 x,u8 y)
{
crol<<=(7-y);
crol=~crol;
ledduan[x]&=crol;
crol=1;
}
void generate() //随机生成食物
{
u8 flag=1,i;
while(flag)
{
flag=0;
m=rand()%8;
n=rand()%8;
for(i=0;i<30;i++)
{
if(m==snake_x[i]&&n==snake_y[i])flag=1;
}
}
add(m,n);
exist=1;
}
void move() //蛇移动
{
x0+=dx;
y0+=dy;
judge();
judge1();
add(x0,y0);
if(x0!=m||y0!=n)
{
x1=snake_x[b];
y1=snake_y[b];
delete(x1,y1);
snake_x[b]=-1;
snake_y[b]=-1;
b++;b%=30;
}
else
{
length++;
generate();
if(length==20)win(); //蛇长达到20,游戏结束
}
a++;a%=30;
snake_x[a]=x0;
snake_y[a]=y0;
}
void change() //蛇改变方向
{
if(k1==0||k2==0||k3==0||k4==0)
{
delay(100);
if(k1==0&&di!=4)
{
dx=-1;
dy=0;
di=1;
}
if(k2==0&&di!=3)
{
dx=0;
dy=-1;
di=2;
}
if(k3==0&&di!=2)
{
dx=0;
dy=1;
di=3;
}
if(k4==0&&di!=1)
{
dx=1;
dy=0;
di=4;
}
}
}
void speed(u16 s)
{
while(1)
{
for(i=0;i<8;i++)
{
change();
P0=ledwei[i];
send(ledduan[i]);
delay(100);
send(0x00);
};
if(t>s)
{
t=0;
break;
}
}
}
void main()
{
Timer0Init();
generate();
while(1)
{
move();
speed(500); //1000为一秒一步 500为一秒两步
}
}
void Time0() interrupt 1
{
TH0=0xfc;
TL0=0x18;
t++;
}
|