




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、五子棋五子棋是一種很受人們喜愛的游戲,它的規(guī)則簡(jiǎn)單,但玩法變化多端,富有. 趣味性 , 適合人們消遣。這里我們就來(lái)設(shè)讓一個(gè)五子棋游戲。(-)(-) 人對(duì)人游戲文件迎亙看幫助?o黒棋下| 瞬 t1.1. 游戲?qū)崿F(xiàn)人對(duì)人游戲,其實(shí)只是對(duì)游戲規(guī)則的實(shí)現(xiàn),我們只是利用五子棋游戲的規(guī)則來(lái)編程, 至于真正的游戲?qū)崿F(xiàn)一一計(jì)算機(jī)的“智能”算法,我們將在后面講述。五子棋的規(guī)則很簡(jiǎn)單:b判斷是否能放下棋子( 是否已經(jīng)有了棋子 ) :2,判斷是哪種顏色下棋; 3,判斷是否已經(jīng)結(jié)朿(是誰(shuí)贏?)。這些規(guī)則,我們將用相應(yīng)的函數(shù)來(lái)實(shí)現(xiàn)。英它,我們還將介紹其它一些功能的實(shí)現(xiàn)。如鼠標(biāo)的更換,工具欄和狀態(tài)欄的編輯,類與類之間的相
2、互調(diào)用。新建工程3_1,選擇單文檔,在step 4 of 6中先中windows sockets復(fù)選框如卜圖: 圖3-1-1 2. 2. 資源編輯由于我們這個(gè)程序出現(xiàn)的關(guān)于資源編輯的內(nèi)容太多,我們具體介紹如下: 見下圖3-1-2,我們需要添加的有:電碗- mji lunmiobeno =4 三 臼 3resources * 03 _j accelerator _j bitmap 錮 idb_black 毎 i idb_white 白日 cursor b idc_cursor1 b idc_cursor2 3 dialog 3 iddab outbox - n icon idlblack _ i
3、dlwhite idr_mainframe idr_my31type iri menu 自 idrmainframe b string table ? string table (-1 toolbar |idr_mainframe| e) version e vs version inf( 圖3-1-2 黑白位圖bitmap以表示棋盤上而的棋子: idb. black idb_white 黑白鼠cursor以替換當(dāng)前鼠標(biāo):idc. cursor1 黑棋子idc.cursor2 白棋子說(shuō)明:由于下棋時(shí)我們必須把鼠標(biāo)熱點(diǎn)設(shè)置在中間,點(diǎn)擊下圖(圖3-1-3 )最右邊按扭 , 然后把鼠標(biāo)移動(dòng)到圖像中你
4、想設(shè)置為熱點(diǎn)的地方,按下鼠標(biāo)左鍵。圖3?2 圖3亠3 圖3-1-3 黑白圖標(biāo)icon以顯示在狀態(tài)欄供以提示: idi_black idi.white 說(shuō)明:由于我們的圖標(biāo)支持256色,按下下圖(圖3-1-4 )最右邊按扭,選擇device 里而顯示的選項(xiàng)。device:132x32, 256 colors 菜單以供操作開始:id_start 保存:id_save 打開:id.open 工具欄:如上圖所示。說(shuō)明:工具欄一般都是根據(jù)菜單選項(xiàng)而產(chǎn)生的,它的id 一般都能從菜單的id中找到。device: (monochrome (32x32刁 創(chuàng)hot spot: 1 5,15 知圖3-1-4 3.
5、 3. 變量函數(shù)首先,為了實(shí)現(xiàn)狀態(tài)欄的應(yīng)用,我們必須更改它的變量:在mainfrm. h 文件里而,把cstatusbar m_wndstatusbar 為public 接著是在3_lview. h文件里面添加變量函數(shù):兩個(gè)鼠標(biāo)hcursor hcursorwhite; hcursor hcursorblack; / 棋盤數(shù)組int wzq1919; / colorwhite true時(shí)白棋否則黑棋下bool colorwhite; / 棋子位圖cbitmap m_bmblack; cbitmap m_bmwhite; 保存文件void save(); / 檢查是否結(jié)束void over(cp
6、oint point); 鼠標(biāo)操作afx_msg void onlbuttonup(uint nflags, cpoint point); / 竄標(biāo)圖形更換afx_msg bool onsetcursor(cwnd* pwnd, uint nhittest, uint message); 塞單的開始afx_msg void onstart 0; / 乗單的保存afx_msg void onsave0; 素單的打開afx_msg void onopen0; 4.4.具體實(shí)現(xiàn)棋盤大小設(shè)置:由于我們的游戲的棋盤大小是一泄的,不能改變大小的,是應(yīng)該符合要求的。在如下函數(shù)添加設(shè)置窗口大小的語(yǔ)句: boo
7、l cmainframe:precreatewindow(createstruct& cs) if( icframewnd:precreatewindow(cs) return false; / todo: modify the window class or styles here by modifying / the createstruct cs cs. dwexstyle=cs. dwexstyle ws.ex.topmost; / cs. style二ws_sysmenu ws_overlapped ws.minimizebox;/; / 設(shè)宜窗口夭?。?00*340 cs.
8、cx=450; cs.cy=500; return true; 初始化變量:在構(gòu)造函數(shù)里添加初始代碼:cmy3_lview: :cmy3_lview() / todo: add construction code here /load鼠標(biāo)圖像和棋子位圖hcur s orb1ac k=afxge tapp 0-loadcursor(idc_cursor1); hcursorwhite=afxgetapp0-loadcursor(idc_cursor2); m_bmwhite? loadbitmap (idbhite); m_bmblack? loadbitmap(idb_black); 淸理棋盤
9、/ 數(shù)組值為0表示沒有棋子for(int i=0;i19;i+) for(int j=0;jfi11rect(myrec11, &mvbrushl); / 畫棋盤框線cpen mypen; cpen*myoldpen; mypen. createpen (ps_solid, 1, rgb (0, 0, 0); myo1dpen=pdc-s electobject(&mypen); for(int i=0;imoveto(40, 40+i*20); pdc-lineto(400, 40+i*20); pdc-moveto(40+i*20, 40); pdc-lineto(40+i
10、*20, 400); 重畫時(shí)顯示存在的棋子cdc de; if(de. createcompatibledc(pdc)二二false) afxmessagebox(/zcan,t create dc); for (int n=0;n19;n+) for (int m=0;mbitblt(n*20+32, m*20+32, 160, 160, &dc, 0, 0, srccopy); else if(wzqnm=-l) 顯示黑棋de. selectobject(m_bmblack); pdc-bitblt(n*20+32, m*20+32, 160, 160, &dc, 0, 0
11、, srccopy); 設(shè)置鼠標(biāo):棋盤畫好了,接下來(lái)就是下棋了。但鼠標(biāo)并沒有像我們上而說(shuō)的那樣變成白棋,加函數(shù)如下:bool cmy3_lview:onsetcursor(cwnd* pwnd, uint nhittest, uint message) / todo : add your message handler code here and/or call default if(nhittest=htclient) 白棋下,顯示白棋鼠標(biāo)if(colorwhite) / 調(diào)用主框架里而的狀態(tài)欄cma i nframe*pfrm=(cmainframe*)afxgetapp0-m_pmain
12、wnd; cstatusbar *pstatus=&pf:nn-in_wndst3tusb8i7;if(pstatus) pstatus-getstatusbarctrl0 ? seticon(0, afxgetapp 0-loadicon(idiwhite);pstatus-setpanetext (0, 白棋卜 ) ; setcursor(hcursorwhite); / 顯示黑棋鼠標(biāo)else setcursor(hcursorblack); cma i nframe*pfrm=(cmainframe*)afxgetapp0-m_pmainwnd; cstatusbar*pstat
13、us=&pfrm-m_wndstatusbar; if(pstatus) 顯示圖像pstatus-getstatusbarctrl0. seticon(0, afxgetapp 0-loadicon(idi_black); 顯示文字pstatus-setpanetext (0,黑棋卜 ) ; return 1; return cview:onsetcursor(pwnd, nhittest, message); 現(xiàn)在運(yùn)行程序, 怎樣,鼠標(biāo)變成白棋了, 而且下而的狀態(tài)欄也能夠顯示鼠標(biāo)狀態(tài)了,真是一舉兩得。可是,又該怎樣把棋子放在棋盤上呢?下棋操作:這就涉及到onlbuttondown(l
14、 ;int nflags, cpoint point)和onlbuttonup(uint nflags, cpoint point)兩個(gè)函數(shù)了要用哪一個(gè)或用兩個(gè)?用down函數(shù)時(shí)是在鼠標(biāo)按下時(shí)放下棋子,可是,要是我們按下后意識(shí)到按錯(cuò)了怎么辦:那就改用up函數(shù),表示當(dāng)鼠標(biāo)鍵松開時(shí)放下棋子。0k! 添加函數(shù)如下:void cmy3_lview:onlbuttonup(uint nflags, cpoint point) / todo: add your message handler code here and/or call default cdc *pdc=getdc(); cdc de; i
15、f(de. createcompatibledc(pdc)二二false) afxmessageboxccan t create dc); / 是否在棋盤內(nèi)if(point. x30&point? x30&point.ybitblt(px*20+32, py*2o+32, 160, 160, &dc, 0, 0, srccopy); / 表示存在白棋wzqpxpy=l; / 檢査是否結(jié)束over (point); 換黑棋下colorwhite=false; else if(wzqlpxepy=o) de.selectobject(m_bmblack); pdc-bitb
16、lt(px*20+32, py*20+32, 160, 160, &dc, 0, 0, srccopy); wzqtpxpy=-l;over (point); colorwhite=true; cview:onlbuttonup(nflags, point); 由上而可以看出,當(dāng)鼠標(biāo)鍵松開時(shí)判斷,如果那個(gè)位置沒有棋子,則放下,并把棋盤數(shù)組賦相應(yīng)的值:1或-1。是否結(jié)束:接著是用一個(gè)over ()函數(shù)判斷是否結(jié)束,是則結(jié)朿并重新開始:否則,接著把鼠標(biāo)變成對(duì)方棋子,表示對(duì)方下棋。那over ()函數(shù)又是怎樣的呢?此函數(shù)是利用剛下棋的位置為中心,檢査它各個(gè)方向上的連續(xù)五個(gè)棋子是否同色, 是則
17、結(jié)束并重新開始。然而,我們又是怎樣判斷一個(gè)方向上的五個(gè)棋子的同色的?這就涉及地為什么我要把五子棋數(shù)組賦值為1和-1的問(wèn)題。因?yàn)檫@樣有一個(gè)好處:利用連續(xù)五個(gè)棋子的值相加. 如果它們的值的絕對(duì)值等于5,則說(shuō)明是同色。當(dāng)然,這只是這樣賦值的一點(diǎn)作用,真正的作用將在后而介紹。添加如下:void cmy3_lview:over(cpoint point) / 獲取鼠標(biāo)指向數(shù)組位宜,即中心位置int (point, x-30)/20; int y=(point. y-30)/20; / 計(jì)算開始判斷的坐標(biāo)xx, yy int xx,yy; if(x4) xx=0; else xx=x-4; if(y4)
18、yy=0; else yy=y-4 ;int i, j, a; / 橫向判斷for(i=xx;i15;i+) a=0; for(j=i;ji+5;j+) a=a+wzqjy; / 五個(gè)都是白棋辻(a=5) afxmessagebox ( 白棋勝! ) ; /重新開始o(jì)nstart 0; return; / 五個(gè)都是黑棋辻(a=-5) afxmessagebox(/z黑棋勝!) ; onstart 0; return; / 豎向判斷for(i=yy;i15;i+) a=0; for(j=i;ji+5;j+) a=a+wzqxj; if (a=5) afxmessagebox( 白棋勝!) ; o
19、nstart 0; return; 辻(a=-5) afxmessagebox (/z黑棋勝!) ; onstart 0; return; / 向右下角/ 判斷起點(diǎn)位置if (xy) if(xx=o) yy二y-x; else if(yy=o) xx=x-y; 參數(shù)over=l時(shí)退岀循環(huán)int over=0; do a=0; for(i=0;i5;i+) if(xx+i)19 (yy+i)(18-x) if(x13) yy=y-(18-x); xx=18; else yy二y-4 ;xx=x+4; else if (y5) xx二x+y; yy=o; else yy二y-4 ;xx=x+4;
20、over=0; do a=0; for(i=0;i=0 (yy+i)19) a=a+wzqxx-iyy+i; if (a=5) afxmessagebox c白棋勝! ) ;onstart 0; return; if(a=-5) afxmessagebox (/z黑棋勝! ) ;onstart 0; return; / 到了邊界else over=l; xx-=1;yy+二1; while(over=0); 現(xiàn)在,我們的人對(duì)人游戲就完成了。下而介紹附加內(nèi)容。5. 5. 附加內(nèi)容理論上,這個(gè)游戲并無(wú)須保存,因?yàn)樗_實(shí)太小了。事實(shí)上,這個(gè)游戲有保存的功能,由于我們學(xué)習(xí)的需要。這個(gè)游戲的保存,與其說(shuō)
21、是學(xué)習(xí)文件的保存,不如說(shuō)是我們學(xué)習(xí)字符串的操作。另外,這個(gè)附加的內(nèi)容并不是為了當(dāng)前的學(xué)習(xí)而添加的,而是為了后面的學(xué)習(xí)和應(yīng)用而鋪墊的。保存文件:保存文件函數(shù)是一個(gè)菜單選項(xiàng)。它的作用就是保存當(dāng)前游戲的狀態(tài)。首先,我們應(yīng)該為我們自己的文件立義一個(gè)后綴需:?wzq:接著是打開保存文件的公共對(duì)話框,如果確泄,則表示保存,那么就先獲取文件名,然后按照一左的順序保存各個(gè)點(diǎn)的數(shù)組的值,最后保存當(dāng)前是哪種顏色下棋。void cmy3_lview:0nsave() / todo: add your command handler code here 設(shè)宜保存的文件,后綴名wzq cfiledialog dig (
22、false, null, ofn_hidereadonly ofn_overwriteprohpt, (*. wzq) *. wzq all files|*. *|p, this); 如果公共類對(duì)話框?yàn)榇_泄if (dig. domodal()=idok) / 獲取文件名dig ? getfilenameo ; / 否則,退出else return; 字符串變量cstring str; int i, j; cstdiofile file; / 如果有問(wèn)題,退出if(file? open(dig ? getfilenameo, cfile::modecreate cfile:modewrite c
23、file :typetext)=o) ” ” afxmessagebox(z?save error!/z); return; 循環(huán)把棋盤數(shù)組的值寫進(jìn)文件for(i=0;i19;i+) for(j=0;j19;j+) if(wzqij=-l) file. writestringc-ln); if (wzqi j=0) file. writestring c0n); if (wzqi j=l) file. writestringcln3; / 保存當(dāng)前下棋顏色if(colorwhite=true) file. writestringcln); else file. writestringc0n3;
24、 關(guān)閉文件file? close0; 讀取文件:讀文件就是把我們以前保存的文件打開,讀取當(dāng)前打開文件的內(nèi)容,并給數(shù)組賦值使和文件內(nèi)容相同,然后可以繼續(xù)進(jìn)行游戲。與保存文件相反void cmy3_lview:0n0pen() / todo: add your command handler code here cfiledialog dig 仃rue, ? zq, null, ofn_hidereadonly ofn.overoiteprompt,氣*. wzq) *? wzq all files|*. *| this); if (dig. domodal()=idok) dig ? getfi
25、lename 0; else return; cstring str; int i, j,m; cstdiofile f訂e; if (file? open(dlg ? getfilename 0, cfile::moderead) =0) 笏”afxme s sagebox (save error !/z); return; carchive ar (&file, carchive::load); for(i=0;i19;i+) for(j=0;j 0 :由于岀現(xiàn)1和0的機(jī)會(huì)太少(除了開始的時(shí)候),我們不必多加考慮。但是,因?yàn)閯偛艑?duì)方下棋的對(duì)方必立有一上的危險(xiǎn),我們只需要在剛剛下棋的
26、附近找一個(gè)空位宜下棋就可以了。說(shuō)明:1、 上而之所以把空位置這個(gè)詞語(yǔ)放在前而,因?yàn)槲覀冏⒅氐氖峭ㄟ^(guò)檢査,岀一個(gè)可以下棋的空位宜,然后下棋。八2、為方便菽明,我們?cè)谡f(shuō)明用了絕對(duì)值。而事實(shí)上正負(fù)還是有區(qū)別的。正表示白棋占多數(shù) . 負(fù)表示黑棋占多數(shù)。而由于我們的這個(gè)算法是針對(duì)于計(jì)算機(jī)的,而我們又讓計(jì)算機(jī)為黑棋,所以我們的后而的算法還是有一定區(qū)別的。我們必須把它們分開. 而且這樣規(guī)立:絕對(duì)值大表示危險(xiǎn)性大(這是很容易理解的);而當(dāng)出現(xiàn)絕對(duì)值相同的正負(fù)兩個(gè)值時(shí),我們必須這樣做,在值為負(fù)(表示黑棋一方)的那個(gè)位置下棋,以保證黑棋一方的優(yōu)先性。下而,就讓我們?cè)谠鯓訉?duì)程序的擴(kuò)展方法的介紹過(guò)程中實(shí)現(xiàn)人對(duì)機(jī)游戲。
27、先把3_1的文件夾復(fù)制一個(gè),改為3_2。以后就用它來(lái)擴(kuò)展。從上而圖中,我們可以看到,工具欄變了。因此我們也可以想到菜單也應(yīng)該變了。它們的修改如下 : 修改菜單 : 開始:d_start 人對(duì)人游袤:id_player 人對(duì)機(jī)游戲:id_cpmputer 修改工具欄 在view類中添加變量函數(shù)如下:2、2、資源編輯刪除菜單項(xiàng)添加菜單項(xiàng)刪除原來(lái)的按扭對(duì)應(yīng)id:添加兩個(gè)新按扭對(duì)應(yīng)id:id.start id player id cpmputer 3、 3、變量和函數(shù)/ 保存vscomputer時(shí)白棋位置cpoint vspoint; 是人與人游戲?是人與機(jī)游戲? int vscomputer; /
28、在得到最大值和方向上尋找落棋點(diǎn)(具體見后而介紹)其中i、j表示搜索起點(diǎn),n表示方向void searchcandownl(int void searchcandown2(int void searchcandown3(int void searchcandown4(int 計(jì)算最大值及方向cpoint maxnum(int a, int 最好落棋點(diǎn)void bestputdown(int i,int j); 計(jì)算機(jī)下棋void computerdowno ; / 在位置point放卜?棋子void putdown(cpoint point); 人對(duì)人菜單afx_msg void onplaye
29、r(); 斤對(duì)機(jī)菜單afx_msg void oncpmputero ; 4、4、具體實(shí)現(xiàn)下而. 我們朝著程序擴(kuò)充的思路,來(lái)實(shí)現(xiàn)我們的游戲。菜單函數(shù):添加了菜單項(xiàng), 我世必須添加一個(gè)vscomputer,賦值為1,并約左 : /vscomputer: 2表示人對(duì)人,1表示人對(duì)機(jī)void cmy3_lview ::onplayer0 / todo: add your command handler code here vscomputer=2; onstart 0; void cmy3_lview ::oncpmputer0 / todo: add your command handler co
30、de here vscomputer=l; onstart 0; 英中,我們只是添加一個(gè)變量,而仍然利用原來(lái)的開始函數(shù)。雖然我們的菜單項(xiàng)已經(jīng)刪除了,但它的函數(shù)還在,我們應(yīng)該加以利用。i, int j, int n); i, int j, int n); i, int j, int n); i, int j, int n); b, int c, int d); cpoint bpointcan4, / 這個(gè)位宜空,它旁邊有四個(gè)黑棋wpointcand, bpointcan3, wpointcan3, bpointcan2, wpointcan2, bpointcanl; / 這個(gè)位宜空, / 這
31、個(gè)位宜空, / 這個(gè)位置空, / 這個(gè)位宜空, / 這個(gè)位置空 , 它旁邊有四個(gè)白棋它的旁邊有三個(gè)黑棋它的旁邊有三個(gè)白棋它的旁邊有兩個(gè)黑棋它的旁邊有兩個(gè)白棋/ 不是以上情況,這個(gè)位置空人變成計(jì)算機(jī):下面,我們就必須把游戲雙方中的一方改為計(jì)算機(jī)。我們把黑棋改為計(jì)算機(jī),因?yàn)橐话闱闆r計(jì)算機(jī)比人強(qiáng),應(yīng)讓人先下。當(dāng)然,要是人贏了,就必須讓計(jì)算機(jī)先下了,在將在以后的算法中體現(xiàn)。由于卜棋只是在onlbuttonup (uint nflags, cpoint point)函數(shù)中,我們把它改為如下:void cmy3_lview ::onlbuttonup(uint nflags, cpoint point)
32、/ todo: add your message handler code here and/or call default cdc *pdc二getdco; cdc de; if (de. createcompatib 1 edc (pdc) =false) afxmessagebox(z?can,t create dc); / 顯示棋子/人對(duì)機(jī)if (vscomputer=l) if (point.x30&point? x30&point. ybitblt(px*20+32, py*20+32, 160, 160, &dc, 0, 0, srccopy); wzqp
33、xpy=l; over (point); colorwhite二false; / 保存白棋位置vspoint=point; / 計(jì)算機(jī)下棋computerdown 0; / 人對(duì)人if (vscomputer=2) if (point. x30&point ?x30&point. ybitblt(px*20+32, py*20+32, 160, 160, &dc, 0, 0, srccopy); wzqpxlpyl=l;over (point); colorwhite=false; else if(wzqpxpy=0) dc? selectobject(m_bmblac
34、k); pdc-bitblt(px*20+32, py*20+32, 160, 160, &dc, 0, 0, srccopy); wzqpxpy=-l; over (point); colorwhite=true; cview::onlbuttonup(nflags, point); 由上面可知,我們對(duì)人對(duì)機(jī)游戲的方法是采用:人下完了之后,檢査是否勝利,是則結(jié)束游戲,重新開始,并改為黑棋( 即計(jì)算機(jī) ) 先下:如果人沒有勝利,也改為計(jì)算機(jī)下。而對(duì)于計(jì)算機(jī)怎么下棋,我們只是用了一個(gè)函數(shù)computerdom0表示。但是現(xiàn)在我們并不能運(yùn)行程序,因?yàn)橛幸粋€(gè)沒有圧義的函數(shù),怎么辦呢?程序擴(kuò)展
35、思想:添加一個(gè)空函數(shù)! 仔細(xì)看程序的話,你還會(huì)發(fā)現(xiàn)一個(gè)變量cpoint vspoint,這是后來(lái)添加的它的用處是保存剛才白棋下的位置,有利于黑棋下棋時(shí)的定位。接著. 我們的主要問(wèn)題就是實(shí)現(xiàn)computerdom()函數(shù),讓計(jì)算機(jī)能夠自動(dòng)下棋!計(jì)算機(jī)下棋 : 訃算機(jī)是怎樣下棋?這就是怎位的問(wèn)題了。即搜索棋盤,找出一個(gè)最佳點(diǎn),放下黑棋。我們實(shí)現(xiàn)的方法是:全盤搜索,并把搜索到的位置,保存在變捲。由于有多種情況,我們左義變量如下:cpoint bpointcan4/ 這個(gè)位置空,它旁邊有四個(gè)黑棋wpointcan4, bpointcan3, wpointcan3, bpointcan2, wpoint
36、can2, bpointcanl; / 這個(gè)位置空,它旁邊有四個(gè)白棋/ 這個(gè)位置空,它的旁邊有三個(gè)黑棋 /這個(gè)位置空,它的旁邊有三個(gè)白棋 / 這個(gè)位置空,它的旁邊有兩個(gè)黑棋/ 這個(gè)位置空,它的旁邊有兩個(gè)白棋不是以上情況,這個(gè)位置空并在搜索之前都賦值為(-1, -1),然后,進(jìn)行搜索,并把相應(yīng)的值保存在相應(yīng)變量里而,而如果前而已經(jīng)對(duì)變量賦值,我們依然賦值,用新值代替舊值。注意:我們只保存最后一個(gè)值 . 這樣的一 個(gè) 好 處 是 , 避 免 了 每 次 都 從 左 上 角 開 始 , 并 且 它 的 隨 機(jī) 性 比 隨 機(jī) 函 數(shù) 還 隨機(jī) 。全盤搜索完之后,由于上而的變量中至少有一個(gè)已經(jīng)被賦值,
37、即不是(-1, -1),我們 可以采用多數(shù)優(yōu)先的方法,讓已經(jīng)有多個(gè)同色棋子的位置先下棋。英原理是. 如果已經(jīng)有四個(gè)黑棋,計(jì)算機(jī)再下一個(gè)黑棋就贏了:否則,如果人已經(jīng)有四個(gè)白棋,那么訃算機(jī)就必須放下一個(gè)黑棋,阻止白棋下一步贏:如果已經(jīng)有三個(gè)黑棋,再下一個(gè)黑棋,變成四個(gè);否則,如果已經(jīng)有三個(gè)白棋,下一個(gè)黑棋,破壞它:兩個(gè)棋子的同理:否則,在剛才白棋下的地方, 順便找一個(gè)位置,i棋。computerdown 0函數(shù)如下:輪到計(jì)算機(jī)下棋void cmy3_lview ::computerdown0 / 把各種情形賦值為如下bpointcan4=(-1, -1); wpointcan4=(t, -1);
38、bpointcan3= (-1, t); wpointcan3二(t, -1); bpointcan2=(-1, -1); wpointcan2=(t, -1); bpointcanl=(-l, t); / 搜索最好的落棋點(diǎn)for(int i=0;i19;i+) for(int j=0;j a=0; if(i15) for(k=0;k5;k+) a=a+wzqi+kj; num0=abs(a); / num 1 t a=0; if(j15) for(k=0;k5;k+) a=a+wzqij+k; numl=abs(a); / num2 v a=0; if(i15&j15) for(k=
39、0;k4)&(j15) for(k=0;k=b) point ? x=0; point ? y=a; else point ? x=l; point ? y二b; if (cpoint? y) point ? x=2; point ? y二c; if(dpoint? y) point ? x=3; point ? y二d; return point;searchcandownl(int i, int j, int n); searchcandown2(int i, int j, int n); searchcandown3(int i, int j, int n); searchcan
40、dou (int i, int j, int n); t maxnum(int a, int b, int c, int d); 而另外的四個(gè)函數(shù),有其相似性,分別介紹如下:void searchcandown4 (int i, int j, int n)函數(shù):如果最大值是四,它必然有一個(gè)空位置:我們可以這樣計(jì)算,如果第一個(gè)是空,那我們把它賦值給相應(yīng)變量:否則. 先找那個(gè)空位宜,然后判斷第一個(gè)棋子的顏色,并賦相應(yīng)的值。由于相似,下而代碼只解釋第一個(gè)方向/ 有四個(gè)同色棋void cmy3_lview:searchcandown4(int i, int j, int n) int k; / num
41、0 ”一”if(n=0) for (k=0;k5;k+) / 如果第一個(gè)是空if (wzqi j=0) / 如果下面有白棋if (wzqi+l j=l) / 下而位置可以下棋,已經(jīng)有四個(gè)白棋wpointcan4 ? x=i; wpointcan4 ? y二j; break; else / 下面位置可以下棋,已經(jīng)有四個(gè)黑棋bpointcan4 ? x二i; bpointcan4 ? y二j; break; / 如果找到下棋位置,一左能找到!else if(wzqi+kj=0) / 如果第一個(gè)是白棋if (wzqj j=l) wpointcan4 ? x二i+k; wpointcan4 ? y二j
42、; break; / 否則第一個(gè)是黑棋e(cuò)lse bpointcan4. x二i+k; bpointcan*!? y二j; break;/ num1 if(n=l) for(k=0;k5;k+) if (wzqtilj=0) if(wzqij+l=l) wpointcan4 ? x二i; upointcan4. y=j; break; else bpointcan4 ? x=i; bpointcan4? y二j; break; else if(wzqilj+k=o) if (wzqij=l) wpointcan4 ? x=i; wpointcan4? y二j+k; break; else bpo
43、intcan4 ? x二i; bpointcan4? y=j+k; break; / num2 if(n=2) for (k=0;k5;k+) if(wzqtij=0) if(wzqi+lj+l=l) wpointcan4 ? x=i; wpointcan4? y=j; break; else bpointcan4. x二i;bpointcan4. y=j; break; else if (wzqi+kj+k=o) if (wzqij=l) upointcan4. x=i+k; wpointcan4? y=j+k; break; else bpointcan4 ? x=i+k; bpointc
44、an4? y二j+k; break; / num3 辻(n=3) for (k=0;k5;k+) if (wzqtilj=0) if(wzqi-lj+l=l) wpointcan4 ? x=i; upointcan4. y=j; break; else bpointcan4 ? x=i; bpointcan4? y二j; break; else if (wzqi-kj+k=o) if (wzqij=l) wpointcan4 ? x=i-k; wpointcan4? y二j+k; break; else bpointcan4. x=i-k; bpointcan4. y=j+k; break;v
45、oid searchcandown3 (int i, int j, int n)函數(shù):如果最大值是三,它有兩種情況,一種是三個(gè)同色和兩個(gè)空;一種是四個(gè)同色和一個(gè)異色。前一種必泄能找到一個(gè)空位置,賦值:后一種必立找不到空位宜,不賦值。所以我們的想法很簡(jiǎn)單,先找到空位宜,證明有三個(gè)同色,這對(duì)于玩五子棋來(lái)說(shuō)三個(gè)冋色是很重要的, 再判斷是哪種顏色,賦相應(yīng)的值。/ 最多有三個(gè)同色void cmy3_lview:searchcandown3(int i, int j, int n) int k=0; / num 0 if(n=0) for (k=0;k5;k44-) / 找到位置if (wzqi+k j=
46、0) / 下一個(gè)是白棋if (wzqi+k+l j=l) / 下面位置可以下棋,已經(jīng)有三個(gè)白棋wpointcan3 ? x=i+k; wpointcan3 ? y二j; / 下一個(gè)是黑棋e(cuò)lse if (wzqi+k+l bpointcan3 ? x=i+k; bpointcan3? y二j; / num1 if(n=l) for (k=0;k5;k+) if (wzqtil j+k=o) if (wzqil j+k-l=l) wpointcan3 ? x二i; upointcan3? y=j+k; else if (wzqi j+k+l=-l) bpointcan3 ? x二i;bpoint
47、can3 ? y二j+k; / nume2 v if(n=2) for (k=0;k5;k+) if (wzqi+k j+k=o) if (wzqi+k+l j+k+l=l) wpointcan3 ? x=i+k; wpointcan3 ? y二j+k; else if(wzqi+k+lj+k+l.=-l) bpointcan3 ? x=i+k; bpointcan3 ? y=j+k; / num3 ”辻(n=3) for (k=0;k5;k+) if (wzqi-k j+k=o) if (wzqi-k-l j+k+l=l) wpointcan3 ? x=i-k; upointcan3. y=
48、j+k; else if(wzqi-k-lj+k+ll=-l) bpointcan3 ? x=ik; bpointcan3 ? y二j+k; void searchcandown2 (int i, int j, int n)函數(shù):如果最大值是二,也有兩種情況:一種是有兩個(gè)同色和三個(gè)空位置:一種是有三個(gè)同色和一個(gè)異色和一個(gè)空位置,并且只算三個(gè)同色不連在一起的情況( 因?yàn)槿绻腥齻€(gè)連續(xù)的情況,重全盤搜索的角度看,必然會(huì)被另外的情況所代替)。分兩種算法:一種是有一個(gè)空位置,一種是有三個(gè)空位程。前者先找到空位置,再判斷它下而兩個(gè)是否同色,同色則賦值給相應(yīng)變量,異色則不賦值,因?yàn)橐饬x不大:后者只要找到一
49、個(gè)空位置就行了。/ 最多有兩個(gè)同色void cmy3_lview ::searchcandown2(int i, int j, int n) int k=0, m=0, a=0, b=0; / num 0 if (n=0) / 判斷有多少個(gè)空位置for (k=0;k5;k+) if (wzqi+kj=0) m+=l; / 如果只有一個(gè)空位置if(m=l) for (a=0;a5;a+) / 找到空位置if(wzqi+aj=0) / 下面兩個(gè)棋子值的和b=wzqi+a+lj+wzqi+a+2j; / 都是黑棋if (b=-2) / 下而位置可以下棋,旁邊有兩個(gè)黑棋bpointcan2 ? x=i
50、+a; bpointcan2 ? y二j; / 都是白棋if (b=2) urpointcan2 ? x=i+a; wpointcan2 ? y=j; / 如果有三個(gè)空位置,說(shuō)明另外兩個(gè)同色辻(m=二3) for (a=0;a5;a+) / 如果兩個(gè)是黑棋if (wzqi+a j二二 t) for (b=0;b5;b+) / 如果找到空位置if(wzqi+blj=0) / 下而位置可以下棋,旁邊有兩個(gè)黑棋bpointcan2 ? x二i+b; bpointcan2 ? y二j; break; else / 如果兩個(gè)是白棋if (wzqi+a j=l) for (b=0;b5;b+) if (w
51、zqi+b j=0)urpointcan2 ?x二i+b; urpointcan2 ?y二j; break; / numl k m=0; if(n=l) for (k=0;k5;k+) if (wzqtij+k=o) m+; if(m=l) for(a=0;a5;a+) if(wzqilj+a=0) b二wzqij+a+l+wzqij+a+2; if (b=-2) bpointcan2 ? x=i; bpointcan2 ? y二j+a; if (b=2) wpointcan2 ? x=i; urpointcan2 ? y二j+a; if(m=3) for (a=0;a5;a+) if(wzq
52、illj+a=-l) for (b=0;b5;b+) if(wzqij+b二二0) bpointcan2 ? x二i; bpointcan2 ? y二j+b; break; else if (wzqti j+a=l) for (b=0;b5;b+) if(wzqij+b=o) wpointcan2 ? x=i; wpointcan2 ? y二j+b; break; / num2 v m=0; if(n=2) for (k=0;k5;k+) if (wzqi+k j+k =0) m+; if(m=l) for(a=0;a5;a+) if(wzqi+aj+a=0) b=wzq.i+a+l j+a+1 +wzqi-ra+2 j+a+2; if (b=-2) bpointcan2 ? x=i+a; bpointcan2 ? y二j+a; if (b=2) wpointcan2 ? x=i+a; wpointcan2 ? y二j+a; if(m=3) for (a=0;a5;a+) if (wzqi+a j+a二二 t) f
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年3月行車安全教育
- 巡店督導(dǎo)培訓(xùn)課件
- 2023八年級(jí)語(yǔ)文上冊(cè) 第一單元 3飛天凌空-跳水姑娘呂偉奪魁記教學(xué)設(shè)計(jì) 新人教版
- 清涼站點(diǎn)面試試題及答案
- 如何備課聽課培訓(xùn)
- 2025宏圖公司合同管理制度規(guī)范
- 道路改色施工方案
- 陜西省石泉縣高中化學(xué) 第四章 電化學(xué)基礎(chǔ) 4.1 原電池教學(xué)設(shè)計(jì) 新人教版選修4
- 我和情緒做朋友 教學(xué)設(shè)計(jì)-2023-2024學(xué)年初中主題班會(huì)
- 螺旋滑梯施工方案
- 2024-2025學(xué)年二年級(jí)語(yǔ)文下冊(cè)統(tǒng)編版第三單元基礎(chǔ)達(dá)標(biāo)卷(單元測(cè)試)(含答案)
- DB37T 4834-2025高速公路集中養(yǎng)護(hù)工作指南
- 2024年全國(guó)單招護(hù)理專業(yè)綜合題庫(kù)
- 2025年土木工程業(yè)務(wù)能力試題及答案
- (一模)2025年廣州市普通高中畢業(yè)班綜合測(cè)試(一)歷史試卷
- 江門2025年廣東省江門市新會(huì)區(qū)教育系統(tǒng)招聘事業(yè)編制教師188人筆試歷年參考題庫(kù)附帶答案詳解-1
- 2024年10月成都市金牛區(qū)人民政府西華街道辦事處公開招考1名編外人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 2024年四川公務(wù)員《行政職業(yè)能力測(cè)驗(yàn)》試題真題及答案
- 2025年開封大學(xué)單招職業(yè)傾向性測(cè)試題庫(kù)含答案
- 2025年福建鑫葉投資管理集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 《圍術(shù)期麻醉管理策略》課件
評(píng)論
0/150
提交評(píng)論