easyx图形化界面应用——推箱子

本文介绍了如何使用EasyX图形库为C++初学者构建一个推箱子游戏。游戏设计包括界面设计、地图加载和刷新,以及通过键盘和鼠标事件控制人物移动。代码示例展示了地图数据结构、人物移动逻辑和界面交互的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EasyX 是针对 C++ 的图形库,可以帮助 C/C++ 初学者快速上手图形和游戏编程。

    Easyx的下载链接               EasyX Graphics Library for C++

easyx 可以默认为一个现成的图形化库函数,里面的函数可以直接通过头文件<graphics.h>和<conio.h>来调用。

这次以简易推箱子游戏为素材为大家讲一下自己的心得:

这个游戏的设计思路主要从界面设计,地图加载,贴图,地图刷新来实现。

//"map.h"

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<graphics.h>
#include<stdbool.h>
#include <mmsystem.h>          //播放音乐需要的头文件
#pragma comment(lib,"winmm.lib")

//定义当前关卡
int number = 0;//初始化位第0张地图

//格子边长
#define SPACE 60

//6.3.1 定义变量
IMAGE png[12];//5张图,定义5个变量,定义一个数组

#define MapMany 6

//枚举方向
enum CH {
	right = 1,
	left = 2,
	up = 3,
	down = 4
}ch;


//定义一个全局三维数组

//0表示空地,  1表示墙, 2代表目的地,  3代表人站在空地上,  4代表箱子,
//5箱子与目的地重合,  6,人站在目的地上,

//下面定义地图
int map[MapMany][10][10] = {
	//图一
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 2, 0, 1, 1, 0, 0, 0, 2, 1 },
	 { 1, 0, 0, 1, 1, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 1, 1, 0, 4, 1 },
	 { 1, 0, 0, 1, 1, 1, 1, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
	 { 1, 4, 0, 0, 0, 0, 0, 3, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图二
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 0, 1, 2, 0, 0, 0, 4, 0, 1 },
	 { 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
	 { 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
	 { 1, 0, 1, 1, 1, 1, 1, 0, 3, 1 },
	 { 1, 0, 1, 1, 1, 1, 1, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 2, 0, 0, 4, 0, 0, 0, 0, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图三
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 2, 0, 1, 0, 0, 3, 0, 0, 1 },
	 { 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 1, 1, 0, 0, 1 },
	 { 1, 4, 0, 1, 1, 1, 1, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 0, 0, 0, 4, 1 },
	 { 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 4, 0, 1, 0, 0, 1 },
	 { 1, 2, 0, 0, 0, 0, 1, 0, 2, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图四
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图五
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图六
	{
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	}
};




//"carry.h"

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<graphics.h>
#include<stdbool.h>//bool
//播放音乐需要的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#include"map.h"//地图
#include"direction.h"//方向

//贴图
void drawGame() {
    for (int i = 0; i < 10; i++) {//显示一行
        for (int j = 0; j < 10; j++) {//显示一个格子
            putimage(j * SPACE, i * SPACE, &png[map[number][i][j]]);

        }
    }
}


void DrawMap(int n)
{
    system("cls");//清屏
    for (int j = 0; j < 10; j++)
    {
        int i;
        for (i = 0; i < 10; i++)
        {
            if (map[number][i][j] == 0)
                putimage(j * SPACE, i * SPACE, &png[0]);
            if (map[number][i][j] == 1)
                putimage(j * SPACE, i * SPACE, &png[1]);
            if (map[number][i][j] == 2)
                putimage(j * SPACE, i * SPACE, &png[2]);
            if (map[number][i][j] == 3)
                putimage(j * SPACE, i * SPACE, &png[3]);
            if (map[number][i][j] == 4)
                putimage(j * SPACE, i * SPACE, &png[4]);
            if (map[number][i][j] == 5)
                putimage(j * SPACE, i * SPACE, &png[5]);
            if (map[number][i][j] == 6)
                putimage(j * SPACE, i * SPACE, &png[6]);
        }
        if (i < 9)printf("\n");
    }
}

//判断按键操作
int KbHit()
{
    if (GetAsyncKeyState(VK_UP) & 1)
        return up;
    else if (GetAsyncKeyState(VK_DOWN) & 1)
        return down;
    else if (GetAsyncKeyState(VK_RIGHT) & 1)
        return right;
    else if (GetAsyncKeyState(VK_LEFT) & 1)
        return left;
    else
        return 0;
}


//判断游戏是否结束
int GameOver()
{
    //统计目的地的个数
    int flag = 0;
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (map[number][i][j] == 2)
                flag++;
        }
    }

    //箱子到达目的地的个数
    int count = 0;
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (map[number][i][j] == 4)
                count++;
        }
    }
    if (count == 0 && flag == 0)
        return 1;
    else
        return 0;
}


