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

其他方向的搜索也和這個類似
這個就不貼出代碼啦
大家可以自己寫寫試試嗯噠
效果:
在這裏插入圖片描述