3. 你一定发现了你一定发现了“外挂模式外挂模式”,是不是很有趣?逐一自动消除所有块的功能是由,是不是很有趣?逐一自动消除所有块的功能是由 link 目录的目录的 omg.p 实实
现的。现在请你把它也删掉!然后把现的。现在请你把它也删掉!然后把 link\reference 目录下的目录下的 omg.m 复制到复制到 link 目录下。目录下。 omg.m
文件的注释中对输入输出变量做了详细说明,请以这个文件为基础,实现逐一自动消除所有块的功文件的注释中对输入输出变量做了详细说明,请以这个文件为基础,实现逐一自动消除所有块的功
能。(同上题要移走能。(同上题要移走 omg.p 文件。)写完后再次运行文件。)写完后再次运行 linkgame ,检验自动模式是否正确。(在自动,检验自动模式是否正确。(在自动
点击过程中可按点击过程中可按 F12 终止)。终止)。
源代码如下:
function steps = omg(mtx)
% -------------- 输入参数说明 --------------
% 输入参数中,mtx为图像块的矩阵,类似这样的格式:
% [ 1 2 3;
% 0 2 1;
% 3 0 0 ]
% 相同的数字代表相同的图案,0代表此处没有块。
% 可以用[m, n] = size(mtx)获取行数和列数。
% 注意mtx矩阵与游戏区域的图像不是位置对应关系。下标(x1, y1)在连连看界面中
% 代表的是以左下角为原点建立坐标系,x轴方向第x1个,y轴方向第y1个
% --------------- 输出参数说明 --------------- %
% 要求最后得出的操作步骤放在steps数组里,格式如下:
% steps(1)表示步骤数。
% 之后每四个数x1 y1 x2 y2,代表把mtx(x1,y1)与mtx(x2,y2)表示的块相连。
% 示例: steps = [2, 1, 1, 1, 2, 2, 1, 3, 1];
% 表示一共有两步,第一步把mtx(1,1)和mtx(1,2)表示的块相连,
% 第二步把mtx(2,1)和mtx(3,1)表示的块相连。
%% -------------- 请在下面加入你的代码 O(∩_∩)O~ ------------
[m, n] = size(mtx);
steps(1) = 0;
while ~isequal(mtx,zeros(m,n))
for i=1:m*n;
x1=floor((i-1)/n)+1;y1=mod((i-1),n)+1;
number=mtx(x1,y1);
mtx(x1,y1)=0;
[r,c]=find(mtx==number);
mtx(x1,y1)=number;
for j=1:length(r)
x2=r(j);y2=c(j);
if detect(mtx,x1,y1,x2,y2)
mtx(x1,y1)=0;mtx(x2,y2)=0;
steps(1)=steps(1)+1;
steps=[steps,x1,y1,x2,y2];
end
end
end
end
end
我编写的代码逻辑非常简单,就是单纯的遍历矩阵搜索。由于游戏中矩阵的维度不大,数据总量不是很大,所以计算
的时间用的不是很长,基本上可以限制在 1s 之内。这段代码还有很多可以改进的地方,因为如果对于一个数据规模
比较大的连连看游戏,这种方法并不适用,因为计算复杂度较高。如果想要降低计算的复杂度,可以采用 DFS 或者
BFS ,或者可以采用直线扫描的方式,因为游戏规则限制最多拐两个弯,所以扫描的最大深度为 3 ,效率会大大提
高,而且这种扫描方法直接使用了游戏的规则,甚至可以不用 detect 函数就可以实现自动消除。但是由于时间的关