//执行类
class Execute {

private:
    int x;
    int y;
    int flag;
    int x1, y1, x2, y2;
    int  j;
public:
    Execute() {
        x = 0;
        y = 0;
        x1 = 0; y1 = 0; x2 = 0; y2 = 0;

        flag = 0;
        j = 0;
   
    }

    int strat()
    {

        while (1)
        {
            drawGame();
            switch (KbHit())
            {
            case 4:ManUp(); break; //人向上运动
            case 2:ManLeft(); break;//人向左运动
            case 1:ManRight(); break;//人向右运动
            case 3:ManDown(); break;//人向下运动
            case 0:continue;
            }
            if (GameOver())
            {
                number++;
                Sleep(1000);
            }
            if (number == 6)
                break;
        }
        loadimage(&png[7], _T("D:\\1.jpg"), 10 * SPACE, 10 * SPACE);
        putimage(0, 0, &png[7]);
        settextcolor(BLUE);
        setbkmode(TRANSPARENT);
        outtextxy(280, 290, _T("通关"));
        Sleep(10000);

        return 0;
    }

    void draw_shape(int j)//实现功能
    {
        MOUSEMSG m;

        flag = 0;
        while (1)
        {
            m = GetMouseMsg();//获取鼠标信息
            x = m.x, y = m.y;

            if (m.y >= 0 && m.y < 100)//判断鼠标是否在可域内
            {
                break;
            }
            if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标是否按下
            {
                if (flag == 0)
                {
                    x1 = m.x;
                    y1 = m.y;
                    flag = 1;
                }
            }
            else if (m.uMsg == WM_LBUTTONUP && flag == 1)//判断鼠标是否弹起
            {
                x2 = m.x;
                y2 = m.y;
                if (j == 2)
                {
                    //开始执行
                    strat();
                }
                if (j == 3)
                {
                    cleardevice();//清屏
                }
                flag = 0;
            }

        }
    }
    //实现闪烁
    void mouse_kbhit()
    {
       
        MOUSEMSG m;// 定义消息变量
        while (true)
        {

            m = GetMouseMsg();// 获取一条鼠标或按键消息

            if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标点击位置
            {
                if (m.x >= 160 && m.x <= 330 && m.y >= 270 && m.y <= 350)
                {
                    j = 2;
                    setfillcolor(RED);  //设置实心颜色为红
                    solidrectangle(160, 270, 330, 350);//画一个实心的矩形
                    setfillcolor(WHITE);  //设置实心颜色为白
                    solidrectangle(160, 270, 330, 350);//画一个实心矩形
                    setbkmode(TRANSPARENT);   				     //字符透明
                    settextcolor(RGB(97, 274, 255));
                    outtextxy(180, 290, L"开始");
                    Sleep(100);
                    setfillcolor(RED);  //设置实心颜色为红
                    solidrectangle(160, 270, 330, 350);//画一个实心矩形
                    setcolor(WHITE);
                    rectangle(160, 270, 330, 350);    //画一个矩形边框
                    outtextxy(180, 290, L"开始");
                    //  draw_shape(j);
                    if ( j=2)
                    {
                        draw_shape(j);
                    }
                }

                else if (m.x >= 160 && m.x <= 330 && m.y >= 370 && m.y <= 450)//清空
                {
                    j = 3;
                    setfillcolor(RED);
                    solidrectangle(160, 370, 330, 450);
                    setfillcolor(WHITE);
                    solidrectangle(160, 370, 330, 450);
                    setbkmode(TRANSPARENT);   				     //字符透明
                    settextcolor(RGB(97, 274, 255));
                    outtextxy(180, 390, L"退出");
                    Sleep(100);
                    setfillcolor(RED);
                    solidrectangle(160, 370, 330, 450);
                    setcolor(WHITE);
                    rectangle(160, 370, 330, 450);    //画一个矩形边框
                    outtextxy(180, 390, L"退出");
                    // draw_shape(j);
                    if ( j=3)//清空
                    {
                        draw_shape(j);
                    }
                }
            }
        }
    }

};


//"direction.h"

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<graphics.h>
#include<stdbool.h>
//播放音乐需要的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#include"map.h"

//********************************************人向上移动
void ManUp()
{
    //先找到人的位置
    int i, j;
    for (i = 0; i < 10; i++)
    {
        int flag = 0;
        for (j = 0; j < 10; j++)
        {
            if (map[number][i][j] == 3 || map[number][i][j] == 6)
            {
                flag = 1;
                break;
            }
        }
        if (flag==1)
            break;
    }
    //人的位置是map[number][i][j];

    //改变人的方向

    //人的位置是空地
    if (map[number][i][j] == 3)
    {
        //***********人的上面是空地
        if (map[number][i + 1][j] == 0)
        {
            map[number][i][j] = 0;
            map[number][i + 1][j] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i + 1][j] == 2)
        {
            map[number][i][j] = 0;
            map[number][i + 1][j] = 6;
        }

        //*************人的上面是箱子
        else if (map[number][i + 1][j] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i + 2][j] == 2)
            {
                map[number][i][j] = 0;
                map[number][i + 1][j] = 3;
                map[number][i + 2][j] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i + 2][j] == 0)
            {
                map[number][i][j] = 0;
                map[number][i + 1][j] = 3;
                map[number][i + 2][j] = 4;
            }
        }

    }
    //人的位置是目的地
    else if (map[number][i][j] == 6)
    {

        //***********人的上面是空地

        if (map[number][i + 1][j] == 0)
        {
            map[number][i][j] = 2;
            map[number][i + 1][j] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i + 1][j] == 2)
        {
            map[number][i][j] = 2;
            map[number][i + 1][j] = 6;
        }
        //*************人的上面是箱子

        else if (map[number][i + 1][j] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i + 2][j] == 2)
            {
                map[number][i][j] = 2;
                map[number][i + 1][j] = 3;
                map[number][i + 2][j] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i + 2][j] == 0)
            {
                map[number][i][j] = 2;
                map[number][i + 1][j] = 3;
                map[number][i + 2][j] = 4;
            }
        }
    }
}

