C语言+EGE图形库小游戏吃豆子

#include 
#include 
#include 
#include 
void loadMenu();
void homeMenu();
void choice();
void introduce();
void createMap();
void enterNext();
void roleMove();
void mstMove();
void dieOver();
void crashJudge();
void showScore();
void gameOver();
//记录人物坐标重置坐标
//(row,col)
int row=0;
int col=0;
//记录怪物坐标
//(mstrow,mstcol)
int mstrow=0;
int mstcol=0;
//记录血量
int roleBlood=0;
//记录分数
int score=0;
//判断关卡
int lvFlag=0;
int TOTAL=0;
#define t1 20
#define t2 12
#define t3 10

#define WIDTH 10
#define LENGTH 10
#define BLR 9
#define BLC1 0
#define BLC2 1
#define BLC3 2



int pMap[WIDTH][LENGTH]={0};
const int pMap1[WIDTH][LENGTH]=
{
1,1,1,1,1,1,1,1,1,1,
1,9,0,0,0,0,0,0,9,1,
1,4,9,2,9,9,2,9,9,1,
1,0,2,9,9,9,9,2,0,1,
1,9,9,9,3,9,9,9,9,1,
1,0,2,9,9,9,9,2,0,1,
1,0,9,2,9,9,2,9,0,1,
1,0,0,0,0,0,0,0,0,1,
1,9,1,1,9,9,1,1,9,1,
10,10,10,9,9,9,9,9,9,9
};

const int pMap2[WIDTH][LENGTH]=
{
1,1,1,1,1,1,1,1,1,1,
1,0,0,2,0,0,0,0,0,1,
1,0,9,2,9,9,9,2,2,1,
1,0,9,2,9,9,9,9,0,1,
1,0,9,9,3,9,9,9,0,1,
1,9,9,9,9,9,2,9,9,1,
1,2,2,9,4,9,2,9,9,1,
1,9,9,9,9,9,2,9,9,1,
1,1,1,1,1,1,1,1,1,1,
10,10,10,9,9,9,9,9,9,9
};

const int pMap3[WIDTH][LENGTH]=
{
1,1,1,1,1,1,1,1,1,1,
1,0,0,2,0,0,2,0,0,1,
1,0,2,9,9,9,9,2,0,1,
1,0,2,9,9,9,9,2,0,1,
1,9,9,9,3,9,9,9,9,1,
1,2,9,9,9,9,9,9,2,1,
1,4,9,2,9,9,2,9,9,1,
1,9,9,2,9,9,2,9,9,1,
1,1,1,1,1,1,1,1,1,1,
10,10,10,9,9,9,9,9,9,9
};

int main()
{
    initgraph(500, 550);
    loadMenu();
    delay_ms(800);
    homeMenu();
    cleardevice();
    closegraph();
    return 0;
}


