锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

51单片机实现贪食蛇的子程序

时间:2024-05-20 11:07:11


这是从http://www.ruidan.com/bbs/dpj-20623-1.html这个制作里面截取的一段子程序,调用函数请下载里面的附件.

下面是mysanke.h文件:

#ifndef _MYSNAKE_H_
#define _MYSNAKE_H_

/*---------------------------------------------------------
函数功能:检测随机落食是否压在已存在的亮点上
调用形式:Check_Food(*node);
参数:结构体指针
返回值:返回食物是否可以放置1->可以 0->不可以
备注:食物产生函数调用此函数用于检测
---------------------------------------------------------*/
bit Check_Food(node *r)
{
if(GetStatusXY((*r).X,(*r).Y))
(*r).S=0;//不可以放置

else (*r).S=1;//S=1表示可以点亮
return (*r).S;//返回状态
}

/*---------------------------------------------------------
函数功能:产生随机食物
调用形式:Creat_Food();
参数:无
返回值:无
备注:此函数未刷屏仅设置状态
---------------------------------------------------------*/
void Creat_Food(void)
{
while(!Check_Food(&food))//
{
food.X=TL0&0x1f;//X的范围0->31
food.Y=seed&0x0f;//Y的范围0->15
}
//Check_Food(&food);检测食物可以放置后执行下面
SetStatusXY(food.X,food.Y,food.S);//食物点亮起

//此函数未刷屏,仅设置状态
}

/*---------------------------------------------------------
函数功能:产生初始化的蛇并设置其运动状态
调用形式:Snake_Init();
参数:无
返回值:无
备注:无刷新屏幕,只在缓存写入数据
---------------------------------------------------------*/
void Snake_Init(void)
{
ClearBuf();//清屏

snake[0].X=3;//蛇头
snake[0].Y=1;
snake[0].S=1;

snake[1].X=2;
snake[1].Y=1;
snake[1].S=1;

snake[2].X=1;//此时蛇尾
snake[2].Y=1;
snake[2].S=1;

SetStatusXY(snake[0].X,snake[0].Y,snake[0].S);
SetStatusXY(snake[1].X,snake[1].Y,snake[1].S);
SetStatusXY(snake[2].X,snake[2].Y,snake[2].S);

//while(!food.S)
//Creat_Food();
food.X=19;food.Y=13;food.S=1;
SetStatusXY(food.X,food.Y,food.S);
snake_status=1;
snake_size=2;
snake_score=0;
snake_speed=60;
snake_direct=RIG;//首先向右走。
}

/*---------------------------------------------------------
函数功能:蛇的单步移动刷新
调用形式:
参数:入口参数->移动方向(direct)
返回值:无
备注:仅更新显示缓存
---------------------------------------------------------*/
void Snake_Step(uint8 dir)
{
int8 dx,dy;//-128->127.蛇头的位移量
uint8 i;//循环变量
switch(dir)
{
case UP: dx=0;dy=-1;break;
case N:dx=0;dy=1;break;
case LEFT:dx=-1;dy=0;break;
case RIGHT:dx=1;dy=0;break;
default:return ;
}

SetStatusXY(snake[snake_size].X,snake[snake_size].Y,0);//蛇尾消隐

for(i=snake_size;i>0;i--)//0是蛇尾,到1为止
{//蛇身的坐标跟随前一位
snake[i].X=snake[i-1].X;
snake[i].Y=snake[i-1].Y;
snake[i].S=snake[i-1].S;
}

snake[0].X+=dx;//蛇头坐标更新,具有方向性
snake[0].Y+=dy;

//更新*超过显示范围处理(蛇可穿过边界)
if(snake[0].X>31) snake[0].X=0;//横坐标越界处理
if(snake[0].X<0) snake[0].X=31;

if(snake[0].Y>15) snake[0].Y=0;//纵坐标越界处理
if(snake[0].Y<0) snake[0].Y=15;

for(i=0;i<=snake_size;i++)
{
SetStatusXY(snake[i].X,snake[i].Y,1);
}
}

