久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機實現貪食蛇的子程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年08月17日   【字體:


這是從http://www.zg4o1577.cn/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;
        }
      }
     }
    }
  }
 
}

/*---------------------------------------------------------
函數功能:蛇吃到食物處理
調用形式: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_SPEED;//游戲速度加上加速基數
  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<snake_size+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<snake_speed;i++)
 Display();
}

#endif
 

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲成人a v | 日韩三级免费观看 | 日本欧美在线视频 | 日韩精品一区二区三区高清免费 | 久久免费国产 | 成人午夜毛片 | 国产91 在线播放 | 日本不卡一区二区三区在线观看 | 欧美日韩免费一区二区三区 | 免费看国产精品视频 | 国产999精品久久久久久 | 亚洲a视频| 亚洲精品乱 | 欧美成视频 | 国产精品不卡 | 久久久夜色精品亚洲 | 日韩欧美中文字幕在线观看 | 人人射人人插 | 日韩一二区 | 久久高清精品 | 久久99精品久久久久久琪琪 | 中文字幕一区在线观看视频 | 欧美日韩电影一区二区 | 国产美女在线观看 | 99riav3国产精品视频 | 妞干网av| a久久 | 狠狠干av| 91久久久久久久久久久久久 | 亚洲先锋影音 | 999热在线视频 | 人人种亚洲 | 天天天操| 欧美精品二区三区 | 免费在线一区二区 | a级毛片国产 | 伊人久久一区二区 | 日韩一级免费 | www.性色 | 伦理午夜电影免费观看 | 国产精品久久久久aaaa樱花 |