[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
每一次移动用字母记录下来, u d l r 表示 上 下 左 右, 如果推了箱子, 则用大写字母表示 U D L R

建立堆栈(每一次移动都只用一个字符位), 把所有的移动都记录下来, 就可以做任意步 (若堆栈是一个变量, 步数不超出字符容纳上限)  的回退了

关卡数据可以用 Run length encoding 方式来压缩, 从而可以用很节省的方式直接保存在 CMD 文件内部

Run length encoding

http://www.sokobano.de/wiki/index.php?title=Level_format

TOP

回复 5# CrLf

不需要记录箱子位置,

定义坐标系
(x, y) x 正向右, y 正向下

比如 player 在 (x, y) 右移 并推动了箱子, 记录为 R, 移动后, player 的位置到了 (x+1, y), 也必有一个箱子从 (x+1, y) 被推动到了(x+2, y)

要回退这一次移动时, player  位置必在 (x+1, y), 需要把  player 回退到 (x, y),  因为记录是大写字母, 所以知道肯定有箱子被推动过了, 因为是向右推的, 所以那个箱子一定在 (x+2, y), 就把它还原到 (x+1, y) 即可

而如果 记录是 r 时, 小写字母表示没有推动过箱子, 那么只把 player 位置 回退到 (x, y) 即可.
1

评分人数

    • CrLf: 有道理技术 + 1

TOP

本帖最后由 aa77dd@163.com 于 2016-9-5 19:25 编辑

不用字母而用数字 0 1 2 3 表示 上 下 左 右
如果推动了箱子, 就把数值 加上 4, 即, 4 5 6 7

在分析 记录 时, 设 t 为记录值 ,
t & 3 就得到方向,  
t & 2 == 0 是纵向, 否则是横向
t & 1 == 1 是正向(右或者下), 否则是负向(左或者上)
t & 4 == 0 表示没有动箱子, 否则是动了箱子的

换言之, 就是用三个二进制位表示三种信息, 是否有动箱子, 是纵向还是横向, 是正向还是负向
  1. @echo off
  2. <nul set /p "=[]"
  3. echo;
  4. pause
复制代码

TOP

返回列表