//********************************************人向右移动
void ManRight()
{
    //先找到人的位置
    int i, j;
    for (i = 0; i < 10; i++)
    {
        int flag = 0;
        for (j = 0; j < 10; j++)
            if (map[number][i][j] == 3 || map[number][i][j] == 6)
            {
                flag = 1;
                break;
            }
        if (flag)
            break;
    }
    //人的位置是map[number][i][j];

    //改变人的方向

    //人的位置是空地
    if (map[number][i][j] == 3)
    {
        //***********人的右面是空地
        if (map[number][i][j + 1] == 0)
        {
            map[number][i][j] = 0;
            map[number][i][j + 1] = 3;
        }
        //************人的右面是目的地
        else if (map[number][i][j + 1] == 2)
        {
            map[number][i][j] = 0;
            map[number][i][j + 1] = 6;
        }
        //*************人的右面是箱子
        else if (map[number][i][j + 1] == 4)
        {
            //1,***********箱子右面是目的地
            if (map[number][i][j + 2] == 2)
            {
                map[number][i][j] = 0;
                map[number][i][j + 1] = 3;
                map[number][i][j + 2] = 5;
            }
            //2,************箱子右面是空地
            else if (map[number][i][j + 2] == 0)
            {
                map[number][i][j] = 0;
                map[number][i][j + 1] = 3;
                map[number][i][j + 2] = 4;
            }
            //3,*************箱子右面是。。。。。
        }
    }
    //人的位置是目的地
    else if (map[number][i][j] == 6)
    {
        //***********人的右面是空地

        if (map[number][i][j + 1] == 0)
        {
            map[number][i][j] = 2;
            map[number][i][j + 1] = 3;
        }
        //************人的右面是目的地
        else if (map[number][i][j + 1] == 2)
        {
            map[number][i][j] = 2;
            map[number][i][j + 1] = 6;
        }
        //*************人的右面是箱子

        else if (map[number][i][j + 1] == 4)
        {
            //1,***********箱子右面是目的地
            if (map[number][i][j + 2] == 2)
            {
                map[number][i][j] = 2;
                map[number][i][j + 1] = 3;
                map[number][i][j + 2] = 5;
            }
            //2,************箱子右面是空地
            else if (map[number][i][j + 2] == 0)
            {
                map[number][i][j] = 2;
                map[number][i][j + 1] = 3;
                map[number][i][j + 2] = 4;
            }
            //3,*************箱子右面是。。。。。
        }
    }
}
//********************************************人向左移动
void ManLeft()
{
    //先找到人的位置
    int i, j;
    for (i = 0; i < 10; i++)
    {
        int flag = 0;
        for (j = 0; j < 10; j++)
            if (map[number][i][j] == 3 || map[number][i][j] == 6)
            {
                flag = 1;
                break;
            }
        if (flag)break;
    }
    //人的位置是map[number][i][j];

    //改变人的方向

    //人的位置是空地
    if (map[number][i][j] == 3)
    {
        //***********人的左面是空地
        if (map[number][i][j - 1] == 0)
        {
            map[number][i][j] = 0;
            map[number][i][j - 1] = 3;
        }
        //************人的左面是目的地
        else if (map[number][i][j - 1] == 2)
        {
            map[number][i][j] = 0;
            map[number][i][j - 1] = 6;
        }
        //*************人的左面是箱子
        else if (map[number][i][j - 1] == 4)
        {
            //1,***********箱子左面是目的地
            if (map[number][i][j - 2] == 2)
            {
                map[number][i][j] = 0;
                map[number][i][j - 1] = 3;
                map[number][i][j - 2] = 5;
            }
            //2,************箱子左面是空地
            else if (map[number][i][j - 2] == 0)
            {
                map[number][i][j] = 0;
                map[number][i][j - 1] = 3;
                map[number][i][j - 2] = 4;
            }
        }
    }
    //人的位置是目的地
    else if (map[number][i][j] == 6)
    {
        //***********人的上面是空地

        if (map[number][i][j - 1] == 0)
        {
            map[number][i][j] = 2;
            map[number][i][j - 1] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i][j - 1] == 2)
        {
            map[number][i][j] = 2;
            map[number][i][j - 1] = 6;
        }
        //*************人的上面是箱子

        else if (map[number][i][j - 1] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i][j - 2] == 2)
            {
                map[number][i][j] = 2;
                map[number][i][j - 1] = 3;
                map[number][i][j - 2] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i][j - 2] == 0)
            {
                map[number][i][j] = 2;
                map[number][i][j - 1] = 3;
                map[number][i][j - 2] = 4;
            }
        }
    }
}
//********************************************人向下移动
void ManDown()
{
    //先找到人的位置
    int i, j;
    for (i = 0; i < 10; i++)
    {
        int flag = 0;
        for (j = 0; j < 10; j++)
            if (map[number][i][j] == 3 || map[number][i][j] == 6)
            {
                flag = 1;
                break;
            }
        if (flag)
            break;
    }
    //人的位置是map[number][i][j];

    //改变人的方向

    //人的位置是空地
    if (map[number][i][j] == 3)
    {
        //***********人的下面是空地
        if (map[number][i - 1][j] == 0)
        {
            map[number][i][j] = 0;
            map[number][i - 1][j] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i - 1][j] == 2)
        {
            map[number][i][j] = 0;
            map[number][i - 1][j] = 6;
        }
        //*************人的上面是箱子
        else if (map[number][i - 1][j] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i - 2][j] == 2)
            {
                map[number][i][j] = 0;
                map[number][i - 1][j] = 3;
                map[number][i - 2][j] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i - 2][j] == 0)
            {
                map[number][i][j] = 0;
                map[number][i - 1][j] = 3;
                map[number][i - 2][j] = 4;
            }
        }
    }
    //人的位置是目的地
    else if (map[number][i][j] == 6)
    {
        //***********人的上面是空地

        if (map[number][i - 1][j] == 0)
        {
            map[number][i][j] = 2;
            map[number][i - 1][j] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i - 1][j] == 2)
        {
            map[number][i][j] = 2;
            map[number][i - 1][j] = 6;
        }
        //*************人的上面是箱子

        else if (map[number][i - 1][j] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i - 2][j] == 2)
            {
                map[number][i][j] = 2;
                map[number][i - 1][j] = 3;
                map[number][i - 2][j] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i - 2][j] == 0)
            {
                map[number][i][j] = 2;
                map[number][i - 1][j] = 3;
                map[number][i - 2][j] = 4;
            }
        }
    }
}



//.cpp

#include"map.h"
#include"direction.h"
#include"carry.h"

#define  SND_FILMNAME

//声明函数区
//************************************************************
//画出地图
void DrawMap(int n);
void drawGame();
void initscreen();//加载界面
//判断按键操作
void draw_picture();//背景图
void draw_bkcolor();//设置背景
int KbHit();//判断方向
//方向
void ManUp();
void ManRight();
void ManLeft();
void ManDown();
int GameOver();//结束游戏

//*******************************************************


//设置窗口大小
void initscreen()
{
    initgraph(10 * SPACE, 10 * SPACE);

    setbkcolor(WHITE);//设置面板颜色
    cleardevice();


    //0表示空地 , 1表示墙  , 2代表目的地, 3代表人,  4代表箱子
//5箱子与目的地重合,  6人站在目的地
    loadimage(&png[0], _T("D:\\0.jpg"), SPACE, SPACE);
    loadimage(&png[1], _T("D:\\1.jpg"), SPACE, SPACE);
    loadimage(&png[2], _T("D:\\2.jpg"), SPACE, SPACE);
    loadimage(&png[3], _T("D:\\3.jpg"), SPACE, SPACE);
    loadimage(&png[4], _T("D:\\4.jpg"), SPACE, SPACE);
    loadimage(&png[5], _T("D:\\5.jpg"), SPACE, SPACE);
    loadimage(&png[6], _T("D:\\6.jpg"), SPACE, SPACE);

}


void draw_bkcolor()//设置背景
{

    setfillcolor(0xAAAA00);
    fillroundrect(120, 150, 360, 200, 30, 10);
    settextcolor(BLUE);
    setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
    settextstyle(40, 30, _T("宋体"));
    outtextxy(140, 160, _T("推箱子"));

    setfillcolor(RED);
    fillroundrect(160, 270, 330, 350, 30, 10);//设置圆角填充矩形(开始按钮)
    settextcolor(BLUE);
    setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
    settextstyle(40, 30, _T("宋体"));
    outtextxy(180, 290, _T("开始"));

    setfillcolor(RED);
    fillroundrect(160, 370, 330, 450, 30, 10);
    settextcolor(BLUE);
    setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
    settextstyle(40, 30, _T("宋体"));
    outtextxy(180, 390, _T("退出"));
}


void draw_picture()//背景图
{
    IMAGE imag;
    loadimage(&imag, _T("D:\\as.jpg"), 0, 0);
    Resize(NULL, imag.getwidth(), imag.getheight());
    putimage(0, 0, &imag);
}



int main()
{
    initscreen();
    draw_picture();//背景图
    draw_bkcolor();//设置背景
    //播放音乐
    mciSendString(_T("open misck.wav.mp3 alias bkmusic"), NULL, 0, NULL);//播放音乐
    mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL);//重复播放

    Execute execute;//执行
    execute. mouse_kbhit();//按钮
   
    system("pause");
    return 0;

   
}


一,界面设计

界面设计主要应用loadimage读取图片文件和putimage在当前绘图设备上绘制指定图像。

设计界面时可以先设计背景以及旋钮的位置,然后将对应的功能添加。

背景设计之后添加对应功能,将功能与界面相连接需通过鼠标和按键来传递信息,这里就需要处理信息的函数。

清空鼠标消息缓冲区。
GetMouseMsg获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。
PeekMouseMsg获取一个鼠标消息,并立即返回。
MouseHit检测当前是否有鼠标消息。
MOUSEMSG保存鼠标消息的结构体。

鼠标按键以及移动的控制信息

WM_MOUSEMOVE鼠标移动消息。
WM_MOUSEWHEEL鼠标滚轮拨动消息。
WM_LBUTTONDOWN左键按下消息。
WM_LBUTTONUP左键弹起消息。
WM_LBUTTONDBLCLK左键双击消息。
WM_MBUTTONDOWN中键按下消息。
WM_MBUTTONUP中键弹起消息。
WM_MBUTTONDBLCLK中键双击消息。
WM_RBUTTONDOWN右键按下消息。
WM_RBUTTONUP右键弹起消息。
WM_RBUTTONDBLCLK右键双击消息。

mkCtrl

实例:

 

​void draw_bkcolor()//设置背景
{

    setfillcolor(0xAAAA00);//红色
    fillroundrect(120, 150, 360, 200, 30, 10);
    settextcolor(BLUE);
    setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
    settextstyle(40, 30, _T("宋体"));
    outtextxy(140, 160, _T("推箱子"));

    setfillcolor(RED);
    fillroundrect(160, 270, 330, 350, 30, 10);//设置圆角填充矩形(开始按钮)
    settextcolor(BLUE);
    setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
    settextstyle(40, 30, _T("宋体"));
    outtextxy(180, 290, _T("开始"));

    setfillcolor(RED);
    fillroundrect(160, 370, 330, 450, 30, 10);
    settextcolor(BLUE);
    setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
    settextstyle(40, 30, _T("宋体"));
    outtextxy(180, 390, _T("退出"));
}


void draw_picture()//背景图
{
    IMAGE imag;
    loadimage(&imag, _T("D:\\as.jpg"), 0, 0);
    Resize(NULL, imag.getwidth(), imag.getheight());
    putimage(0, 0, &imag);
}


//执行类
class Execute {

private:
    int x;
    int y;
    int flag;
    int x1, y1, x2, y2;
    int  j;
public:
    Execute() {
        x = 0;
        y = 0;
        x1 = 0; y1 = 0; x2 = 0; y2 = 0;

        flag = 0;
        j = 0;
   
    }

    int strat()
    {

        while (1)
        {
            drawGame();
            switch (KbHit())
            {
            case 4:ManUp(); break; //人向上运动
            case 2:ManLeft(); break;//人向左运动
            case 1:ManRight(); break;//人向右运动
            case 3:ManDown(); break;//人向下运动
            case 0:continue;
            }
            if (GameOver())
            {
                number++;
                Sleep(1000);
            }
            if (number == 6)
                break;
        }
        loadimage(&png[7], _T("D:\\1.jpg"), 10 * SPACE, 10 * SPACE);
        putimage(0, 0, &png[7]);
        settextcolor(BLUE);
        setbkmode(TRANSPARENT);
        outtextxy(280, 290, _T("通关"));
        Sleep(10000);

        return 0;
    }

    void draw_shape(int j)//实现功能
    {
        MOUSEMSG m;

        flag = 0;
        while (1)
        {
            m = GetMouseMsg();//获取鼠标信息
            x = m.x, y = m.y;

            if (m.y >= 0 && m.y < 100)//判断鼠标是否在可域内
            {
                break;
            }
            if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标是否按下
            {
                if (flag == 0)
                {
                    x1 = m.x;
                    y1 = m.y;
                    flag = 1;
                }
            }
            else if (m.uMsg == WM_LBUTTONUP && flag == 1)//判断鼠标是否弹起
            {
                x2 = m.x;
                y2 = m.y;
                if (j == 2)
                {
                    //开始执行
                    strat();
                }
                if (j == 3)
                {
                    cleardevice();//清屏
                }
                flag = 0;
            }

        }
    }
    //实现闪烁
    void mouse_kbhit()
    {
       
        MOUSEMSG m;// 定义消息变量
        while (true)
        {

            m = GetMouseMsg();// 获取一条鼠标或按键消息

            if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标点击位置
            {
                if (m.x >= 160 && m.x <= 330 && m.y >= 270 && m.y <= 350)
                {
                    j = 2;
                    setfillcolor(RED);  //设置实心颜色为红
                    solidrectangle(160, 270, 330, 350);//画一个实心的矩形
                    setfillcolor(WHITE);  //设置实心颜色为白
                    solidrectangle(160, 270, 330, 350);//画一个实心矩形
                    setbkmode(TRANSPARENT);   				     //字符透明
                    settextcolor(RGB(97, 274, 255));
                    outtextxy(180, 290, L"开始");
                    Sleep(100);
                    setfillcolor(RED);  //设置实心颜色为红
                    solidrectangle(160, 270, 330, 350);//画一个实心矩形
                    setcolor(WHITE);
                    rectangle(160, 270, 330, 350);    //画一个矩形边框
                    outtextxy(180, 290, L"开始");
                    //  draw_shape(j);
                    if ( j=2)
                    {
                        draw_shape(j);
                    }
                }

                else if (m.x >= 160 && m.x <= 330 && m.y >= 370 && m.y <= 450)//清空
                {
                    j = 3;
                    setfillcolor(RED);
                    solidrectangle(160, 370, 330, 450);
                    setfillcolor(WHITE);
                    solidrectangle(160, 370, 330, 450);
                    setbkmode(TRANSPARENT);   				     //字符透明
                    settextcolor(RGB(97, 274, 255));
                    outtextxy(180, 390, L"退出");
                    Sleep(100);
                    setfillcolor(RED);
                    solidrectangle(160, 370, 330, 450);
                    setcolor(WHITE);
                    rectangle(160, 370, 330, 450);    //画一个矩形边框
                    outtextxy(180, 390, L"退出");
                    // draw_shape(j);
                    if ( j=3)//清空
                    {
                        draw_shape(j);
                    }
                }
            }
        }
    }

};

​

二,地图加载

用一个三维数组表示地图,用mapmany来表示地图的数量(游戏关卡),后面的二位数组排列平面地图,

//定义当前关卡
int number = 0;//初始化位第0张地图

//格子边长
#define SPACE 60

//6.3.1 定义变量
IMAGE png[12];//5张图,定义5个变量,定义一个数组

#define MapMany 6

//枚举方向
enum CH {
	right = 1,
	left = 2,
	up = 3,
	down = 4
}ch;


//定义一个全局三维数组

//0表示空地,  1表示墙, 2代表目的地,  3代表人站在空地上,  4代表箱子,
//5箱子与目的地重合,  6,人站在目的地上,

//下面定义地图
int map[MapMany][10][10] = {
	//图一
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 2, 0, 1, 1, 0, 0, 0, 2, 1 },
	 { 1, 0, 0, 1, 1, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 1, 1, 0, 4, 1 },
	 { 1, 0, 0, 1, 1, 1, 1, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
	 { 1, 4, 0, 0, 0, 0, 0, 3, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图二
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 0, 1, 2, 0, 0, 0, 4, 0, 1 },
	 { 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
	 { 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
	 { 1, 0, 1, 1, 1, 1, 1, 0, 3, 1 },
	 { 1, 0, 1, 1, 1, 1, 1, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 2, 0, 0, 4, 0, 0, 0, 0, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图三
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 2, 0, 1, 0, 0, 3, 0, 0, 1 },
	 { 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 1, 1, 0, 0, 1 },
	 { 1, 4, 0, 1, 1, 1, 1, 0, 0, 1 },
	 { 1, 0, 0, 1, 1, 0, 0, 0, 4, 1 },
	 { 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 4, 0, 1, 0, 0, 1 },
	 { 1, 2, 0, 0, 0, 0, 1, 0, 2, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图四
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图五
	{
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	//图六
	{
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	}
};

三,地图刷新

地图的刷新主要是人物移动之后,地图中的物件开始更新位置。

人物移动,刷新地图。首先在地图中找到人的位置

人后判断人周围的环境状况,当人物移动之后将移动后的位置更新为人的位置,将之前的人的位置更新为空地。当人和箱子在一条线上时,人的位置更新的同时也更新箱子的位置,实现人推箱子移动的过程。

          //地图刷新
//********************************************人向上移动
void ManUp()
{
    //先找到人的位置
    int i, j;
    for (i = 0; i < 10; i++)
    {
        int flag = 0;
        for (j = 0; j < 10; j++)
        {
            if (map[number][i][j] == 3 || map[number][i][j] == 6)
            {
                flag = 1;
                break;
            }
        }
        if (flag==1)
            break;
    }
    //人的位置是map[number][i][j];

    //改变人的方向

    //人的位置是空地
    if (map[number][i][j] == 3)
    {
        //***********人的上面是空地
        if (map[number][i + 1][j] == 0)
        {
            map[number][i][j] = 0;
            map[number][i + 1][j] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i + 1][j] == 2)
        {
            map[number][i][j] = 0;
            map[number][i + 1][j] = 6;
        }

        //*************人的上面是箱子
        else if (map[number][i + 1][j] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i + 2][j] == 2)
            {
                map[number][i][j] = 0;
                map[number][i + 1][j] = 3;
                map[number][i + 2][j] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i + 2][j] == 0)
            {
                map[number][i][j] = 0;
                map[number][i + 1][j] = 3;
                map[number][i + 2][j] = 4;
            }
        }

    }
    //人的位置是目的地
    else if (map[number][i][j] == 6)
    {

        //***********人的上面是空地

        if (map[number][i + 1][j] == 0)
        {
            map[number][i][j] = 2;
            map[number][i + 1][j] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i + 1][j] == 2)
        {
            map[number][i][j] = 2;
            map[number][i + 1][j] = 6;
        }
        //*************人的上面是箱子

        else if (map[number][i + 1][j] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i + 2][j] == 2)
            {
                map[number][i][j] = 2;
                map[number][i + 1][j] = 3;
                map[number][i + 2][j] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i + 2][j] == 0)
            {
                map[number][i][j] = 2;
                map[number][i + 1][j] = 3;
                map[number][i + 2][j] = 4;
            }
        }
    }
}

//********************************************人向右移动
void ManRight()
{
    //先找到人的位置
    int i, j;
    for (i = 0; i < 10; i++)
    {
        int flag = 0;
        for (j = 0; j < 10; j++)
            if (map[number][i][j] == 3 || map[number][i][j] == 6)
            {
                flag = 1;
                break;
            }
        if (flag)
            break;
    }
    //人的位置是map[number][i][j];

    //改变人的方向

    //人的位置是空地
    if (map[number][i][j] == 3)
    {
        //***********人的右面是空地
        if (map[number][i][j + 1] == 0)
        {
            map[number][i][j] = 0;
            map[number][i][j + 1] = 3;
        }
        //************人的右面是目的地
        else if (map[number][i][j + 1] == 2)
        {
            map[number][i][j] = 0;
            map[number][i][j + 1] = 6;
        }
        //*************人的右面是箱子
        else if (map[number][i][j + 1] == 4)
        {
            //1,***********箱子右面是目的地
            if (map[number][i][j + 2] == 2)
            {
                map[number][i][j] = 0;
                map[number][i][j + 1] = 3;
                map[number][i][j + 2] = 5;
            }
            //2,************箱子右面是空地
            else if (map[number][i][j + 2] == 0)
            {
                map[number][i][j] = 0;
                map[number][i][j + 1] = 3;
                map[number][i][j + 2] = 4;
            }
            //3,*************箱子右面是。。。。。
        }
    }
    //人的位置是目的地
    else if (map[number][i][j] == 6)
    {
        //***********人的右面是空地

        if (map[number][i][j + 1] == 0)
        {
            map[number][i][j] = 2;
            map[number][i][j + 1] = 3;
        }
        //************人的右面是目的地
        else if (map[number][i][j + 1] == 2)
        {
            map[number][i][j] = 2;
            map[number][i][j + 1] = 6;
        }
        //*************人的右面是箱子

        else if (map[number][i][j + 1] == 4)
        {
            //1,***********箱子右面是目的地
            if (map[number][i][j + 2] == 2)
            {
                map[number][i][j] = 2;
                map[number][i][j + 1] = 3;
                map[number][i][j + 2] = 5;
            }
            //2,************箱子右面是空地
            else if (map[number][i][j + 2] == 0)
            {
                map[number][i][j] = 2;
                map[number][i][j + 1] = 3;
                map[number][i][j + 2] = 4;
            }
            //3,*************箱子右面是。。。。。
        }
    }
}
//********************************************人向左移动
void ManLeft()
{
    //先找到人的位置
    int i, j;
    for (i = 0; i < 10; i++)
    {
        int flag = 0;
        for (j = 0; j < 10; j++)
            if (map[number][i][j] == 3 || map[number][i][j] == 6)
            {
                flag = 1;
                break;
            }
        if (flag)break;
    }
    //人的位置是map[number][i][j];

    //改变人的方向

    //人的位置是空地
    if (map[number][i][j] == 3)
    {
        //***********人的左面是空地
        if (map[number][i][j - 1] == 0)
        {
            map[number][i][j] = 0;
            map[number][i][j - 1] = 3;
        }
        //************人的左面是目的地
        else if (map[number][i][j - 1] == 2)
        {
            map[number][i][j] = 0;
            map[number][i][j - 1] = 6;
        }
        //*************人的左面是箱子
        else if (map[number][i][j - 1] == 4)
        {
            //1,***********箱子左面是目的地
            if (map[number][i][j - 2] == 2)
            {
                map[number][i][j] = 0;
                map[number][i][j - 1] = 3;
                map[number][i][j - 2] = 5;
            }
            //2,************箱子左面是空地
            else if (map[number][i][j - 2] == 0)
            {
                map[number][i][j] = 0;
                map[number][i][j - 1] = 3;
                map[number][i][j - 2] = 4;
            }
        }
    }
    //人的位置是目的地
    else if (map[number][i][j] == 6)
    {
        //***********人的上面是空地

        if (map[number][i][j - 1] == 0)
        {
            map[number][i][j] = 2;
            map[number][i][j - 1] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i][j - 1] == 2)
        {
            map[number][i][j] = 2;
            map[number][i][j - 1] = 6;
        }
        //*************人的上面是箱子

        else if (map[number][i][j - 1] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i][j - 2] == 2)
            {
                map[number][i][j] = 2;
                map[number][i][j - 1] = 3;
                map[number][i][j - 2] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i][j - 2] == 0)
            {
                map[number][i][j] = 2;
                map[number][i][j - 1] = 3;
                map[number][i][j - 2] = 4;
            }
        }
    }
}
//********************************************人向下移动
void ManDown()
{
    //先找到人的位置
    int i, j;
    for (i = 0; i < 10; i++)
    {
        int flag = 0;
        for (j = 0; j < 10; j++)
            if (map[number][i][j] == 3 || map[number][i][j] == 6)
            {
                flag = 1;
                break;
            }
        if (flag)
            break;
    }
    //人的位置是map[number][i][j];

    //改变人的方向

    //人的位置是空地
    if (map[number][i][j] == 3)
    {
        //***********人的下面是空地
        if (map[number][i - 1][j] == 0)
        {
            map[number][i][j] = 0;
            map[number][i - 1][j] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i - 1][j] == 2)
        {
            map[number][i][j] = 0;
            map[number][i - 1][j] = 6;
        }
        //*************人的上面是箱子
        else if (map[number][i - 1][j] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i - 2][j] == 2)
            {
                map[number][i][j] = 0;
                map[number][i - 1][j] = 3;
                map[number][i - 2][j] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i - 2][j] == 0)
            {
                map[number][i][j] = 0;
                map[number][i - 1][j] = 3;
                map[number][i - 2][j] = 4;
            }
        }
    }
    //人的位置是目的地
    else if (map[number][i][j] == 6)
    {
        //***********人的上面是空地

        if (map[number][i - 1][j] == 0)
        {
            map[number][i][j] = 2;
            map[number][i - 1][j] = 3;
        }
        //************人的上面是目的地
        else if (map[number][i - 1][j] == 2)
        {
            map[number][i][j] = 2;
            map[number][i - 1][j] = 6;
        }
        //*************人的上面是箱子

        else if (map[number][i - 1][j] == 4)
        {
            //1,***********箱子上面是目的地
            if (map[number][i - 2][j] == 2)
            {
                map[number][i][j] = 2;
                map[number][i - 1][j] = 3;
                map[number][i - 2][j] = 5;
            }
            //2,************箱子上面是空地
            else if (map[number][i - 2][j] == 0)
            {
                map[number][i][j] = 2;
                map[number][i - 1][j] = 3;
                map[number][i - 2][j] = 4;
            }
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值