這是上一篇文章的後續呀
對於上一篇文章的幾個小問題的解決
有的人可能更想用鼠標控制下棋
有點人希望贏的時候連起來的子的位置可以被顯示出來
優化一:鼠標下棋
改進的方法非常簡單呀
只需要做一個關於’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
其他方向的搜索也和這個類似
這個就不貼出代碼啦
大家可以自己寫寫試試嗯噠
效果: