matlab 手把手教你制作五子棋小游戏(二)

这是上一篇文章的后续呀
对于上一篇文章的几个小问题的解决
有的人可能更想用鼠标控制下棋
有点人希望赢的时候连起来的子的位置可以被显示出来

优化一:鼠标下棋
改进的方法非常简单呀
只需要做一个关于’WindowButtonDownFcn’ 的调用
只需要加入下面一段代码:

set(gcf,'WindowButtonDownFcn',@getpoint)
    function getpoint(~,~)
        xy=get(gca,'CurrentPoint');
        xp=xy(1,2);yp=xy(1,1);
        pos=[yp,xp];postion=round(pos);
        if strcmp(get(gcf,'SelectionType'),'alt')
            co=0;
            if control==0&&~isempty(black),black(end,:)=[];co=1;end
            if control==1&&~isempty(white),white(end,:)=[];co=1;end
            if co==1,control=mod(control+1,2);end
        else
            if sum(ismember([black(:,1:2);white(:,1:2)],postion(1,1:2),'rows'))==0
                if control==1,black=[black;postion];end
                if control==0,white=[white;postion];end
                control=mod(control+1,2);
            end
        end
        wuziqigame()
    end

只是前面得到下棋坐标,后面的东西和上篇文章一模一样,其中
strcmp(get(gcf,‘SelectionType’),‘alt’)是判断鼠标点击是不是右键
左键下棋,右键悔棋

优化二:链式搜索
首先我们知道
连成的五子中必定包含下的最后一个棋子
举个例子:
在这里插入图片描述
如图所示红叉处是最后下子的地方
标1的地方是第一轮搜到的棋子(因为近)
标2的地方是第二轮。。。。。
标3的。。。。。。。。。。。

例如搜和白色棋子连成一列的的棋子可以这么实现

white=[1 1;1 2;1 3;1 4;5 6;1 5];
%这里白子随便取了几个点。
A=white(end,:);
B=white;
progress=[A;A+ones(length(A),1)*[0 1];A+ones(length(A),1)*[0 -1]];
%取最近的几个点构成集合
progress=unique(progress,'rows');%删除相同的项
while ~isempty(intersect(progress,B,'rows'))
    [a,~,b]=intersect(progress,B,'rows');
    A=[A;a];
    A=unique(A,'rows');
    B(b,:)=[];把相同的部分从B中剔除
    progress=[A;A+ones(length(A),1)*[0 1];A+ones(length(A),1)*[0 -1]];
    progress=unique(progress,'rows');
end
A

搜索结果
A =

1     1
 1     2
 1     3
 1     4
 1     5

其他方向的搜索也和这个类似
这个就不贴出代码啦
大家可以自己写写试试嗯哒
效果:
在这里插入图片描述