新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)實(shí)現(xiàn)貪食蛇的子程序

        51單片機(jī)實(shí)現(xiàn)貪食蛇的子程序

        作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏

        這是從http://www.51hei.com/bbs/dpj-20623-1.html這個(gè)制作里面截取的一段子程序,調(diào)用函數(shù)請(qǐng)下載里面的附件.

        下面是mysanke.h文件:

        #ifndef _MYSNAKE_H_
        #define _MYSNAKE_H_

        本文引用地址:http://www.104case.com/article/201611/323827.htm

        /*---------------------------------------------------------
        函數(shù)功能:檢測(cè)隨機(jī)落食是否壓在已存在的亮點(diǎn)上
        調(diào)用形式:Check_Food(*node);
        參數(shù):結(jié)構(gòu)體指針
        返回值:返回食物是否可以放置1->可以 0->不可以
        備注:食物產(chǎn)生函數(shù)調(diào)用此函數(shù)用于檢測(cè)
        ---------------------------------------------------------*/
        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ù):無(wú)
        返回值:無(wú)
        備注:此函數(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);檢測(cè)食物可以放置后執(zhí)行下面
        SetStatusXY(food.X,food.Y,food.S);//食物點(diǎn)亮起

        //此函數(shù)未刷屏,僅設(shè)置狀態(tài)
        }

        /*---------------------------------------------------------
        函數(shù)功能:產(chǎn)生初始化的蛇并設(shè)置其運(yùn)動(dòng)狀態(tài)
        調(diào)用形式:Snake_Init();
        參數(shù):無(wú)
        返回值:無(wú)
        備注:無(wú)刷新屏幕,只在緩存寫入數(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;//此時(shí)蛇尾
        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ù)功能:蛇的單步移動(dòng)刷新
        調(diào)用形式:
        參數(shù):入口參數(shù)->移動(dòng)方向(direct)
        返回值:無(wú)
        備注:僅更新顯示緩存
        ---------------------------------------------------------*/
        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;

        //更新*超過(guò)顯示范圍處理(蛇可穿過(guò)邊界)
        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)
        {
        //蛇游戲方向鍵無(wú)需去抖。避免影響刷新
        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;
        }
        }
        }
        }
        }

        }


        上一頁(yè) 1 2 下一頁(yè)

        關(guān)鍵詞: 51單片機(jī)貪食

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 含山县| 新河县| 英超| 海淀区| 双城市| 偃师市| 敖汉旗| 兴义市| 新绛县| 仲巴县| 黎城县| 天门市| 和静县| 宁阳县| 邵东县| 苍溪县| 祥云县| 寻甸| 沧源| 米泉市| 大渡口区| 龙里县| 文昌市| 白玉县| 平邑县| 南康市| 新疆| 正蓝旗| 文昌市| 涡阳县| 开鲁县| 合江县| 左权县| 宝鸡市| 呼伦贝尔市| 南漳县| 西乌珠穆沁旗| 长白| 祁门县| 夏河县| 巴林右旗|