IE盒子

搜索
查看: 126|回复: 1

C语言之经典游戏推箱子(完整版)

[复制链接]

2

主题

6

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-12-12 14:50:37 | 显示全部楼层 |阅读模式
今天给大家分享一个经典的推箱子游戏!!!
废话不多说,先给大家来看看经典效果图:


正文源代码来啦!
////////////////////////////////////////////////////////////
//游戏中用0表示空地,1表示人物,2表示箱子,3表示目的地,6表示围墙
//
//画素材的x1和y1都是反的,因为x表示行,但是画出来x表示列,y同
////////////////////////////////////////////////////////////


#include <graphics.h>//EasyX_2011惊蛰版(绘图库)
#include <conio.h>
#include <stdlib.h>

int x, y;                                                        //人物坐标
int loop;                                                        //控制是否重新开始
IMAGE img[8];                             //定义IMAGE对象数组来保存图片


/*******************函数声明*******************/
void blank(int x1, int y1);                        //画空地
void man  (int x1, int y1);                        //画皮卡丘
void box  (int x1, int y1);                        //画箱子
void dest (int x1, int y1);                                        //画目的地
void man1 (int x1, int y1);                        //画在目的地上的皮卡丘
void box1 (int x1, int y1);                                        //画在目的地上的箱子
void wall (int x1, int y1);                        //画围墙
void man1 (int x1, int y1);                                        //画在胜利的皮卡丘
void print(int a[15][15]);                        //把数组里的全画出来
void move (int a[15][15], int x1, int y1);        //移动
void find (int a[15][15]);                        //找人物坐标
int  win  (int a[15][15]);                                        //判断游戏是否结束
int  play (int a[15][15]);                        //游戏过程
void play1 (void);                                //游戏关卡


/*******************函数定义*******************/
//画空地
void blank(int x1, int y1)       
{
        putimage(y1, x1, &img[0]);         // 在坐标 (y1, x1) 位置显示 IMAGE 对象
}

//画皮卡丘
void man(int x1, int y1)       
{
        putimage(y1, x1, &img[1]);         // 在坐标 (y1, x1) 位置显示 IMAGE 对象
}

//画箱子
void box(int x1, int y1)
{
        putimage(y1, x1, &img[2]);         // 在坐标 (y1, x1) 位置显示 IMAGE 对象
}

//画目的地
void dest(int x1, int y1)
{
        putimage(y1, x1, &img[3]);         // 在坐标 (y1, x1) 位置显示 IMAGE 对象
}

//画在目的地上的皮卡丘
void man1(int x1, int y1)
{
        putimage(y1, x1, &img[4]);         // 在坐标 (y1, x1) 位置显示 IMAGE 对象
}

//画在目的地上的箱子
void box1(int x1, int y1)
{
        putimage(y1, x1, &img[5]);         // 在坐标 (y1, x1) 位置显示 IMAGE 对象
}

//画围墙
void wall(int x1, int y1)
{
        putimage(y1, x1, &img[6]);         // 在坐标 (y1, x1) 位置显示 IMAGE 对象
}

//画胜利的皮卡丘
void man2(int x1, int y1)
{
        putimage(y1, x1, &img[7]);         // 在坐标 (y1, x1) 位置显示 IMAGE 对象
}

//把数组里的全画出来
void print(int a[][10])
{
        for(int x1 = 0; x1 < 10; x1++)
                for(int y1 = 0; y1 < 10; y1++)
                        putimage(60 * y1, 60 * x1, &img[a[x1][y1]]);
}

