推箱子

c语言小游戏-推箱子,废话少说,上代码:

 

#include <stdio.h>

#include <conio.h> //控制台输入输出的头文件

// getch();

#include <graphics.h> //头文件 必须要安装图形库

//图形库的头文件

//播放音乐的头文件

#include <mmsystem.h>

#pragma comment(lib,"winmm.lib") //一个静态库

int Map[8][8] = {

    0, 0, 0, 1, 1, 1, 0, 0,

    0, 0, 0, 1, 3, 1, 0, 0,

    1, 1, 1, 1, 0, 1, 0, 0,

    1, 3, 4, 0, 4, 1, 1, 1,

    1, 1, 1, 5, 4, 0, 3, 1,

    0, 0, 1, 4, 1, 1, 1, 1,

    0, 0, 1, 3, 1, 0, 0, 0,

    0, 0, 1, 1, 1, 0, 0, 0

};

 

void Game_InitMap();//加载图片

void Game_Paint(); //贴图

void Game_play(); //操作

int Game_Judgement(); //判断游戏是否结束

 

// 因为要贴图 所以要给出变量

// 可以用图片数组 把图片放在数组里

IMAGE BackImage, WallImage; //背景 墙

IMAGE Box1, Box2; //箱子

IMAGE Tag1, Tag2; //目的地

IMAGE Boom1, Boom2; //箱子推到目的地

IMAGE Per1, Per2; //人

IMAGE END; //奖励

//IMAGE a[5]; //用数组放多张图也是可以的

 

void Game_InitMap()

{

    loadimage(&BackImage, "./res/Background.jpg", 550, 550);//背景

    loadimage(&WallImage, "./res/Wall.jpg", 69, 69);//墙壁

 

    loadimage(&Box2, "./res/Box.jpg", 69, 69);//箱子

 

    loadimage(&Tag2, "./res/Tag.jpg", 69, 69);//目的地

 

    loadimage(&Boom2, "./res/Boom.jpg", 69, 69);//箱子到达目的地

 

    loadimage(&Per2, "./res/Person.jpg", 69, 69);//人物

 

    loadimage(&END, "./res/XiaQi.jpg", 550, 550);//胜利奖品

 

}

 

void Game_InitMap2(int live) //给出关卡数 用来判断是第几关

{

    loadimage(&BackImage,"./res/Background.jpg",550,550); //背景

    loadimage(&WallImage,"./res/Wall.jpg",69,69 );//墙

 

    loadimage(&Box1, "./res/Box1.jpg", 69, 69);//箱子白色

    loadimage(&Box2, "./res/Box.jpg", 69, 69);//箱子

 

    loadimage(&Tag1, "./res/Tag1.jpg", 69, 69);//目的地白色

    loadimage(&Tag2, "./res/Tag.jpg", 69, 69);//目的地

 

    loadimage(&Boom1, "./res/Boom1.jpg", 69, 69);//箱子到达目的地白色

    loadimage(&Boom2, "./res/Boom.jpg", 69, 69);//箱子到达目的地

 

    loadimage(&Per1, "./res/Person1.jpg", 69, 69);//人物白色

    loadimage(&Per2, "./res/Person.jpg", 69, 69);//人物

 

    loadimage(&END, "./res/XiaQi.jpg", 550, 550);//胜利奖品

 

    //在这里添加关卡数

    // 一个文件操作

       

    FILE *fp = fopen("Map.txt", "r");

    if (NULL == fp) //如果打开失败 异常处理

    {

        MessageBox(NULL, "地图加载失败", NULL, NULL);

        exit(0);

        // exit 直接退出

    }

 

    int FileOffset; // 文件的偏移

    FileOffset = 66 * (live - 1);

    // 66 = 64+2--- 8*8+2

    fseek(fp, FileOffset, SEEK_SET);

    // 用来找到文件指针当前的位置

    // 打开的哪一个文件 偏移量 文件开始的位置

 

    int i, j;

    char c;

    //对地图的初始化

    for (i = 0; i < 8; i++)

    {

        for (j = 0; j < 8; j++)

        {

            c = fgetc(fp);

            //getc() 从文件中读出一个字符

            //c = getchar();

            Map[i][j] = c - '0';

            // 因为是字符 所以要-48

        }

    }

 

    fclose(fp); //关闭文件 先写 防止忘记

 

}

