推箱子小游戏

发布于:2022-12-10 ⋅ 阅读:(710) ⋅ 点赞:(0)

#include<graphics.h> //图形库
#include<iostream>
#include<string>
#include<Windows.h>
#include<conio.h>
using namespace std;

#define RATIO 61
#define SCREEN_WIDTH  960
#define SCREEN_HEIGHT 768
//控制键 上、下、左、右控制方向,’q’退出
#define KEY_UP    'w' 
#define KEY_LEFT   'a' 
#define KEY_RIGHT  'd' 
#define KEY_DOWN   's' 
#define KEY_QUIT   'q' 


#define LINE 9
#define COLUMN 12

#define START_X 100
#define START_Y 150
#define isValid(pos)  pos.x >=0 && pos.x<LINE && pos.y>=0 && pos.y<COLUMN

enum _PROPS
{
    WALL,    //墙
    FLOOR, //地板
    BOX_DES, //箱子目的地
    MAN, //小人
    BOX, //箱子
    HIT,  //箱子到达目的地
    ALL // 所有个数
};

//游戏控制方向
enum _DIRECTION
{
    UP,
    DOWN,
    LEFT,
    RIGHT
};

struct _POS 
{
    int x; //小人所在的二维数组的行
    int y; //小人所在的二维数组的列
};

IMAGE images[ALL];

struct _POS man; //小人在二维数组里面的位置

//游戏地图
int map[LINE][COLUMN] = {
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
    { 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 0, 0 },
    { 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 }, 
    { 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },
    { 0, 1, 1, 1, 0, 3, 1, 1, 1, 4, 1, 0 }, 
    { 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }

};
/****************************************
*判断游戏是否结束,如果不存在任何箱子目的地,就代表游戏结束
*输入:无
* 返回值:true 游戏结束;false 游戏继续
*****************************************/

bool isGameOver()
{
    for (int i = 0; i < LINE; i++)
    {
        for (int j = 0; j < COLUMN; j++)
        {
            if (map[i][j]==BOX_DES)
            {
                return false;
            }
        }
    }
    return true;
}

void gameOverScene(IMAGE*bg)
{
    putimage(0, 0, bg);
    settextcolor(WHITE);
    RECT rec = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT };
    settextstyle(20, 0, _T("宋体"));
    drawtext(_T("牛逼!"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}


/****************************************
*改变游戏地图视图中一格对应道具并重新显示
*输入:
*    line - 道具在地图数组的行下标
*    column- 道具在地图数组的列下标
*    prop  -道具的类型
*****************************************/
void changeMap(struct _POS*pos, enum _PROPS prop)
{
    map[pos->x][pos->y] = prop;
    putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);

}

/***************************************
*实现游戏四个方向(上、下、左、右)的控制
*输入:
*direct:-人前进方向
*输出:无
****************************************/
void gameControl(enum _DIRECTION direct)
{
    struct _POS next_pos = man;
    struct _POS next_next_pos = man;
    switch (direct)
    {
    case UP:
        next_pos.x--;
        next_next_pos.x -= 2;
        break;
    case DOWN:
        next_pos.x++;
        next_next_pos.x += 2;
        break;
    case LEFT:
        next_pos.y--;
        next_next_pos.y -= 2;
        break;
    case RIGHT:
        next_pos.y++;
        next_next_pos.y += 2;
        break;
    }


    if ( isValid(next_pos)&& map[next_pos.x][next_pos.y] == FLOOR)
    {
        changeMap(&next_pos, MAN); //前进一格
        changeMap(&man, FLOOR);
        man = next_pos;
    }
    else if (isValid(next_next_pos) && map[next_pos.x][next_pos.y] == BOX)
    {
        //两种情况,箱子前面是地板或者是目的地
        if (map[next_next_pos.x][next_next_pos.y] == FLOOR)
        {
            changeMap(&next_next_pos, BOX);
            changeMap(&next_pos, MAN); //前进一格
            changeMap(&man, FLOOR);
            man = next_pos;
        }
        else if ( map[next_next_pos.x][next_next_pos.y] == BOX_DES)
        {
            changeMap(&next_next_pos, HIT);
            changeMap(&next_pos, MAN); //前进一格
            changeMap(&man, FLOOR);
            man = next_pos;
        }
    }
    

}

int main()
{
    IMAGE bg_img;
    //搭台唱戏
    initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
    loadimage(&bg_img, _T("blackground.bmp"), SCREEN_WIDTH, SCREEN_HEIGHT,true); //_T编码转换
    putimage(0, 0, &bg_img);

    //加载道具图标
    loadimage(&images[WALL], _T("wall_right.bmp"), RATIO, RATIO, true);
    loadimage(&images[FLOOR], _T("floor.bmp"), RATIO, RATIO, true);
    loadimage(&images[BOX_DES], _T("des.bmp"), RATIO, RATIO, true);
    loadimage(&images[MAN], _T("man.bmp"), RATIO, RATIO, true);
    loadimage(&images[BOX], _T("box.bmp"), RATIO, RATIO, true);
    loadimage(&images[HIT], _T("box.bmp"), RATIO, RATIO, true);
    
    for (int i = 0; i < LINE; i++)
    {
        for (int j = 0; j < COLUMN; j++)
        {
            if (map[i][j]==MAN)
            {
                man.x = i;
                man.y = j;
            }


            putimage(START_X +j * RATIO, START_Y +i * RATIO, &images[map[i][j]]);
        }
    }

//游戏环节
    bool quit = false;

    do
    {
        if (_kbhit())//玩家有键盘事件
        {
            char ch = _getch();
            if (ch == KEY_UP)
            {
                gameControl(UP);
            }
            else if (ch ==KEY_DOWN)
            {
                gameControl(DOWN);
            }
            else if (ch ==KEY_LEFT)
            {
                gameControl(LEFT);
            }
            else if (ch ==KEY_RIGHT)
            {
                gameControl(RIGHT);
            }
            else if(ch ==KEY_QUIT)
            {
                quit = true;
            }
            if (isGameOver())
            {
                gameOverScene(&bg_img);
                quit = true;
            }

        }
        Sleep(100);

    } while (quit==false);
    
    system("pause");
    //游戏结束,释放资源
    closegraph();
    return 0;

}649501f7eb0044ebb2961324e627dd53.png

 14209a5097fc4be9af4a2a2d6d0edec9.png

 

本文含有隐藏内容,请 开通VIP 后查看