设计要求
①制作一个的贪吃蛇游戏,系统以单片机为控制器,用四个输入端表示四个控制键(上下左右)。
②游戏初始化蛇的节数,以及障碍墙壁。
③当蛇的头碰到障碍墙壁或蛇的身体时自动结束。
it D0=P2^0;
sbit D1=P2^1;
sbit D2=P2^2;
sbit D3=P2^3;
sbit KEY1=P3^5;
sbit KEY2=P3^4;
sbit KEY3=P3^3;
sbit KEY4=P3^2;
#define X1 P0
#define X2 P1
u8 Date[32]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//点阵屏显示数据
u8 snake_turn_point[20]={0};//存储蛇尾的转折点
u32 snake_turn=0;//相应转点为左转还是右转 0为左转1为右转
u8 snake_cd=2;//蛇的长度 初始值为2
u8 smake_head_x=10;//蛇头的x轴坐标
u8 smake_head_y=10;//蛇头的y轴坐标
u8 smake_tail_x=10;//蛇尾的x轴坐标
u8 smake_tail_y=11;//蛇尾的y轴坐标
u8 snake_fx=3;//蛇的运动方向 1:上 2:下 3:左 4:右
u8 snake_sd=10;//运动速度
u8 snake_turn_time=0;//蛇的尾巴剩余转点
u8 snake_tail_fx=3;//蛇尾运动方向
u8 food_x=5;//食物的x轴坐标
u8 food_y=5;//食物的y轴坐标
u8 food_x_next=10;//下一个食物的x轴坐标
u8 food_y_next=10;//下一个食物的y轴坐标
void Display(void);//显示函数
void InitTimer0(void);//定时器中断初始化 10ms
void Key_Scan(void);//按键扫描函数
void Write_Date(u8 x,u8 y,u8 a);//对点的写操作
void snake_move(void);//蛇的移动
void game_over(void);//游戏结束 显示完
void creat_food();//生产食物
void main(void)
{
InitTimer0();//初始化定时器
Write_Date(food_x,food_y,1);
while(1)
{
Display();
Key_Scan();
}
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Display(void)
{
X1=0x00; X2=0x00; D3=0; D2=0; D1=0; D0=0; X1=Date[0]; X2=Date[1];
X1=0x00; X2=0x00; D3=0; D2=0; D1=0; D0=1; X1=Date[2]; X2=Date[3];
X1=0x00; X2=0x00; D3=0; D2=0; D1=1; D0=0; X1=Date[4]; X2=Date[5];
X1=0x00; X2=0x00; D3=0; D2=0; D1=1; D0=1; X1=Date[6]; X2=Date[7];
X1=0x00; X2=0x00; D3=0; D2=1; D1=0; D0=0; X1=Date[8]; X2=Date[9];
X1=0x00; X2=0x00; D3=0; D2=1; D1=0; D0=1; X1=Date[10]; X2=Date[11];
X1=0x00; X2=0x00; D3=0; D2=1; D1=1; D0=0; X1=Date[12]; X2=Date[13];
X1=0x00; X2=0x00; D3=0; D2=1; D1=1; D0=1; X1=Date[14]; X2=Date[15];
X1=0x00; X2=0x00; D3=1; D2=0; D1=0; D0=0; X1=Date[16]; X2=Date[17];
X1=0x00; X2=0x00; D3=1; D2=0; D1=0; D0=1; X1=Date[18]; X2=Date[19];
X1=0x00; X2=0x00; D3=1; D2=0; D1=1; D0=0; X1=Date[20]; X2=Date[21];
X1=0x00; X2=0x00; D3=1; D2=0; D1=1; D0=1; X1=Date[22]; X2=Date[23];
X1=0x00; X2=0x00; D3=1; D2=1; D1=0; D0=0; X1=Date[24]; X2=Date[25];
X1=0x00; X2=0x00; D3=1; D2=1; D1=0; D0=1; X1=Date[26]; X2=Date[27];
X1=0x00; X2=0x00; D3=1; D2=1; D1=1; D0=0; X1=Date[28]; X2=Date[29];
X1=0x00; X2=0x00; D3=1; D2=1; D1=1; D0=1; X1=Date[30]; X2=Date[31];
}
void Key_Scan(void)
{
static fx=3;
if(KEY1==0)
snake_fx=1;
if(KEY2==0)
snake_fx=2;
if(KEY3==0)
snake_fx=3;
if(KEY4==0)
snake_fx=4;
if(fx!=snake_fx)
{
snake_turn_point[snake_turn_time]|=snake_fx*16;//保存蛇尾拐点方向
if(snake_fx==1||snake_fx==2)
snake_turn_point[snake_turn_time]+=smake_head_y;
else if(snake_fx==3||snake_fx==4)
snake_turn_point[snake_turn_time]+=smake_head_x; //保存蛇尾拐点的坐标
snake_turn_time++;
fx=snake_fx;
}
}
void tail_turn()
{
u8 i;
for(i=0;i<snake_turn_time;i++)
{
snake_turn_point[i]=snake_turn_point[i+1];
}
snake_turn_time-=1;
}
void res_food()
{
food_x=food_x_next;
food_y=food_y_next;
Write_Date(food_x,food_y,1);
}
void snake_move(void)
{
u8 dat=0x01;
u8 bj_get_food=0;
if(smake_head_y==0&&snake_fx==3)
game_over();
if(smake_head_x==0&&snake_fx==1)
game_over(); //判断蛇头是否碰到上、左墙壁
if(snake_fx==1)
{
if(!((smake_head_x-1==food_x)&&(smake_head_y==food_y)))
{
Write_Da
资料借鉴于此纷传
阅读全文