|
這是我用51單片機(jī)做的貪吃蛇
缺陷之一是這個(gè)隨機(jī)函數(shù)每局隨機(jī)的食物位置都一樣
以下為代碼
#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; //蛇頭的坐標(biāo)
u8 x1=0,y1=0; //蛇尾的坐標(biāo)
u8 m=0,n=0; //食物的坐標(biāo)
u8 exist=0; //食物是否存在
u8 di=4; //蛇的方向
int dx=1,dy=0; //蛇頭橫縱的方向
int dx1=1,dy1=0; //蛇尾橫縱的方向
u16 t=0; //計(jì)時(shí)器的變量
u8 length=2; //蛇長(zhǎng)
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() //若游戲結(jié)束,進(jìn)入死循環(huán)
{
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() //若蛇死,進(jìn)入死循環(huán)
{
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() //隨機(jī)生成食物
{
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() //蛇移動(dòng)
{
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(); //蛇長(zhǎng)達(dá)到20,游戲結(jié)束
}
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++;
}
|
評(píng)分
-
查看全部評(píng)分
|