//移动
void move(int a[][10], int x1, int y1)
{
        if(a[x + x1][y + y1] == 0 || a[x + x1][y + y1] == 3)
        {
                a[x][y]--;
                a[x + x1][y + y1]++;
                for(int i = 0; i < 60; i++)
                {
                        blank(60 * x + i * x1, 60 * y + i * y1);                                //擦掉
                        man(60 * x + (i + 1) * x1, 60 * y + (i + 1) * y1);
                        Sleep(1);                                                                                                //为了降低CPU且保存流畅
                }
                if(a[x][y] == 3)
                        dest(60 * x, 60 * y);
                x += x1;
                y += y1;
                if(a[x][y] == 4)
                        man1(60 * x, 60 * y);
        }
        else if((a[x + x1][y + y1] == 2 || a[x + x1][y + y1] == 5) && (a[x + 2 * x1][y + 2 * y1] == 0 || a[x + 2 * x1][y + 2 * y1] == 3))
        {
                a[x][y]--;
                a[x + x1][y + y1]--;
                a[x + 2 * x1][y + 2 * y1] += 2;
                for(int i = 0; i < 60; i++)
                {
                        blank(60 * (x + x1) + i * x1, 60 * (y + y1) + i * y1);                //擦掉
                        box(60 * (x + x1) + (i + 1) * x1, 60 * (y + y1) + (i + 1) * y1);
                        blank(60 * x + i * x1, 60 * y + i * y1);                                                //擦掉
                        man(60 * x + (i + 1) * x1, 60 * y + (i + 1) * y1);
                        Sleep(1);                                                                                                                //为了降低CPU且保存流畅
                }
                if(a[x][y] == 3)
                        dest(60 * x, 60 * y);
                x += x1;
                y += y1;
                if(a[x][y] == 4)
                        man1(60 * x, 60 * y);
                if(a[x+x1][y+y1] == 5)
                        box1(60 * (x + x1), 60 * (y + y1));
        }
}

//找人物坐标想x,y
void find(int a[][10])
{
        for(x = 0; x < 10; x++)
                for(y = 0; y < 10; y++)
                        if(a[x][y] == 1) return;
}

//判断游戏是否结束
int win(int a[][10])
{
        for(int x1 = 0; x1 < 10; x1++)
                for(int y1 = 0; y1 < 10; y1++)
                        if(a[x1][y1] == 2) return 0;                                        //如果还有箱子返回假
        return 1;                                                                                                //如果没有箱子返回真
}


/************************游戏过程**********************/
//游戏过程
int play(int a[][10])
{
        loop = 0;
        print(a);
        find(a);                                                                                                //通过find函数寻找人物的x, y坐标
        do
        {
                switch(getch())                                                                                //获取键盘
                {
                        case 'w':
                        case 'W':move(a, -1, 0);        break;                                //上移
                        case 'a':
                        case 'A':move(a, 0, -1);        break;                                //左移
                        case 'd':
                        case 'D':move(a, 0, 1);                break;                                //右移
                        case 's':
                        case 'S':move(a, 1, 0);                break;                                //下移
                        case 'r':
                        case 'R':
                        case ' ':loop = 1;                return 0;                                //重新开始当前关
                        case  27:exit(0);                break;                                        //结束游戏
                        case 0:
                        case 0xE0:                                                                                //如果是方向键
                                switch(getch())                                                                //再次获取键盘
                                {
                                        case 72:move(a, -1, 0);        break;
                                        case 75:move(a, 0, -1);        break;
                                        case 77:move(a, 0, 1);         break;
                                        case 80:move(a, 1 , 0);
                                }
                }
        }while(!win(a));                                                                                //通过win函数判断是否通过
        man2(60 * x, 60 * y);                                                                        //画一个开心的皮卡丘
        getch();
        return 0;
}