// 第一个要改的地方

 

//普通方法贴图

void Game_Paint()

{

    for (int i = 0; i < 8; ++i)

    {

        for (int j = 0; j < 8; ++j)

        {

            switch (Map[j][i])

            {

            case 0: //空地

                break;

            case 1: //墙壁

                putimage(69 * i, 69 * j, &WallImage);

                break;

            case 3://目的地

                putimage(69 * i, 69 * j, &Tag2);

                break;

            case 4://箱子

                putimage(69 * i, 69 * j, &Box2);

                break;

            case 5://人物

                putimage(69 * i, 69 * j, &Per2);

                break;

            case 7://箱子在目的地上

                putimage(69 * i, 69 * j, &Boom2);

                break;

            case 8://人物在目的地上

                putimage(69 * i, 69 * j, &Per2);

                break;

            }

        }

    }

}

 

/*

0 空地

1 墙壁

3 目的地

4 箱子

5 人物

7 箱子在目的地

8 人在目的

*/

 

//透明遮罩法贴图

void Game_Paint2()

{

    for (int i = 0; i < 8; ++i)

    {

        for (int j = 0; j < 8; ++j)

        {

            switch (Map[j][i])

            {

            case 0: //空地

                break;

            case 1: //墙壁

                putimage(69 * i, 69 * j, &WallImage);

                break;

            case 3://目的地

                putimage(69 * i, 69 * j, &Tag1, SRCPAINT); //做或运算

                putimage(69 * i, 69 * j, &Tag2, SRCAND); //做与运算

                break;

            case 4://箱子

                putimage(69 * i, 69 * j, &Box1, SRCPAINT);

                putimage(69 * i, 69 * j, &Box2, SRCAND);

                break;

            case 5://人物

                putimage(69 * i, 69 * j, &Per1, SRCPAINT);

                putimage(69 * i, 69 * j, &Per2, SRCAND);

                break;

            case 7://箱子在目的地上

                putimage(69 * i, 69 * j, &Boom1, SRCPAINT);

                putimage(69 * i, 69 * j, &Boom2, SRCAND);

                break;

            case 8://人物在目的地上

                putimage(69 * i, 69 * j, &Per1, SRCPAINT);

                putimage(69 * i, 69 * j, &Per2, SRCAND);

                break;

            }

        }

    }

}

 

int Game_Judgement()

{

     // 判断时间 判断步数

    //方法1

    // 因为地图是自己给的 目的地的位置是已知的

    //if (map[1][5]== 7 && map[2][4] ==7)

 

    // 方法2

    //循环遍历整张图 判断有没有单独的箱子

    for (int i = 0; i < 8; i++)

    {

        for (int j = 0; j < 8; j++)

        {

            if (Map[i][j] == 4) //判断 有没有落在空地上的箱子

            {

                return 1; //游戏还没有结束

            }

        }

    }

 

    return 0;

}

 

void Game_play()

//第二个要改的地方

{

    char ch; //用来获取键盘输入的信息

    // ASCII码 和 键码 --- 等会讲

    int x, y; //描述当前坐标

    int live = 1; //描述关卡

    Game_InitMap2(live); //贴图

    while (true)

    {

        BeginBatchDraw();

        //如果不用批量绘图 会闪屏

        cleardevice();

        putimage(0, 0, &BackImage);

        //贴背景

        mciSendString("open ./res/bgm.mp3 alias bgm",0,0,0);

        mciSendString("play bgm repeat", 0, 0, 0);

 

        if (!Game_Judgement()) //判断 每一关是否玩完了

        {

            live++; // 进入下一关

            if (4 == live) // 1 +1 +1 +1

            {

                Game_Paint2();// 绘图

                FlushBatchDraw(); //批量绘图 防闪屏

                MessageBox(GetHWnd(), "闯关成功\r\n", "闯关提示", MB_OK);

                // 弹出对话框

                // 一个函数 作用

                //提示语句

                //菜单

                // 按钮 ok 可以写两个 一个ok 一个取消

                putimage(0, 0, &END);// 贴结束图

                FlushBatchDraw();

                Sleep(5000); //续1S 停留一秒

                closegraph(); //关闭窗口

                exit(0); //结束程序

                // sleep 可以试一下自己的电脑 休眠之后能否打开

            }

            Game_InitMap2(live);

        } // 出入平安

        // 遍历地图 找到人在哪儿

 

        //批量绘图要结束

        Game_Paint2();

        EndBatchDraw();

        for (x = 0; x < 8; x++)

        {

            for (y = 0; y < 8; y++)

            {   //如果人在目的地 或者 人在空地

                if (Map[x][y] == 5 || Map[x][y] == 8)

                {

                    break;

                    //goto SummerSeven;

                }

            }

            if (Map[x][y] == 5 || Map[x][y] == 8)

            {

                break;

            }

        }

    //SummerSeven:x = x;

 

        ch = _getch(); //获取键盘消息

        

        // 主键盘上 都有对应的ASCII码值

        // 还有一部分功能键 没有对应的ASCII码值

        // 键码 功能键 用两个值表示

        // 固定值 有序的值

        // 224 72 0 --- F1~F10

        // 用后一个值 确定是什么功能

        // 用前一个值确定 是哪些功能

        

        //人在 Map[x][y]

        switch (ch)

        {

        case 'w': //case 具有穿透性 如果第一个匹配成功之后没有遇到break 那么会继续往下匹配 直到break或者switch结束为止

        case 72://向上

            if (Map[x - 1][y] == 0 || Map[x - 1][y] == 3)

                //表示上一个位置是目的地或者空地

            {

                Map[x][y] -= 5; //原来的地方的人不见了

                // Map[x][y]=0; 因为不能确定当前位置是空地还是目的地

                Map[x - 1][y] += 5; //人上去了

            }

            else if (Map[x - 1][y] == 4 || Map[x - 1][y] == 7)

                //如果上面是一个箱子 或者是一个在目的地的箱子

            {

                if (Map[x - 2][y] == 0 || Map[x - 2][y] == 3)

                    //上面的上面是空地或者目的地

                {

                    Map[x - 2][y] += 4; //箱子推到面的上面

                    Map[x - 1][y] += 1; //人到了上面

                    Map[x][y] -= 5; //人上去了

                }

            }

            break;

        case 75://向左

            if (Map[x][y - 1] == 0 || Map[x][y - 1] == 3)

            {

                Map[x][y] -= 5;

                Map[x][y - 1] += 5;

            }

            else if (Map[x][y - 1] == 4 || Map[x][y - 1] == 7)

            {

                if (Map[x][y - 2] == 0 || Map[x][y - 2] == 3)

                {

                    Map[x][y - 2] += 4;

                    Map[x][y - 1] += 1;

                    Map[x][y] -= 5;

                }

            }

            break;

        case 80: // 往下

            if (Map[x + 1][y] == 0 || Map[x + 1][y] == 3)

            {

                Map[x][y] -= 5;

                Map[x + 1][y] += 5;

            }

            else if (Map[x + 1][y] == 4 || Map[x + 1][y] == 7)

            {

                if (Map[x + 2][y] == 0 || Map[x + 2][y] == 3)

                {

                    Map[x + 2][y] += 4;

                    Map[x + 1][y] += 1;

                    Map[x][y] -= 5;

                }

            }

            break;

        case 77: //往右

            if (Map[x][y + 1] == 0 || Map[x][y + 1] == 3)

            {

                Map[x][y] -= 5;

                Map[x][y + 1] += 5;

            }

            else if (Map[x][y + 1] == 4 || Map[x][y + 1] == 7)

            {

                if (Map[x][y + 2] == 0 || Map[x][y + 2] == 3)

                {

                    Map[x][y + 2] += 4;

                    Map[x][y + 1] += 1;

                    Map[x][y] -= 5;

                }

            }

            break;

        }       

    }

}

 

