《推箱子》游戏破解方案的MATLAB代码实现
前言
为了搞清楚《逻辑箱子》第一关怎么解,干脆使用m语言编写了一个找到推箱子游戏的解的脚本,解决《逻辑箱子》第一关用时约20秒。主脚本为Sokoban.m,其他为自建函数以及复盘、回溯用的脚本,纯手打原创。代码链接放在正文后面,欢迎大家下载,仅供交流学习使用,转载需注明原作者或经本人同意。
下图为《逻辑箱子》第一关原关卡。
文件介绍与使用说明
(1)主脚本Sokoban.m
下图展示了主脚本Sokoban.m的开头代码。(完整代码请下载文末分享文件)
% Sokoban
clear;clc;
area = [1 1 1 1 1 1 1 1; % 场景区域
1 0 0 0 1 1 1 1;
1 0 0 0 0 1 1 1;
1 1 0 0 0 0 0 1;
1 1 0 0 0 0 0 1;
1 1 0 0 0 1 1 1;
1 1 0 0 0 1 1 1;
1 1 1 1 1 1 1 1];
xtarget = [4 4 4 4 4]; % 目标点
ytarget = [3 4 5 6 7];
xbox = [4 4 4 3 5]; % 箱子位置
ybox = [3 4 5 6 6];
pboy = [6 4]; % pboy表示人所在位置
steplimit = 50; % 步数限制(必须估计总共需要走的步数,确保该变量大于总步数,在确保大于总步数的前提下越小解得越快)
有几点需要注意:
① 坐标起始点为area矩阵的左上角,也即第1行第1列[1 1];
② 横坐标代表第几列,纵坐标代表第几行;
③ 步数限制变量steplimit很重要,在确保大于总步数(只能估计)的情况下,设置得越小,解得越快。
除了上述变量,另外说明几个特殊变量:
① can_boy: 代表人在场景中能到达的位置;
② area_forboy: 代表墙壁和箱子的位置;
③ can_step: 每一行记录了每一步能走的箱子方向(特别的是能走的使用0表示)每一行从左往右分别表示第一个箱子能不能往上(第1列)、下(第2列)、左(第3列)、右(第4列);第二个箱子能不能往上(第5列)、……;
④ movestep: 每一行的两个数记录了每一步走的箱子编号与方向(1、2、3、4分别代表上、下、左、右);
⑤ scene: 每个元素记录了某一步后的场景,实际上为