C++ + easyx图形库 推箱子

头文件:

#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")

//格子边长
#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 },
    }
};

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

void DrawMap(int n);
void initscreen();
void ManUp();
int KbHit();
void ManUp();
void ManRight();
void ManLeft();
void ManDown();
int GameOver();
void drawGame();

CPP文件:

#include"SokoBan.h"

int main()
{
    initscreen();
    //播放音乐
    mciSendString(TEXT("open sun.mp3 alias mysong"), NULL, 0, NULL);
    mciSendString(TEXT("play mySong"), NULL, 0, NULL);

    while (1)
    {
        switch (KbHit())
        {
        case 4:ManUp(); break;
        case 2:ManLeft(); break;
        case 1:ManRight(); break;
        case 3:ManDown(); break;
        //case 0:continue;
        }
        drawGame();
        if (GameOver())
        {
            WhatMap++;
            Sleep(1000);
        }
        if (WhatMap == 3)break;
    }
    loadimage(&png[7], _T("6.jpg"), 10*SPACE, 10*SPACE, true);
    putimage(0, 0, &png[7]);
    Sleep(10000);
    return 0;
    //printf("作者:小豆芽\n时间:2018/12/18\n版权:2862841130@qq.com");
    //system("pause");
}

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

    //6.3.2 加载图片

    //0表示空地“ ”        1表示墙“■”        2代表目的地“⊙”        3代表人站在空地上“♀”        4代表箱子“□”
    //5箱子与目的地重合“◆”        6,人站在目的地上“♀”
    loadimage(&png[0], _T("0.jpg"), SPACE, SPACE, true);
    loadimage(&png[1], _T("1.jpg"), SPACE, SPACE, true);
    loadimage(&png[2], _T("2.jpg"), SPACE, SPACE, true);
    loadimage(&png[3], _T("3.jpg"), SPACE, SPACE, true);
    loadimage(&png[4], _T("4.jpg"), SPACE, SPACE, true);
    loadimage(&png[5], _T("5.jpg"), SPACE, SPACE, true);
    loadimage(&png[6], _T("3.jpg"), SPACE, SPACE, true);
    

    //以下是windows窗口
    //system("mode con cols=20 lines=10");        //cols  代表列    //lines   代表行
    //                                            //设置标题
    //SetConsoleTitleA("推箱子");                //设置标题
}
//贴图
void drawGame() {
    for (int i = 0; i < 10; i++) {//显示一行
        for (int j = 0; j < 10; j++) {//显示一个格子
            putimage(j*SPACE, i*SPACE, &png[map[WhatMap][i][j]]);
        }
    }
}

//画出地图

//0表示空地“ ”        1表示墙“■”        2代表目的地“⊙”        3代表人“♀”        4代表箱子“□”
//5箱子与目的地重合“◆”        6,人站在目的地
void DrawMap(int n)
{
    system("cls");
    for (int j = 0; j < 10; j++)
    {
        int i;
        for (i = 0; i < 10; i++)
        {
            if (map[WhatMap][i][j] == 0)printf("  ");
            if (map[WhatMap][i][j] == 1)printf("■");
            if (map[WhatMap][i][j] == 2)printf("⊙");
            if (map[WhatMap][i][j] == 3)printf("♀");
            if (map[WhatMap][i][j] == 4)printf("□");
            if (map[WhatMap][i][j] == 5)printf("◆");
            if (map[WhatMap][i][j] == 6)printf("♀");
        }
        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;
}

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

    //改变人的方向

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

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

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

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

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

    //改变人的方向

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

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

        else if (map[WhatMap][i][j+1] == 4)
        {
            //1,***********箱子右面是目的地
            if (map[WhatMap][i][j+2] == 2)
            {
                map[WhatMap][i][j] = 2;
                map[WhatMap][i][j+1] = 3;
                map[WhatMap][i][j+2] = 5;
            }
            //2,************箱子右面是空地
            else if (map[WhatMap][i][j+2] == 0)
            {
                map[WhatMap][i][j] = 2;
                map[WhatMap][i][j+1] = 3;
                map[WhatMap][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[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6)
            {
                flag = 1;
                break;
            }
        if (flag)break;
    }
    //人的位置是map[WhatMap][i][j];

    //改变人的方向

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

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

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

    //改变人的方向

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

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

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


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

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

运行效果:

 

游戏资源:

2.

1.

3.

4.

5.

6.

结束展示:

 

 

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不懂电脑的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值