matlab五子棋_应用 | 五子棋游戏——没人能在我的程序里打败我
最近看到一個新聞,8月11日第16屆世界五子棋錦標賽的決賽戰場上,兩名中國棋手分別取得了決賽組和女子組的冠軍。
畢竟是兩年一屆的世界最高水平的五子棋比賽,這樣的成績可以說是很優秀了。
看完后,會長也是抖了個機靈,想著把之前用matlab寫過的五子棋游戲程序潤色一把,拿來做了珍貴的一篇推送~
五子棋,是一種邏輯非常簡單的棋盤游戲,入手容易,但想要技法精湛卻非常困難。圖片來自電影《五子棋少女(2018)》片段
本篇應用實例就是一個簡單的雙人對戰五子棋游戲,而且想在編程實現游戲的同時加深大家對Matlab的while、if、for等邏輯分支和判斷語句的掌握。寫在前面
概要地講,這樣一個五子棋程序的難點在于如何獲取用戶鼠標點擊事件的信息,鼠標點擊事件是五子棋游戲以及大多數電腦游戲人機信息交互的橋梁。
我們這里使用ginput函數的改版ginput1函數獲取鼠標點擊的位置信息(ginput()函數能獲取指定點坐標值,大家可以將ginput1改為ginput觀看替換前的效果)。程序邏輯框架圖 及 代碼
1、首先,新建five.m文件,畫出一個棋盤figure('numbertitle','off','name','數學建模公會原創');%棋盤的坐標范圍是橫坐標0-22,縱坐標0-16
axis([0?22?0?16]);
注意,要將橫縱坐標的單位尺度一致化,否則可能會得到一個扁扁的棋盤:axis?equal;
在棋盤上畫上15條交織的直線,形成棋盤輪廓for?i=1:15
????line([1?15],[i?i]);
????line([i?i],[1?15]);
end
下面是在棋盤上方和右端加入游戲狀態:gonggao=text(8,15.5,'正在進行游戲...');
text(1,15.5,'公眾號:數學建模公會');
Player1=text(17,12,'Player1');
Player2=text(17,8,'Player2');
time1=text(17,10,'0');
handles.time1=time1;
time2=text(17,6,'0');
handles.time2=time2;
t1=0;%記錄選手耗時
t2=0;
handles.gonggao=gonggao;
2、記錄棋盤狀態數據,1代表第一人在此處下棋,2代表第二人在此處下棋,0代表沒人在此處下棋;
使用flag用來記錄當前正在下棋的人qipan=zeros(15);
flag=1;
while?1
????time11=clock;?
????[x,y]=ginput1(1);%為了將ginput1將原始的ginput的十字光標改為其他形狀
????xx=round(x);
????yy=round(y);
while?xx>15||xx<1||yy>15||yy<1||qipan(xx,yy)~=0??%在棋盤之外或者已經有棋子的位置都是非法位置!記住,先判斷在棋盤之內,因為判斷是否有棋子需要在棋盤內
????set(handles.gonggao,'string','非法位置');
????pause(1);
????set(handles.gonggao,'string','正在進行游戲...');
????[x,y]=ginput1(1);
????xx=round(x);
????yy=round(y);
end
time22=clock;
dt=(time22(4:6)-time11(4:6))*[3600?60?1]';
if?flag==1
????line(xx,yy,'marker','.','markersize',30,'color','r');
????qipan(xx,yy)=1;
????t1=t1+dt;
????set(handles.time1,'string',num2str(t1));
????flag=2;
else
????line(xx,yy,'marker','.','markersize',30,'color','b');
????qipan(xx,yy)=2;
????t2=t2+dt;
????set(handles.time2,'string',num2str(t2));
????flag=1;
end3、判斷當前走完棋盤的選手有沒有獲勝,依據qipandata中記錄的數據
判斷選手1是否獲勝:?if?flag==2
?????a=0;
?????for?i=1:15
?????????for?j=1:15
?????????????if?(j+4<16)&&(sum([qipan(i,j),qipan(i,j+1),qipan(i,j+2),...
?????????????????????qipan(i,j+3),qipan(i,j+4)]==ones(1,5))==5)
?????????????????a=1;
?????????????????break??????
?????????????end
?????????????if?(i+4<16)&&(j+4<16)&&(sum([qipan(i,j),qipan(i+1,j+1),...
?????????????????????qipan(i+2,j+2),qipan(i+3,j+3),qipan(i+4,j+4)]==ones(1,5))==5)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i+4<16)&&(sum([qipan(i,j),qipan(i+1,j),qipan(i+2,j),...
?????????????????????qipan(i+3,j),qipan(i+4,j)]==ones(1,5))==5)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i+4<16)&&(j-4>0)&&(sum([qipan(i,j),qipan(i+1,j-1),...
?????????????????????qipan(i+2,j-2),qipan(i+3,j-3),qipan(i+4,j-4)]==ones(1,5))==5)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(j-4>0)&&(sum([qipan(i,j),qipan(i,j-1),qipan(i,j-2),...
?????????????????????qipan(i,j-3),qipan(i,j-4)]==ones(1,5))==5)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i-4>0)&&(j-4>0)&&(sum([qipan(i,j),qipan(i-1,j-1),...
?????????????????????qipan(i-2,j-2),qipan(i-3,j-3),qipan(i-4,j-4)]==ones(1,5))==5)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i-4>0)&&(sum([qipan(i,j),qipan(i-1,j),qipan(i-2,j),...
?????????????????????qipan(i-3,j),qipan(i-4,j)]==ones(1,5))==5)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i-4>0)&&(j+4<16)&&(sum([qipan(i,j),qipan(i-1,j+1),...
?????????????????????qipan(i-2,j+2),qipan(i-3,j+3),qipan(i-4,j+4)]==ones(1,5))==5)
?????????????????a=1;
?????????????????break
?????????????end
?????????end
?????????if?a==1
?????????????break
?????????end????????
?????end
??????if?a==1
?????????????set(handles.gonggao,'string','選手1獲勝');
?????????????break?????????????
??????end
?end
判斷選手2是否獲勝:if?flag==1
?????a=0;
?????for?i=1:15
?????????for?j=1:15
?????????????if?(j+4<16)&&(qipan(i,j)+qipan(i,j+1)+qipan(i,j+2)+...
?????????????????????qipan(i,j+3)+qipan(i,j+4)==10)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i+4<16)&&(j+4<16)&&(qipan(i,j)+qipan(i+1,j+1)+...
?????????????????????qipan(i+2,j+2)+qipan(i+3,j+3)+qipan(i+4,j+4)==10)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i+4<16)&&(qipan(i,j)+qipan(i+1,j)+qipan(i+2,j)+...
?????????????????????qipan(i+3,j)+qipan(i+4,j)==10)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i+4<16)&&(j-4>0)&&(qipan(i,j)+qipan(i+1,j-1)+...
?????????????????????qipan(i+2,j-2)+qipan(i+3,j-3)+qipan(i+4,j-4)==10)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(j-4>0)&&(qipan(i,j)+qipan(i,j-1)+qipan(i,j-2)+...
?????????????????????qipan(i,j-3)+qipan(i,j-4)==10)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i-4>0)&&(j-4>0)&&(qipan(i,j)+qipan(i-1,j-1)+...
?????????????????????qipan(i-2,j-2)+qipan(i-3,j-3)+qipan(i-4,j-4)==10)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i-4>0)&&(qipan(i,j)+qipan(i-1,j)+qipan(i-2,j)+...
?????????????????????qipan(i-3,j)+qipan(i-4,j)==10)
?????????????????a=1;
?????????????????break
?????????????end
?????????????if?(i-4>0)&&(j+4<16)&&(qipan(i,j)+qipan(i-1,j+1)+...
?????????????????????qipan(i-2,j+2)+qipan(i-3,j+3)+qipan(i-4,j+4)==10)
?????????????????a=1;
?????????????????break
?????????????end
?????????end
?????????if?a==1
?????????????break
?????????end
????end??
????if?a==1
???????set(handles.gonggao,'string','選手2獲勝');
???????break???
????end
end?
end?%while?1以上就是五子棋游戲的程序設計,最終效果如下:
最終,會在窗口頂部顯示獲勝者信息:
基本本篇或者數學建模相關的其他課題,歡迎大家在公眾號留言討論或者加入數學建模交流qq群(309426503)里與我們切磋交流、經驗分享。(點擊文章結尾“閱讀原文”,輸入提取碼“wrui”獲取源碼文件鏈接)
有獎互動
最激動人心的環節到了...本期有獎互動題目是:
(1)將15子棋盤替換成25子棋盤,并修改相應的棋譜范圍和邏輯規則;
(2)將五子連珠規則改為“水平方向四子連珠,其它方向五子連珠”。
第一個將改好的程序發送到qq群(309426503)中的號友可獲取30元紅包獎勵。此活動截止日期為2019年8月19日晚10點。
馬上九月份即將來臨的——
全國大學生數學建模競賽(國賽)、研究生數學建模競賽(研賽)
不知道大家都報名了沒有,
公會有整理好的建模資料,回復“資料”即可獲取哦
圖片來自電影《五子棋少女(2018)》片段。
撰文:HCLO4
編輯:花毛? ? ?
覺得有用,不妨“在看”。
總結
以上是生活随笔為你收集整理的matlab五子棋_应用 | 五子棋游戏——没人能在我的程序里打败我的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flask同源策略解决办法及flask-
- 下一篇: nlm算法matlab代码_遗传算法GA