/*---------------------------------------------------------
函数功能:游戏按键处理
调用形式:Snake_Key();
参数:
返回值:
备注:轮询
---------------------------------------------------------*/
void Snake_Key(void)
{
P2|=0XF8;
if(!KEY_UP||ir_value==0x18)
{
//蛇游戏方向键无需去抖。避免影响刷新
if(snake_direct==UP||snake_direct==DOWN)
;
else
{
snake_direct=UP;
//Snake_Step(UP);
}
}
else
{
if(!KEY_DOWN||ir_value==0x52)
{
if(snake_direct==DOWN||snake_direct==UP)
;
else
{
//Snake_Step(DOWN);
snake_direct=DOWN;
}
}

else
{
if(!KEY_LEFT||ir_value==0x08)
{
if(snake_direct==LEFT||snake_direct==RIGHT)
;
else
snake_direct=LEFT;
}

else
{
if(!KEY_RIGHT||ir_value==0x5a)
{
if(snake_direct==LEFT||snake_direct==RIGHT)
;
else
snake_direct=RIGHT;
}
else
{
if(!KEY_ER||ir_value==0x43)
{
DelayMs(SCAN_DELAY);
if(!KEY_EER||ir_value==0x43)
{
while(!KEY_ENTER)
;
snake_status=0;//游戏结束了
matrix.S=F;
}
}
else if(ir_value==0x46)
{
food.X=0;
TR0=0;
DelayMs(10);
TR0=1;
}
}
}
}
}

}

/*---------------------------------------------------------
函数功能:蛇吃到食物处理
调用形式:Snake_Feed();
参数:
返回值:迟到食物返回1 没吃到返回0->判断是否死亡
备注:
---------------------------------------------------------*/
void Snake_Feed(void)
{
uint8 i;
if(snake[snake_size].X==food.X&&snake[snake_size].Y==food.Y)
{
//while(food.S==0)
Creat_Food();//重新产生食物
//snake_foodflag=1;
snake_size++;//蛇身加1
snake_score+=BASIC_SCORE;//游戏得分加上加分基数
snake_speed-=BASIC_EED;//游戏速度加上加速基数
if(snake_speed<=0)
snake_speed=1;


if(snake_size==SNAKE_SIZE)//此刻蛇长等于最长时候,通关条件
{
for(i=0;i<=SNAKE_SIZE;i++)
{
SetStatusXY(snake[i].X,snake[i].Y,0);//蛇消隐
}
//清屏幕缓存并显示得分
ClearBuf();
{
Display_5x8(0,0,S_);
Display_5x8(6,0,C_);
Display_5x8(12,0,O_);
Display_5x8(18,0,R_);
Display_5x8(24,0,E_);
}
//下32x8像素显示分数(最长52节,吃50个食物通关,50*10=500分最高)
{
Display_5x8(31-6,8,snake_score%10);
Display_5x8(31-12,8,snake_score%100/10);
Display_5x8(31-18,8,snake_score/100);
}
while(1)
{
for(i=0;i<5;i++)
Display();
DelayMs(255);
if(snake_status==0)
break;
}
}
//return 1;
}
//else return 0;
}

/*---------------------------------------------------------
函数功能:处理蛇的死亡
调用形式:Snake_Die();
参数:
返回值:
备注:
---------------------------------------------------------*/
void Snake_Die(void)
{
uint16 i;

for(i=1;i {
if(snake[0].X==snake[i].X)
{
if(snake[i].Y==snake[0].Y)//死亡
{
ClearBuf();
Display_5x8(0,0,G_);
Display_5x8(6,0,A_);
Display_5x8(12,0,M_);
Display_5x8(18,0,E_);
Display_5x8(0,8,O_);
Display_5x8(6,8,V_);
Display_5x8(12,8,E_);
Display_5x8(18,8,R_);
for(i=0;i<800;i++)
Display();

ClearBuf();
Display_5x8(31-6,8,snake_score%10);
Display_5x8(31-12,8,snake_score%100/10);
Display_5x8(31-18,8,snake_score/100);
Display_5x8(0,0,S_);
Display_5x8(6,0,C_);
Display_5x8(12,0,O_);
Display_5x8(18,0,R_);
Display_5x8(24,0,E_);
while(1)
{
if(!snake_status)
break;
for(i=0;i<100;i++)
Display();
DelayMs(255);
}
break;//连跳
}
}
}
}

/*---------------------------------------------------------
函数功能:游戏进行时
调用形式:Snake_Ing();
参数:
返回值:
备注:
---------------------------------------------------------*/
void Snake_Ing(void)
{
uint8 i;
if(!snake_status)
Snake_Init();
Snake_Step(snake_direct);
Snake_Feed();
Snake_Die();
for(i=0;i Display();
}

#endif


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章