C语言开发《推箱子游戏》,亲自手把手教会大家

news2024/11/24 4:26:16

【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 <graphics.h>
#include <conio.h>
#include <stdio.h>
//背景,墙,空地,箱子,人物,目的地,箱子和目的地在一起
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;
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【手把手】教你玩转消息中间件之RabbitMQ

1、微服务下现存的各种问题 服务调用问题 当两个服务调用时&#xff0c;可以通过传统的HTTP方式&#xff0c;让服务A直接去调用服务B的接口&#xff0c;但是这种方式是同步的方式&#xff0c;虽然可以采用SpringBoot提供的Async注解实现异步调用&#xff0c;但是这种方式无法…

gsva gsea ssgsea gaochao 使用GSVA方法计算某基因集在各个样本的表现

傻傻分不清!GSEA & GSVA有啥差别?史上最全教程来了! - 知乎 (zhihu.com) 文章发表于2013年,GSVA: gene set variation analysis for microarray and RNA-Seq data 同样是broad 研究生出品,其在2005年PNAS发表的gsea已经高达1.4万的引用了,不过这个GSVA才不到300。 G…

【边缘检测】基于模糊算法的图像边缘检测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步进步&#xff0c;matlab项目目标合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信息&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算…

实时数仓Flink生产环境部署+提交作业【步骤】

文章目录1、基础环境2、开发环境2.1、pom.xml2.2、log4j.properties2.3、测试用的代码2.3.1、Kafka工具2.3.3、Flink执行环境工具2.3.3、测试Flink读写Kafka2.3.4、测试FlinkSQL读写Kafka2.4、打包后上传到服务器3、生产环境3.1、Flink安装3.2、Flink on YARN下3种模式3.2.1、S…

Linux下POSIX信号量以及基于环形队列的生产消费模型

目录 一、POSIX信号量介绍 1. 信号量原理 2&#xff0c;初始化信号量 3,信号量销毁 4&#xff0c;信号量等待 5,发布信号量 二&#xff0c;基于环形队列的生产消费模型 1.基于单线程 2&#xff0c;测试&#xff1a; 3&#xff0c;基于多线程 4,测试 三&#xff0c;代…

故障转移,服务发现,负载均衡所运用的连接池

没错&#xff0c;说的就是连接池&#xff0c;玩互联网架构&#xff0c;连接池是必须要掌握的。 什么是连接池&#xff1f; 创建与管理连接缓冲池的技术&#xff0c;本质是资源复用&#xff0c;不用频繁创建与销毁连接&#xff0c;能提高性能。 画外音&#xff1a;数据库连接池…

Sentinel-2 L2A数据导入ENVI

Sentinel-2 L2A数据导入ENVI前言0 首先对SNAP进行设置1 用SNAP对Sentinel-2数据重采样2 在ENVI中打开重采样后的Sentinel-2数据3 其实不用重采样也行&#xff0c;ENVI可以直接打开解压后的Ssentinel-2文件&#xff0c;只需要将解压后的MTD_MSIL2A.xml拖进ENVI即可前言 Sentine…

揭秘倚天实例背后的硬核实力

2022云栖大会&#xff0c;阿里巴巴宣布自研CPU倚天710已大规模应用&#xff0c;阿里云未来两年20%的新增算力将使用自研CPU。11月15日&#xff0c;倚天710云实例上线并正式进入大规模应用阶段&#xff0c;现已应用于阿里巴巴集团核心业务&#xff0c;并服务科学研究、智能手机行…

[附源码]JAVA毕业设计天津城建大学校友录管理系统(系统+LW)

[附源码]JAVA毕业设计天津城建大学校友录管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

Nvidia力作:医学图像分割网络

来源&#xff1a;投稿 作者&#xff1a;梦飞翔 编辑&#xff1a;学姐 引自Unetr: Transformers for 3d medical image segmentation 1.序言 本文将以Nvidia团队最近提出的一种新的医学图像分割网络作为切入点&#xff0c;结合所用开源数据集&#xff0c;为各位同学提供一份从…

杨校老师课堂之Spring框架面试题【开发工程师面试前必看】

1.spring 中都用到了哪些设计模式?2.spring 中有哪些核心模块?3.说一下你理解的 IOC 是什么?4.spring 中的 IOC 容器有哪些?有什么区别?5.那 BeanFactory 和 FactoryBean 又有什么区别?6.Repository、Service、Compent、Controller它们有什么区别?7.那么 DI 又是什么?8…

C#学习笔记一 委托、事件

C# 委托、事件 1、Action委托、Func委托 namespace DelegateExample {class Program{static void main(string[] args){Calculator calculatornew Calculator();//Action委托Action Calnew Action(calculator.Report);//直接调用函数Calculator.Report();//通过委托调用函数Ca…

艾美捷RPMI-1640培养基含L-谷氨酰胺的功能和研究

Roswell Park Memorial Institute (RPMI) 1640 培养基起初是为了悬浮培养人白血病单层细胞而开发的。RPMI 1640 培养基被发现适用于多种哺乳动物细胞&#xff0c;包括 HeLa 细胞、Jurkat 细胞、MCF-7 细胞、PC12 细胞、PBMC 细胞、星形胶质细胞和癌细胞。针对广泛的细胞培养应用…

阿里影业的稳健业绩来源:科技+内容塑造韧性,应对市场变化

随着《阿凡达&#xff1a;水之道》&#xff08;简称&#xff1a;《阿凡达2》&#xff09;预售佳绩的显现&#xff0c;电影业的复苏已然箭在弦上。 12月7日&#xff0c;《阿凡达2》正式开启预售&#xff0c;灯塔专业版数据显示&#xff0c;其预售开启4小时后&#xff0c;总票房…

【工作随笔】验证经验、维度

背景&#xff1a;目前负责模块的验证工作基本进展完毕&#xff0c;包括所有功能验证、场景覆盖、用例编写调试和仿真、功能覆盖率收集、sva检测时序等&#xff0c;在当前的进度上和开发、验证同时对我的工作进行了评审。 问题&#xff1a;在评审中间讨论到一个当前tc实现的问题…

五、卷积神经网络CNN7(图像卷积与反卷积)

图像卷积 首先给出一个输入输出结果那他是怎样计算的呢&#xff1f; 卷积的时候需要对卷积核进行 180 的旋转&#xff0c;同时卷积核中心与需计算的图像像素对齐&#xff0c;输出结构为中心对齐像素的一个新的像素值&#xff0c;计算例子如下&#xff1a;这样计算出左上角(即第…

基于Dijkstra和A算法的机器人路径规划附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

JAVA SCRIPT设计模式--行为型--设计模式之Observer观察者模式(19)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

Python图像识别实战(一):实现按比例随机抽取图像移动到另一文件夹

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用&#xff0c;分为分类问题&#xff08;预测值是离散型&#xff09;和回归问题&#xff08;预测值是连续型&#xff09;&#xff08;具体见之前的文章&#xff09;。 从本期开始&#xff0c;我将做一个关于图像识别的…

Nacos集群搭建

1、下载nacos http://t.csdn.cn/ejfu9 2、配置Nacos 进入nacos的conf目录&#xff0c;修改配置文件cluster.conf.example&#xff0c;重命名为cluster.conf&#xff1a; 然后添加内容&#xff1a; 添加的内容是你要启动的多台nacos的IP和端口 127.0.0.1:8845 127.0.0.1:8846…