#include "resource.h"

int main()

{

    initgraph(550,550);

    Game_play();

    return 0;

}

 

/*

 

#include<stdio.h>

#include<conio.h>

#include <stdlib.h>

#include<graphics.h>

#include<mmsystem.h>

#pragma comment(lib,"winmm.lib")

#define SIZE 70

#define M 10

#define N 11

int map[M][N];

//用二维数组画图

// 空地为0 墙为1

//目的地为3 箱子为4 人为5

IMAGE img[11];

void Game_Initmap();

void Game_Printmap();

 

void Game_Initmap(int live)

{

initgraph(SIZE*N, SIZE*M);

mciSendString("open ./res/bgm.mp3 alias music", 0, 0, 0);

loadimage(&img[0], "./res/Background.jpg", SIZE*N, SIZE*M); //背景

loadimage(&img[1], "./res/Wall.jpg", SIZE, SIZE); //墙

loadimage(&img[2], "./res/Tag2.jpg", SIZE, SIZE); //目的地

loadimage(&img[3], "./res/Tag1.jpg", SIZE, SIZE);

loadimage(&img[4], "./res/Box2.jpg", SIZE, SIZE); //箱子

loadimage(&img[5], "./res/Box1.jpg", SIZE, SIZE);

loadimage(&img[6], "./res/Per2.jpg", SIZE, SIZE); //人

loadimage(&img[7], "./res/Per1.jpg", SIZE, SIZE);

loadimage(&img[8], "./res/Boom2.jpg", SIZE, SIZE); //箱子推到目的地

loadimage(&img[9], "./res/Boom1.jpg", SIZE, SIZE);

loadimage(&img[10], "./res/END.jpg", SIZE*N, SIZE*M); //奖励

FILE *fp = fopen("map.txt", "r");

if (NULL == fp)

{

MessageBox(NULL, "亲地图加载失败了", NULL, NULL);

exit(0);

}

int FileOffset;

FileOffset = 112 * (live - 1);//112=10*11+2

fseek(fp, FileOffset, SEEK_SET);

// 用来找到文件指针当前的位置

// 打开的哪一个文件 偏移量 文件开始的位

for (int i = 0; i < M; i++) //对地图的初始化

{

for (int j = 0; j < N; j++)

{

char c = fgetc(fp);

//getc() 从文件中读出一个字符

//c = getchar();

map[i][j] = c - '0';

// 因为是字符 所以要-48

}

}

fclose(fp); //关闭文件 先写 防止忘记

}

int Game_Judgement()

{

for (int i = 0; i < M; i++)

{

for (int j = 0; j < N; j++)

{

if (map[i][j] == 4)

return 1;

}

}

return 0;

}

void Game_Printmap()

{

putimage(0, 0, &img[0]);

for (int i = 0; i < N; i++)

{

for (int j = 0; j < M; j++)

{

switch (map[j][i])

{

default:

break;

case 0://空地

break;

case 1://墙

putimage(i*SIZE, j*SIZE, &img[1]);

break;

case 3://目的地

putimage(i*SIZE, j*SIZE, &img[2], SRCPAINT); //做或运算

putimage(i*SIZE, j*SIZE, &img[3], SRCAND); //做与运算

break;

case 4://箱子

putimage(i*SIZE, j*SIZE, &img[4], SRCPAINT);

putimage(i*SIZE, j*SIZE, &img[5], SRCAND);

break;

case 5://人为5

putimage(i*SIZE, j*SIZE, &img[6], SRCPAINT);

putimage(i*SIZE, j*SIZE, &img[7], SRCAND);

break;

case 7://箱子在目的地上

putimage(i*SIZE, j*SIZE, &img[8], SRCPAINT);

putimage(i*SIZE, j*SIZE, &img[9], SRCAND);

break;

case 8://人物在目的地上

putimage(i*SIZE, j*SIZE, &img[6], SRCPAINT);

putimage(i*SIZE, j*SIZE, &img[7], SRCAND);

break;

}

}

}

mciSendString("play music repeat", 0, 0, 0);

}

 

void Game_PlayGame()

{

int live = 0;

char ch;

int i, j;

while (true)

{

BeginBatchDraw();//开始批量绘图,防闪屏

cleardevice();

if (Game_Judgement())

{

live++;

if (7 == live)

{

Game_Printmap();

FlushBatchDraw(); //批量绘图 防闪屏

MessageBox(GetHWnd(), "闯关成功\r\n", "闯关提示", MB_OK);

putimage(0, 0, &img[10]);

FlushBatchDraw();

Sleep(3000); //续1S 停留一秒

closegraph(); //关闭窗口

exit(0); //结束程序

// sleep 可以试一下自己的电脑 休眠之后能否打开

}

Game_Initmap(live);

}

Game_Printmap();

EndBatchDraw();//批量绘图结束

for (i = 0; i < M; i++)

{

for (j = 0; j < N; j++)

{

if (map[i][j] == 5 || map[i][j] == 8)

break;

}

if (map[i][j] == 5 || map[i][j] == 8)

break;

}

ch = _getch();

switch (ch)

{

default:

break;

case 'W'://上

case 'w':

case 72:

if (map[i - 1][j] == 0 || map[i - 1][j] == 3)//上面为空地或者目的地

{

map[i - 1][j] += 5;

map[i][j] -= 5;

}

else if (map[i - 1][j] == 4 || map[i - 1][j] == 7)

{

if (map[i - 2][j] == 0 || map[i - 2][j] == 3)

{

map[i - 2][j] += 4;

map[i - 1][j] += 1;

map[i][j] -= 5;

}

}

break;

case 'A'://左

case 'a':

case 75:

if (map[i][j - 1] == 0 || map[i][j - 1] == 3)//左面为空地或者目的地

{

map[i][j - 1] += 5;

map[i][j] -= 5;

}

else if (map[i][j - 1] == 4 || map[i][j - 1] == 7)

{

if (map[i][j - 2] == 0 || map[i][j - 2] == 3)

{

map[i][j - 2] += 4;

map[i][j - 1] += 1;

map[i][j] -= 5;

}

}

break;

case 'S'://下

case 's':

case 80:

if (map[i + 1][j] == 0 || map[i + 1][j] == 3)//下面为空地或者目的地

{

map[i + 1][j] += 5;

map[i][j] -= 5;

}

else if (map[i + 1][j] == 4 || map[i + 1][j] == 7)

{

if (map[i + 2][j] == 0 || map[i + 2][j] == 3)

{

map[i + 2][j] += 4;

map[i + 1][j] += 1;

map[i][j] -= 5;

}

}

break;

case 'D'://右

case 'd':

case 77:

if (map[i][j + 1] == 0 || map[i][j + 1] == 3)//右面为空地或者目的地

{

map[i][j + 1] += 5;

map[i][j] -= 5;

}

else if (map[i][j + 1] == 4 || map[i][j + 1] == 7)

{

if (map[i][j + 2] == 0 || map[i][j + 2] == 3)

{

map[i][j + 2] += 4;

map[i][j + 1] += 1;

map[i][j] -= 5;

}

}

break;

}

}

 

}

 

int main()

{

Game_PlayGame();

return 0;

}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淮城一只猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值