C语言开发《推箱子游戏》,亲自手把手教会大家
创始人
2024-03-28 11:19:48
0

【C语言经典算法100道实战题】适合具备C语言基础语法的同学学习,提高编写程序的逻辑思维能力和算法设计能力专门精心设计。100个经典的算法供大家练习及配套对应的录播视频。为我们今后学习其它的编程语言和软件开发打下坚实的基础,让你在编码道路上如鱼得水、如虎添翼等,祝同学学习进步、快乐开心的学习编程,感谢大家的全力支持。

各位可爱的同学们好,现在已经为大家准备好超级精典的C语言、C++语言、C语言经典算法100例、数据结构算法(C语言版)、Windows高级编程(上下册)项目实战课程,希望可以帮助大家提高编程实战水平,点击链接就可以学习啦,祝大家学习开心,天天进步、前程似锦!!!
 

【C语言经典算法100道实战题】点击链接即可在线学习:


C语言经典算法100道实战题--C/C++视频教程-后端开发-CSDN程序员研修院

全套精品学习视频和程序源码代码已更新(第001讲--第100讲),学习目录参考如下:

一、经典《推箱子游戏》运行效果

 

二、开发环境安装与图形库配置

我的百度网盘下载地址:
链接:https://pan.baidu.com/s/1iIfIYIl55-sHLh51m0ykXQ 
提取码:ebyh 

 

 备注:【如下这一步主要是看你的电脑安装那个编译器版本的工具就直接点击安装就可以】

 

三、【推箱子游戏源代码】

#include "stdafx.h"

#include
#include
#include
//背景,墙,空地,箱子,人物,目的地,箱子和目的地在一起
IMAGE backImg, wall, blank, box, people, end, dbox;
int nScore;
int g_nBox;
const int rows = 7, cols = 8;
int map[7][8] =
{
    { 1, 1, 1, 1, 1, 1, 1, 1 },
    { 1, 3, 1, 3, 0, 1, 3, 1 },
    { 1, 0, 0, 4, 4, 0, 0, 1 },
    { 1, 4, 0, 5, 0, 0, 0, 1 },
    { 1, 0, 0, 4, 4, 0, 0, 1 },
    { 1, 3, 0, 0, 0, 0, 3, 1 },
    { 1, 1, 1, 1, 1, 1, 1, 1 }
};

//判断目标地点数
int checkEndCount();

//加载资源
void LoadImg()
{
    loadimage(&blank, "blank.jpg", 72, 72);
    loadimage(&wall, "wall.jpg", 72, 72);
    loadimage(&box, "box.jpg", 72, 72);
    loadimage(&end, "end.jpg", 72, 72);
    loadimage(&people, "people.jpg", 72, 72);
    loadimage(&dbox, "dbox.jpg", 72, 72);
}

//初始化游戏界面--------SWITCH处理地图
void InitGame()
{
    nScore = 0;
    g_nBox = checkEndCount();
    //求出转换坐标
    int x, y;
    //根据地图中值----贴图
    for (int i = 0; i <7; i++)
    {
        for (int j = 0; j <8; j++)
        {
            //求出X,Y坐标
            x = j * 72;
            y = i * 72;
            switch (map[i][j])
            {
            case 0://空地
                putimage(x, y, &blank);
                break;
            case 1:
                putimage(x, y, &wall);
                break;
            case 3:
                putimage(x, y, &end);
                break;
            case 4:
                putimage(x, y, &box);
                break;
            case 5:
                putimage(x, y, &people);
                break;
            case 7:
                putimage(x, y, &dbox);
                break;
            case 8:
                putimage(x, y, &people);
                break;
            }

        }

    }

}

//玩游戏-----按键处理-----抽象到具体
//按键处理---当作字符处理-----ASCII码
//上下左右---W S A D
//方向键-----上:72  下:80  左:75  右:77
void PlayGame()
{
    char cuSer;
    int i = 0, j = 0;
    while (1)
    {
        //定位
        for (i = 0; i < 7; i++)
        {
            for (j = 0; j < 8; j++)
            {
                if (map[i][j] == 5 || map[i][j] == 8)
                    break;
            }
            if (map[i][j] == 5 || map[i][j] == 8)
                break;
        }
        InitGame();
        cuSer = _getch();
        switch (cuSer)
        {
            //左边
        case 75:
        case 'a':
        case 'A':
            //判断是否能走   前面空地+目的地 或箱子隔壁是空地或目的地
            //1.人前面是空地或目的地
            if (map[i][j - 1] == 0 || map[i][j - 1] == 3)
            {
                map[i][j] = map[i][j] - 5;
                map[i][j - 1] += 5;
            }
            //2.人的前面是箱子,箱子前面是目的地或空地,箱子和目的地重合
            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;  //5-4  人物(5)来了,箱子(4)走了
                    map[i][j] -= 5;
                    //箱子前面是目的地    分数+1
                    if (map[i][j - 2] == 7)
                    {
                        nScore += 1;
                    }
                }
            }
            break;
            //右边
        case 77:
        case 'd':
        case 'D':
            //判断是否能走   前面空地+目的地 或箱子隔壁是空地或目的地
            //1.人前面是空地或目的地
            if (map[i][j + 1] == 0 || map[i][j + 1] == 3)
            {
                map[i][j] = map[i][j] - 5;
                map[i][j + 1] += 5;
            }
            //2.人的前面是箱子,箱子前面是目的地或空地,箱子和目的地重合
            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;  //5-4  人物(5)来了,箱子(4)走了
                    map[i][j] -= 5;
                    //箱子前面是目的地    分数+1
                    if (map[i][j + 2] == 7)
                    {
                        nScore += 1;
                    }
                }
            }
            break;
            //上边;
        case 72:
        case 'w':
        case 'W':
            //判断是否能走   前面空地+目的地 或箱子隔壁是空地或目的地
            //1.人前面是空地或目的地
            if (map[i - 1][j] == 0 || map[i - 1][j] == 3)
            {
                map[i][j] = map[i][j] - 5;
                map[i - 1][j] += 5;
            }
            //2.人的前面是箱子,箱子前面是目的地或空地,箱子和目的地重合
            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;  //5-4  人物(5)来了,箱子(4)走了
                    map[i][j] -= 5;
                    //箱子前面是目的地    分数+1
                    if (map[i - 2][j] == 7)
                    {
                        nScore += 1;
                    }
                }
            }
            break;
            //下边
        case 80:
        case 's':
        case 'S':
            //判断是否能走   前面空地+目的地 或箱子隔壁是空地或目的地
            //1.人前面是空地或目的地
            if (map[i + 1][j] == 0 || map[i + 1][j] == 3)
            {
                map[i][j] = map[i][j] - 5;
                map[i + 1][j] += 5;
            }
            //2.人的前面是箱子,箱子前面是目的地或空地,箱子和目的地重合
            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;  //5-4  人物(5)来了,箱子(4)走了
                    map[i][j] -= 5;
                    //箱子前面是目的地    分数+1
                    if (map[i + 2][j] == 7)
                    {
                        nScore += 1;
                    }
                }
            }
            break;
        }
        if (nScore >= g_nBox)
        {
            InitGame();
            setbkmode(TRANSPARENT);
            setcolor(BLACK);
            //设置前景色为黑色
            outtextxy(150, 250, "恭喜您,顺利通关,再接再历!");
            break;
        }
    }

}

//判断目标地点数
int checkEndCount()
{
   
    return nBox;
}

int _tmain(int argc, _TCHAR* argv[])
{
    LoadImg();
    initgraph(72 * cols, 72 * rows);
    PlayGame();
    _getch();

    closegraph();

    return 0;
}
 

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...