教你用C/C++写推箱子---简单易懂图片版

教你用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码值
        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中改)
另外:这个建议独立出来成一个函数,因为每次都得执行这个部分


其他的同理,具体在程序中体现

谢谢大家的观看!!!
  • 23
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值