//游戏关卡
void play1(void)
{
        int a[5][10][10]={                                                                                //定义三维地图数组
                                        {        {0},
                                                {0, 0, 6, 6, 6},
                                                {0, 0, 6, 3, 6},
                                                {0, 0, 6, 0, 6, 6, 6, 6},
                                                {6, 6, 6, 2, 0, 2, 3, 6},
                                                {6, 3, 0, 2, 1, 6, 6, 6},
                                                {6, 6, 6, 6, 2, 6},
                                                {0, 0, 0, 6, 3, 6},
                                                {0, 0, 0, 6, 6, 6} },
                                       
                                        {        {6, 6, 6, 6, 6},
                                                {6, 1, 0, 0, 6},
                                                {6, 0, 2, 2, 6, 0, 6, 6, 6},
                                                {6, 0, 2, 0, 6, 0, 6, 3, 6},
                                                {6, 6, 6, 0, 6, 6, 6, 3, 6},
                                                {0, 6, 6, 0, 0, 0, 0, 3, 6},
                                                {0, 6, 0, 0, 0, 6, 0, 0, 6},
                                                {0, 6, 0, 0, 0, 6, 6, 6, 6},
                                                {0, 6, 6, 6, 6, 6} },
                                       
                                        {        {0, 6, 6, 6, 6},
                                                {0, 6, 1, 0, 6, 6, 6},
                                                {0, 6, 0, 2, 0, 0, 6},
                                                {6, 6, 6, 0, 6, 0, 6, 6},
                                                {6, 3, 6, 0, 6, 0, 0, 6},
                                                {6, 3, 2, 0, 0, 6, 0, 6},
                                                {6, 3, 0, 0, 0, 2, 0, 6},
                                                {6, 6, 6, 6, 6, 6, 6, 6} },

                                        {        {0, 6, 6, 6, 6, 6, 6, 6},
                                                {0, 6, 0, 1, 3, 3, 3, 6},
                                                {0, 6, 0, 0, 0, 6, 6, 6, 6},
                                                {6, 6, 6, 2, 0, 0, 0, 0, 6},
                                                {6, 0, 0, 0, 6, 2, 6, 0, 6},
                                                {6, 0, 2, 0, 6, 0, 0, 0, 6},
                                                {6, 0, 0, 0, 6, 6, 6, 6, 6},
                                                {6, 6, 6, 6, 6} },
       
                                        {        {0, 6, 6, 6, 6, 6},
                                                {0, 6, 0, 1, 0, 6, 6, 6},
                                                {6, 6, 0, 6, 2, 0, 0, 6},
                                                {6, 0, 5 ,3, 0, 3, 0, 6},
                                                {6, 0, 0, 2, 2, 0, 6, 6},
                                                {6, 6, 6, 0, 6, 3, 6},
                                                {0, 0, 6, 0, 0, 0, 6},
                                                {0, 0, 6, 6, 6, 6, 6} } };
        int b[10][10];                                                                                //设置当前地图数组
        for(int i = 0; i < 5; i++)
        {
                do
        {
                        loop=0;                                                                                //loop置为0
                    for(int x1 = 0; x1 < 10; x1++)
                            for(int y1 = 0; y1 < 10; y1++)
                                    b[x1][y1] = a[x1][y1];                        //对当前地图数组分别赋值
                    play(b);
                }while(loop);                                                                        //如果loop被置为1则重新开始
        }
}
主函数

/************************主函数***********************/
int main(void)
{
        initgraph(600, 600);
        setbkcolor(WHITE);
        cleardevice();
        loadimage(&img[0], "图片\\0.jpg");
        loadimage(&img[1], "图片\\1.jpg");
        loadimage(&img[2], "图片\\2.jpg");
        loadimage(&img[3], "图片\\3.jpg");
        loadimage(&img[4], "图片\\4.jpg");
        loadimage(&img[5], "图片\\5.jpg");
        loadimage(&img[6], "图片\\6.jpg");
        loadimage(&img[7], "图片\\7.jpg");
        play1();
        closegraph();
        return 0;
}
/************************END**************************/为了帮助大家,轻松,高效学习C语言/C++,给大家分享我收集的资源,从最零基础开始的,帮助大家在学习C语言的道路上披荆斩棘!点击上方即可获取,还可以一起来学习交流嗷
回复

使用道具 举报

2

主题

10

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2025-5-7 20:12:41 | 显示全部楼层
站位支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表