教你用C/C++写推箱子—简单易学图片版
新增代码地址,因百度云分享易被取消,故通过托管方式分享
地址:代码地址
一、成品展示
(一)实际情况运行截图
二、问题分析
(一)遇到的问题
- 地图如何表示
- 怎么推
- 程序如何架构
- 怎么用图片表示枯燥乏味的控制台应用
(二)解决方案
- 地图如何表示 —— 我们的地图上会遇到什么以及该如何表示
- 墙 0分
- 路 1分
- 箱子 2分
- 路 + 箱子 3分
- 目的地(单独)3分
- 目的地 + 路 4分
- 路 + 箱子 + 目的地 6分
- 工人(单独)4分
- 工人 + 路 5分
- 工人 + 路 + 目的地 8分
看不懂后面的多少分没关系,后面会详细讲解
反映到具体程序中就是这样:
- 怎么推 —— 论值类型的统一
思路:
结合上文中附图地图类型,由于类型可以用值表示,定义全局变量map数组,只是对map数组不同位置的值的加减达到推箱子的目的。
简化方案及带来的优点:
简化方案
结合上图可知,单纯的类型就只有
- 墙
- 路
- 箱子
- 目的地
- 人
我们可以让它们的值从0开始递增,即它们的分量依次为0 1 2 3 4
那么其他情况的就是对应的和。
例如:箱子在路上 的分量是2+1=3带来的好处
好处是巨大的一切都将以数值为准,所有部分独立起来了。
例如:画图函数只需要根据数值画图等
- 程序如何架构 —— 代码该如何写
一切与数值相关,程序只认数值,该咋写咋写:)
(1)文件结构
—— defineSet.h ——相关宏定义与类型定义
| — —defineSet.c ——相关全局变量定义
——func.h ——具体函数声明
|— —func.c ——声明函数具体实现,并定义run()方法
——main.c ——定义main方法,执行run()方法
(2)相关主要变量定义
见图,具体请查看defineSet.h 和 defineSet.c 文件
- 输入ASCII码值
- 相关类型定义(地图类型在上面)
- 全局变量定义
(3)相关主要函数定义
见图,具体请查看 func.h 和 func.c 文件
- 画图函数
- 获取输入函数
- 推函数
- 怎么用图片表示枯燥乏味的控制台应用 —— 只是符号也太无聊了啊
大家可以通过BITBLT函数绘制位图
具体函数:
三、总结与改进
首先祝大家新年快乐!!!
一些具体改进与优化都体现在代码上了,本人只说一点,就是push函数的优化
PUSH函数的优化:
由于推无非就是往上、往下、往左、往右四个推,我们是用一个二维数组表示的,因此往上推就反映在横坐标不变纵坐标的值减一,传给push的值就是: x=0 y=-1 注意:需要检测是否越界,作者代码中好像忘了:) 所以PUSH函数不需要考虑实际位置,因为取得下一个值得方法特别简单, next就等于map[curX+x][curY+y] , 其中 curX和curY 是全局变量,保存工人当前横、纵坐标 ,而 nextNext就是map[curX+2x][curY+2y] 想一想,为什么
然后检测next的type,如果是路或目的地,那就直接走过去。表现在程序中就是当前位置地图type的值减掉工人类型的值,下一个位置加上工人的类型值(注意:需要在map中改)
另外:这个建议独立出来成一个函数,因为每次都得执行这个部分
其他的同理,具体在程序中体现
谢谢大家的观看!!!