51單片機(jī)實(shí)現(xiàn)貪食蛇的子程序
這是從http://www.51hei.com/bbs/dpj-20623-1.html這個制作里面截取的一段子程序,調(diào)用函數(shù)請下載里面的附件.
下面是mysanke.h文件:
#ifndef _MYSNAKE_H_
#define _MYSNAKE_H_
/*---------------------------------------------------------
函數(shù)功能:檢測隨機(jī)落食是否壓在已存在的亮點(diǎn)上
調(diào)用形式:Check_Food(*node);
參數(shù):結(jié)構(gòu)體指針
返回值:返回食物是否可以放置1->可以 0->不可以
備注:食物產(chǎn)生函數(shù)調(diào)用此函數(shù)用于檢測
---------------------------------------------------------*/
bit Check_Food(node *r)
{
if(GetStatusXY((*r).X,(*r).Y))
(*r).S=0;//不可以放置
else (*r).S=1;//S=1表示可以點(diǎn)亮
return (*r).S;//返回狀態(tài)
}
/*---------------------------------------------------------
函數(shù)功能:產(chǎn)生隨機(jī)食物
調(diào)用形式:Creat_Food();
參數(shù):無
返回值:無
備注:此函數(shù)未刷屏僅設(shè)置狀態(tài)
---------------------------------------------------------*/
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);檢測食物可以放置后執(zhí)行下面
SetStatusXY(food.X,food.Y,food.S);//食物點(diǎn)亮起
//此函數(shù)未刷屏,僅設(shè)置狀態(tài)
}
/*---------------------------------------------------------
函數(shù)功能:產(chǎn)生初始化的蛇并設(shè)置其運(yùn)動狀態(tài)
調(diào)用形式:Snake_Init();
參數(shù):無
返回值:無
備注:無刷新屏幕,只在緩存寫入數(shù)據(jù)
---------------------------------------------------------*/
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;//首先向右走。
}
/*---------------------------------------------------------
函數(shù)功能:蛇的單步移動刷新
調(diào)用形式:
參數(shù):入口參數(shù)->移動方向(direct)
返回值:無
備注:僅更新顯示緩存
---------------------------------------------------------*/
void Snake_Step(uint8 dir)
{
int8 dx,dy;//-128->127.蛇頭的位移量
uint8 i;//循環(huán)計(jì)數(shù)器變量
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為止
{//蛇身的坐標(biāo)跟隨前一位
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;//蛇頭坐標(biāo)更新,具有方向性
snake[0].Y+=dy;
//更新*超過顯示范圍處理(蛇可穿過邊界)
if(snake[0].X>31) snake[0].X=0;//橫坐標(biāo)越界處理
if(snake[0].X<0) snake[0].X=31;
if(snake[0].Y>15) snake[0].Y=0;//縱坐標(biāo)越界處理
if(snake[0].Y<0) snake[0].Y=15;
for(i=0;i<=snake_size;i++)
{
SetStatusXY(snake[i].X,snake[i].Y,1);
}
}
/*---------------------------------------------------------
函數(shù)功能:游戲按鍵處理
調(diào)用形式:Snake_Key();
參數(shù):
返回值:
備注:輪詢
---------------------------------------------------------*/
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;//游戲結(jié)束了
matrix.S=FIRST;
}
}
else if(ir_value==0x46)
{
food.X=0;
TR0=0;
DelayMs(10);
TR0=1;
}
}
}
}
}
}
評論