这是上一篇文章的后续呀 对于上一篇文章的几个小问题的解决 有的人可能更想用鼠标控制下棋 有点人希望赢的时候连起来的子的位置可以被显示出来
优化一:鼠标下棋 改进的方法非常简单呀 只需要做一个关于’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
其他方向的搜索也和这个类似 这个就不贴出代码啦 大家可以自己写写试试嗯哒 效果: