您的位置 首页 观点

51单片机完成贪食蛇的子程序

这是从http:www51heicombbsdpj-20623-1html这个制作里面截取的一段子程序,调用函数请下载里面的附件下面是mysankeh文件:ifndef

这是从http://www.51hei.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=RIGHT;//首要向右走。
}

/*———————————————————
函数功用:蛇的单步移动改写
调用方式:
参数:进口参数->移动方向(direct)
回来值:无
补白:仅更新显现缓存
———————————————————*/
void Snake_Step(uint8 dir)
{
int8 dx,dy;//-128->127.蛇头的位移量
uint8 i;//循环计数器变量
switch(dir)
{
case UP: dx=0;dy=-1;break;
case DOWN: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_ENTER||ir_value==0x43)
{
DelayMs(SCAN_DELAY);
if(!KEY_ENTER||ir_value==0x43)
{
while(!KEY_ENTER)
;
snake_status=0;//游戏完毕了
matrix.S=FIRST;
}
}
else if(ir_value==0x46)
{
food.X=0;
TR0=0;
DelayMs(10);
TR0=1;
}
}
}
}
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/318253.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部