//加载界面
void loadMenu()
{
    PIMAGE pLoad = newimage();
    getimage(pLoad, "img\\load.png",0,0);
    putimage(0, 0, pLoad);
    delimage(pLoad);

}
//主界面
void homeMenu()
{
    PIMAGE istart = newimage();
    getimage(istart, "img\\start.bmp",0,0);
    putimage(0, 0, istart);
    delimage(istart);

    // 画帧率文字
    char str[20];
    sprintf(str, "fps %.02f", getfps()); //调用getfps取得当前帧率
    setcolor(WHITE);
    outtextxy(0, 0, str);

    //鼠标点击
    mouse_msg mMsg = {0};
    for ( ; is_run(); delay_fps(60))
    {
        //获取鼠标消息,这个函数会等待,等待到有消息为止
        while(mousemsg())
        {
            mMsg = getmouse();
        }
        //选择关卡
        if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>140&&mMsg.x<335&&mMsg.y>260&&mMsg.y<300)
        {
            choice();
        }
        //游戏说明
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>140&&mMsg.x<335&&mMsg.y>340&&mMsg.y<370)
        {
            introduce();
        }
        //退出
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>140&&mMsg.x<335&&mMsg.y>400&&mMsg.y<435)
        {
            cleardevice();
            closegraph();
        }

    }
    getch();
}
//选择关卡界面
void choice()
{
    PIMAGE pChioce = newimage();
    getimage(pChioce, "img\\choice.bmp",0,0);
    putimage(0, 0, pChioce);
    delimage(pChioce);
    mouse_msg mMsg = {0};
    for ( ; is_run(); delay_fps(60))
    {
        //获取鼠标消息,这个函数会等待,等待到有消息为止
        while(mousemsg())
        {
            mMsg = getmouse();
        }
        //选择关卡01
        if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>40&&mMsg.x<155&&mMsg.y>180&&mMsg.y<335)
        {
            lvFlag=1;
            TOTAL=t1;
            for(int i=0;ifor(int j=0;j//02
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>215&&mMsg.x<335&&mMsg.y>270&&mMsg.y<420)
        {
            lvFlag=2;
            TOTAL=t2;
            for(int i=0;ifor(int j=0;j//03
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>375&&mMsg.x<500&&mMsg.y>340&&mMsg.y<500)
        {
            lvFlag=3;
            TOTAL=t3;
            for(int i=0;ifor(int j=0;j//游戏介绍
void introduce()
{
    PIMAGE pIntro = newimage();
    getimage(pIntro, "img\\introduce.bmp",0,0);
    putimage(0, 0, pIntro);
    delimage(pIntro);
    mouse_msg mMsg = {0};
    for ( ; is_run(); delay_fps(60))
    {
        //获取鼠标消息,这个函数会等待,等待到有消息为止
        while(mousemsg())
        {
            mMsg = getmouse();
        }
        //选择关卡01
        if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>0&&mMsg.x<500&&mMsg.y>0&&mMsg.y<550)
        {
            cleardevice();
            homeMenu();
        }

    }
    getch();
}
//进入下一关卡
void enterNext()
{
    PIMAGE pNext = newimage();
    getimage(pNext, "img\\next.bmp",0,0);
    putimage(0, 0, pNext);
    delimage(pNext);
    mouse_msg mMsg = {0};
    for ( ; is_run(); delay_fps(60))
    {
        //获取鼠标消息,这个函数会等待,等待到有消息为止
        while(mousemsg())
        {
            mMsg = getmouse();
        }
        //选择下一关卡
        if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>185&&mMsg.x<310&&mMsg.y>370&&mMsg.y<430)
        {
            cleardevice();
            choice();
        }
        //退出
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>380&&mMsg.x<470&&mMsg.y>350&&mMsg.y<450)
        {
            cleardevice();
            closegraph();

        }
        //进入到
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>50&&mMsg.x<135&&mMsg.y>350&&mMsg.y<450)
        {
            gameOver();
        }

    }
}


//死亡游戏结束界面
void dieOver()
{
    delay_ms(600);
    PIMAGE pOver = newimage();
    getimage(pOver, "img\\dieover.bmp",0,0);
    putimage(0, 0, pOver);
    delimage(pOver);

    mouse_msg mMsg = {0};
    for ( ; is_run(); delay_fps(60))
    {
        //获取鼠标消息,这个函数会等待,等待到有消息为止
        while(mousemsg())
        {
            mMsg = getmouse();
        }
        //重新开始
        if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>190&&mMsg.x<310&&mMsg.y>420&&mMsg.y<480)
        {
            //判断在第几关重新开始???
            if(lvFlag==1)
            {
                for(int i=0;ifor(int j=0;jelse if (lvFlag==2)
            {
                for(int i=0;ifor(int j=0;jelse if (lvFlag==2)
            {
                for(int i=0;ifor(int j=0;j//退出
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>365&&mMsg.x<465&&mMsg.y>390&&mMsg.y<520)
        {
            cleardevice();
            closegraph();

        }

        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>40&&mMsg.x<140&&mMsg.y>390&&mMsg.y<520)
        {
            gameOver();
        }
    }
}
//游戏结束界面
void gameOver()
{
    PIMAGE pgover = newimage();
    getimage(pgover, "img\\gover.bmp",0,0);
    putimage(0, 0, pgover);
    delimage(pgover);
    //显示分数
    char s[5];
    sprintf(s, "%d", score);
    setfont(-30, 0, "宋体");
    outtextxy(145, 355, s);

    mouse_msg mMsg = {0};
    for ( ; is_run(); delay_fps(60))
    {
        //获取鼠标消息,这个函数会等待,等待到有消息为止
        while(mousemsg())
        {
            mMsg = getmouse();
        }
        //重新开始
        if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>180&&mMsg.x<290&&mMsg.y>470&&mMsg.y<510)
        {
            homeMenu();
        }
        //退出
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>365&&mMsg.x<445&&mMsg.y>440&&mMsg.y<520)
        {
            cleardevice();
            closegraph();
        }
        //
        else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>35&&mMsg.x<115&&mMsg.y>450&&mMsg.y<530)
        {

        }
    }
}


//生成地图+移动后的重绘
void createMap()
{
    PIMAGE img = newimage();
    getimage(img, "img\\di.bmp",0,0);
    putimage(0, 0, img);
    delimage(img);

    int x =0;
    int y =0;
    PIMAGE imgMap;
    //记录豆子的数目
    int cntFood;
    int cntJudge;
    //记录血量
    int cntBlood;


    //while(1)
    //{
        //每次重置地图都将数据归零
        cntFood=0;
        cntBlood=0;
        for(int i=0;i55;
            for(int j=0;j50;
                imgMap=newimage();
                //豆子
                if(pMap[i][j]==0)
                {
                    getimage(imgMap,"img\\food.bmp",0,0);
                    putimage(x,y,imgMap);

                    //遍历后剩余总数,计数豆子总数
                    cntFood++;
                }

                //cntJudge=cntFood;
                //树
                else if(pMap[i][j]==1)
                {
                    getimage(imgMap,"img\\shu.bmp",0,0);
                    putimage(x,y,imgMap);

                }
                //墙
                else if(pMap[i][j]==2)
                {
                    getimage(imgMap,"img\\wall.bmp",0,0);
                    putimage(x,y,imgMap);

                }
                //怪物
                else if(pMap[i][j]==3)
                {
                    getimage(imgMap,"img\\guaiwu1.bmp",0,0);
                    putimage(x,y,imgMap);
                    //传出怪物所在的位置
                    mstrow=i;
                    mstcol=j;
                    //怪物随机移动后的坐标就是(i,j)==(mstrow,mstcol)
                    //每次遍历都通过怪物坐标pMap[mstrow][mstcol]的值贴图并把坐标(i,j)传给(mstrow,mstcol)
                    //所以不需要修改pMap[mstrow][mstcol]的横纵坐标
                }

                else if(pMap[i][j]==5)  //左
                {
                    getimage(imgMap,"img\\renL.bmp",0,0);
                    putimage(x,y,imgMap);
                }
                else if(pMap[i][j]==6)  //右
                {
                    getimage(imgMap,"img\\renR.bmp",0,0);
                    putimage(x,y,imgMap);
                }
                else if(pMap[i][j]==7) //上
                {
                    getimage(imgMap,"img\\renU.bmp",0,0);
                    putimage(x,y,imgMap);
                }
                else if(pMap[i][j]==8) //下
                {
                    getimage(imgMap,"img\\renD.bmp",0,0);
                    putimage(x,y,imgMap);
                }
                else if(pMap[i][j]==9)  //空
                {

                }
                //血量
                else if(pMap[i][j]==10)
                {
                    getimage(imgMap,"img\\blood.bmp",0,0);
                    putimage(x,y,imgMap);
                    //遍历后剩余血量
                    cntBlood++;
                }

                //人物
                else if(pMap[i][j]==4)
                {
                    getimage(imgMap,"img\\ren.bmp",0,0);
                    putimage(x,y,imgMap);
                    row=i;
                    col=j;

                    /*pMap[i][j]==6;------->置空,不贴图,实现更新后原位置的图片消失
                    重新生成地图
                        row=i;
                        col=j;
                        左 pMap[row][col-1] 将上一个位置置为 pMap[row][col]==9 ,调用重新生成地图的函数updMap
                                            将此位置置为 pMap[row][col-1]==5
                        右 pMap[row][col+1]  置为6
                        上 pMap[row-11][col]     7
                        下 pMap[row+1][col]      8
                    */
                }
                delimage(imgMap);

            }

            //遍历数组之后的剩余豆子数目
            cntJudge=cntFood;
            //传出数据
            roleBlood=cntBlood;
            //在这里计算分数
            score=(TOTAL-cntJudge)*50;
        }
        //判断是否吃完所有豆子,吃完进入下一关卡
        if(cntJudge==0)
        {
            showScore();
            //进入下一关卡
            delay_ms(600);
            enterNext();
        }
        if(roleBlood==0)
        {
            //cleardevice();
            dieOver();
        }
        for ( ; is_run(); delay_fps(60))
        {
            showScore();
            //人物移动
            roleMove();
            //判断是否相撞
            crashJudge();
            //怪物随机移动
            mstMove();
        }
    //}

}

//人物移动
void roleMove()
{
    PIMAGE pUpd = newimage();
    key_msg kMsg ={0};

    //for ( ; is_run(); delay_fps(60))
    //{
        while(kbmsg())
        {
            kMsg = getkey();
        }
            //左
           if(kMsg.key==65&&kMsg.msg==key_msg_up&&(pMap[row][col-1]==0||pMap[row][col-1]==9||pMap[row][col-1]==3))
            {
            //outtextxy(50, 0, "A左");
            //将上一个位置的图片处理了
            //人物移动
            pMap[row][col-1]=5;
            pMap[row][col]=9;
            col=col-1;
            createMap();
            }
            //右
            else if(kMsg.key==68&&kMsg.msg==key_msg_up&&(pMap[row][col+1]==0||pMap[row][col+1]==9||pMap[row][col+1]==3))
            {
                //outtextxy(150, 0, "D右");
                pMap[row][col+1]=6;
                pMap[row][col]=9;
                col=col+1;
                createMap();
            }
            //上
            else if(kMsg.key==87&&kMsg.msg==key_msg_up&&(pMap[row-1][col]==0||pMap[row-1][col]==9||pMap[row-1][col]==3))
            {
                //outtextxy(0, 0, "W上");
                pMap[row-1][col]=7;
                pMap[row][col]=9;
                row=row-1;
                createMap();
            }
            //下
            else if(kMsg.key==83&&kMsg.msg==key_msg_up&&(pMap[row+1][col]==0||pMap[row+1][col]==9||pMap[row+1][col]==3))
            {
                //outtextxy(100, 0, "S下");
                pMap[row+1][col]=8;
                pMap[row][col]=9;
                row=row+1;
                createMap();
            }
    //}
    delimage(pUpd);
}

//怪物移动
//怪物坐标pMap[mstrow][mstcol]
void mstMove()
{
    //showScore();
    delay_ms(600);
    srand((unsigned) time(NULL));
    int inum=(rand()%4)+1;
    //左
    if(inum==1&&(pMap[mstrow][mstcol-1]==9
                 ||pMap[mstrow][mstcol-1]==5||pMap[mstrow][mstcol-1]==6||pMap[mstrow][mstcol-1]==7||pMap[mstrow][mstcol-1]==8))
    {
        pMap[mstrow][mstcol-1]=3;
        pMap[mstrow][mstcol]=9;
        createMap();

    }
    //右
    else if(inum==2&&(pMap[mstrow][mstcol+1]==9
                      ||pMap[mstrow][mstcol+1]==5 ||pMap[mstrow][mstcol+1]==6||pMap[mstrow][mstcol+1]==7||pMap[mstrow][mstcol+1]==8))
    {
        pMap[mstrow][mstcol+1]=3;
        pMap[mstrow][mstcol]=9;
        createMap();

    }
    //上
    else if(inum==3&&(pMap[mstrow-1][mstcol]==9
                      ||pMap[mstrow-1][mstcol]==5||pMap[mstrow-1][mstcol]==6||pMap[mstrow-1][mstcol]==7||pMap[mstrow-1][mstcol]==8))
    {
        pMap[mstrow-1][mstcol]=3;
        pMap[mstrow][mstcol]=9;
        createMap();

    }
    //下
    else if(inum==4&&(pMap[mstrow+1][mstcol]==9
                      ||pMap[mstrow+1][mstcol]==5 ||pMap[mstrow+1][mstcol]==6||pMap[mstrow+1][mstcol]==7||pMap[mstrow+1][mstcol]==8))
    {
        pMap[mstrow+1][mstcol]=3;
        pMap[mstrow][mstcol]=9;
        createMap();

    }
}

//碰撞判断
void crashJudge()
{
        if(pMap[row][col]==3&&roleBlood==3)
        {
            pMap[BLR][BLC3]=9;
        }
        else if (pMap[row][col]==3&&roleBlood==2)
        {
            pMap[BLR][BLC2]=9;
        }
        else if (pMap[row][col]==3&&roleBlood==1)
        {
            pMap[BLR][BLC1]=9;
        }
}
//输出分数
void showScore()
{
    char s[5];
    sprintf(s, "%d", score);
    setfont(-30, 0, "宋体");
    outtextxy(430, 510, s);

}

你可能感兴趣的:(c)