版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、五子棋五子棋是一種很受人們喜愛的游戲,它的規(guī)則簡單,但玩法變化多端,富有. 趣味性 , 適合人們消遣。這里我們就來設(shè)讓一個五子棋游戲。(-)(-) 人對人游戲文件迎亙看幫助?o黒棋下| 瞬 t1.1. 游戲?qū)崿F(xiàn)人對人游戲,其實只是對游戲規(guī)則的實現(xiàn),我們只是利用五子棋游戲的規(guī)則來編程, 至于真正的游戲?qū)崿F(xiàn)一一計算機的“智能”算法,我們將在后面講述。五子棋的規(guī)則很簡單:b判斷是否能放下棋子( 是否已經(jīng)有了棋子 ) :2,判斷是哪種顏色下棋; 3,判斷是否已經(jīng)結(jié)朿(是誰贏?)。這些規(guī)則,我們將用相應(yīng)的函數(shù)來實現(xiàn)。英它,我們還將介紹其它一些功能的實現(xiàn)。如鼠標(biāo)的更換,工具欄和狀態(tài)欄的編輯,類與類之間的相
2、互調(diào)用。新建工程3_1,選擇單文檔,在step 4 of 6中先中windows sockets復(fù)選框如卜圖: 圖3-1-1 2. 2. 資源編輯由于我們這個程序出現(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 白棋子說明:由于下棋時我們必須把鼠標(biāo)熱點設(shè)置在中間,點擊下圖(圖3-1-3 )最右邊按扭 , 然后把鼠標(biāo)移動到圖像中你
4、想設(shè)置為熱點的地方,按下鼠標(biāo)左鍵。圖3?2 圖3亠3 圖3-1-3 黑白圖標(biāo)icon以顯示在狀態(tài)欄供以提示: idi_black idi.white 說明:由于我們的圖標(biāo)支持256色,按下下圖(圖3-1-4 )最右邊按扭,選擇device 里而顯示的選項。device:132x32, 256 colors 菜單以供操作開始:id_start 保存:id_save 打開:id.open 工具欄:如上圖所示。說明:工具欄一般都是根據(jù)菜單選項而產(chǎn)生的,它的id 一般都能從菜單的id中找到。device: (monochrome (32x32刁 創(chuàng)hot spot: 1 5,15 知圖3-1-4 3.
5、 3. 變量函數(shù)首先,為了實現(xiàn)狀態(tài)欄的應(yīng)用,我們必須更改它的變量:在mainfrm. h 文件里而,把cstatusbar m_wndstatusbar 為public 接著是在3_lview. h文件里面添加變量函數(shù):兩個鼠標(biāo)hcursor hcursorwhite; hcursor hcursorblack; / 棋盤數(shù)組int wzq1919; / colorwhite true時白棋否則黑棋下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.具體實現(xiàn)棋盤大小設(shè)置:由于我們的游戲的棋盤大小是一泄的,不能改變大小的,是應(yīng)該符合要求的。在如下函數(shù)添加設(shè)置窗口大小的語句: 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); 重畫時顯示存在的棋子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):棋盤畫好了,接下來就是下棋了。但鼠標(biāo)并沒有像我們上而說的那樣變成白棋,加函數(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)在運行程序, 怎樣,鼠標(biāo)變成白棋了, 而且下而的狀態(tài)欄也能夠顯示鼠標(biāo)狀態(tài)了,真是一舉兩得??墒?,又該怎樣把棋子放在棋盤上呢?下棋操作:這就涉及到onlbuttondown(l
14、 ;int nflags, cpoint point)和onlbuttonup(uint nflags, cpoint point)兩個函數(shù)了要用哪一個或用兩個?用down函數(shù)時是在鼠標(biāo)按下時放下棋子,可是,要是我們按下后意識到按錯了怎么辦:那就改用up函數(shù),表示當(dāng)鼠標(biāo)鍵松開時放下棋子。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ù)組賦相應(yīng)的值:1或-1。是否結(jié)束:接著是用一個over ()函數(shù)判斷是否結(jié)束,是則結(jié)朿并重新開始:否則,接著把鼠標(biāo)變成對方棋子,表示對方下棋。那over ()函數(shù)又是怎樣的呢?此函數(shù)是利用剛下棋的位置為中心,檢査它各個方向上的連續(xù)五個棋子是否同色, 是則
17、結(jié)束并重新開始。然而,我們又是怎樣判斷一個方向上的五個棋子的同色的?這就涉及地為什么我要把五子棋數(shù)組賦值為1和-1的問題。因為這樣有一個好處:利用連續(xù)五個棋子的值相加. 如果它們的值的絕對值等于5,則說明是同色。當(dāng)然,這只是這樣賦值的一點作用,真正的作用將在后而介紹。添加如下:void cmy3_lview:over(cpoint point) / 獲取鼠標(biāo)指向數(shù)組位宜,即中心位置int (point, x-30)/20; int y=(point. y-30)/20; / 計算開始判斷的坐標(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; / 五個都是白棋辻(a=5) afxmessagebox ( 白棋勝! ) ; /重新開始onstart 0; return; / 五個都是黑棋辻(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; / 向右下角/ 判斷起點位置if (xy) if(xx=o) yy二y-x; else if(yy=o) xx=x-y; 參數(shù)over=l時退岀循環(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)在,我們的人對人游戲就完成了。下而介紹附加內(nèi)容。5. 5. 附加內(nèi)容理論上,這個游戲并無須保存,因為它確實太小了。事實上,這個游戲有保存的功能,由于我們學(xué)習(xí)的需要。這個游戲的保存,與其說
21、是學(xué)習(xí)文件的保存,不如說是我們學(xué)習(xí)字符串的操作。另外,這個附加的內(nèi)容并不是為了當(dāng)前的學(xué)習(xí)而添加的,而是為了后面的學(xué)習(xí)和應(yīng)用而鋪墊的。保存文件:保存文件函數(shù)是一個菜單選項。它的作用就是保存當(dāng)前游戲的狀態(tài)。首先,我們應(yīng)該為我們自己的文件立義一個后綴需:?wzq:接著是打開保存文件的公共對話框,如果確泄,則表示保存,那么就先獲取文件名,然后按照一左的順序保存各個點的數(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); 如果公共類對話框為確泄if (dig. domodal()=idok) / 獲取文件名dig ? getfilenameo ; / 否則,退出else return; 字符串變量cstring str; int i, j; cstdiofile file; / 如果有問題,退出if(file? open(dig ? getfilenameo, cfile::modecreate cfile:modewrite c
23、file :typetext)=o) ” ” afxmessagebox(z?save error!/z); return; 循環(huán)把棋盤數(shù)組的值寫進文件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ù)進行游戲。與保存文件相反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的機會太少(除了開始的時候),我們不必多加考慮。但是,因為剛才對方下棋的對方必立有一上的危險,我們只需要在剛剛下棋的
26、附近找一個空位宜下棋就可以了。說明:1、 上而之所以把空位置這個詞語放在前而,因為我們注重的是通過檢査,岀一個可以下棋的空位宜,然后下棋。八2、為方便菽明,我們在說明用了絕對值。而事實上正負還是有區(qū)別的。正表示白棋占多數(shù) . 負表示黑棋占多數(shù)。而由于我們的這個算法是針對于計算機的,而我們又讓計算機為黑棋,所以我們的后而的算法還是有一定區(qū)別的。我們必須把它們分開. 而且這樣規(guī)立:絕對值大表示危險性大(這是很容易理解的);而當(dāng)出現(xiàn)絕對值相同的正負兩個值時,我們必須這樣做,在值為負(表示黑棋一方)的那個位置下棋,以保證黑棋一方的優(yōu)先性。下而,就讓我們在怎樣對程序的擴展方法的介紹過程中實現(xiàn)人對機游戲。
27、先把3_1的文件夾復(fù)制一個,改為3_2。以后就用它來擴展。從上而圖中,我們可以看到,工具欄變了。因此我們也可以想到菜單也應(yīng)該變了。它們的修改如下 : 修改菜單 : 開始:d_start 人對人游袤:id_player 人對機游戲:id_cpmputer 修改工具欄 在view類中添加變量函數(shù)如下:2、2、資源編輯刪除菜單項添加菜單項刪除原來的按扭對應(yīng)id:添加兩個新按扭對應(yīng)id:id.start id player id cpmputer 3、 3、變量和函數(shù)/ 保存vscomputer時白棋位置cpoint vspoint; 是人與人游戲?是人與機游戲? int vscomputer; /
28、在得到最大值和方向上尋找落棋點(具體見后而介紹)其中i、j表示搜索起點,n表示方向void searchcandownl(int void searchcandown2(int void searchcandown3(int void searchcandown4(int 計算最大值及方向cpoint maxnum(int a, int 最好落棋點void bestputdown(int i,int j); 計算機下棋void computerdowno ; / 在位置point放卜?棋子void putdown(cpoint point); 人對人菜單afx_msg void onplaye
29、r(); 斤對機菜單afx_msg void oncpmputero ; 4、4、具體實現(xiàn)下而. 我們朝著程序擴充的思路,來實現(xiàn)我們的游戲。菜單函數(shù):添加了菜單項, 我世必須添加一個vscomputer,賦值為1,并約左 : /vscomputer: 2表示人對人,1表示人對機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; 英中,我們只是添加一個變量,而仍然利用原來的開始函數(shù)。雖然我們的菜單項已經(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, / 這個位宜空,它旁邊有四個黑棋wpointcand, bpointcan3, wpointcan3, bpointcan2, wpointcan2, bpointcanl; / 這個位宜空, / 這
31、個位宜空, / 這個位置空, / 這個位宜空, / 這個位置空 , 它旁邊有四個白棋它的旁邊有三個黑棋它的旁邊有三個白棋它的旁邊有兩個黑棋它的旁邊有兩個白棋/ 不是以上情況,這個位置空人變成計算機:下面,我們就必須把游戲雙方中的一方改為計算機。我們把黑棋改為計算機,因為一般情況計算機比人強,應(yīng)讓人先下。當(dāng)然,要是人贏了,就必須讓計算機先下了,在將在以后的算法中體現(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); / 顯示棋子/人對機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; / 計算機下棋computerdown 0; / 人對人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); 由上面可知,我們對人對機游戲的方法是采用:人下完了之后,檢査是否勝利,是則結(jié)束游戲,重新開始,并改為黑棋( 即計算機 ) 先下:如果人沒有勝利,也改為計算機下。而對于計算機怎么下棋,我們只是用了一個函數(shù)computerdom0表示。但是現(xiàn)在我們并不能運行程序,因為有一個沒有圧義的函數(shù),怎么辦呢?程序擴展
35、思想:添加一個空函數(shù)! 仔細看程序的話,你還會發(fā)現(xiàn)一個變量cpoint vspoint,這是后來添加的它的用處是保存剛才白棋下的位置,有利于黑棋下棋時的定位。接著. 我們的主要問題就是實現(xiàn)computerdom()函數(shù),讓計算機能夠自動下棋!計算機下棋 : 訃算機是怎樣下棋?這就是怎位的問題了。即搜索棋盤,找出一個最佳點,放下黑棋。我們實現(xiàn)的方法是:全盤搜索,并把搜索到的位置,保存在變捲。由于有多種情況,我們左義變量如下:cpoint bpointcan4/ 這個位置空,它旁邊有四個黑棋wpointcan4, bpointcan3, wpointcan3, bpointcan2, wpoint
36、can2, bpointcanl; / 這個位置空,它旁邊有四個白棋/ 這個位置空,它的旁邊有三個黑棋 /這個位置空,它的旁邊有三個白棋 / 這個位置空,它的旁邊有兩個黑棋/ 這個位置空,它的旁邊有兩個白棋不是以上情況,這個位置空并在搜索之前都賦值為(-1, -1),然后,進行搜索,并把相應(yīng)的值保存在相應(yīng)變量里而,而如果前而已經(jīng)對變量賦值,我們依然賦值,用新值代替舊值。注意:我們只保存最后一個值 . 這樣的一 個 好 處 是 , 避 免 了 每 次 都 從 左 上 角 開 始 , 并 且 它 的 隨 機 性 比 隨 機 函 數(shù) 還 隨機 。全盤搜索完之后,由于上而的變量中至少有一個已經(jīng)被賦值,
37、即不是(-1, -1),我們 可以采用多數(shù)優(yōu)先的方法,讓已經(jīng)有多個同色棋子的位置先下棋。英原理是. 如果已經(jīng)有四個黑棋,計算機再下一個黑棋就贏了:否則,如果人已經(jīng)有四個白棋,那么訃算機就必須放下一個黑棋,阻止白棋下一步贏:如果已經(jīng)有三個黑棋,再下一個黑棋,變成四個;否則,如果已經(jīng)有三個白棋,下一個黑棋,破壞它:兩個棋子的同理:否則,在剛才白棋下的地方, 順便找一個位置,i棋。computerdown 0函數(shù)如下:輪到計算機下棋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); / 搜索最好的落棋點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); 而另外的四個函數(shù),有其相似性,分別介紹如下:void searchcandown4 (int i, int j, int n)函數(shù):如果最大值是四,它必然有一個空位置:我們可以這樣計算,如果第一個是空,那我們把它賦值給相應(yīng)變量:否則. 先找那個空位宜,然后判斷第一個棋子的顏色,并賦相應(yīng)的值。由于相似,下而代碼只解釋第一個方向/ 有四個同色棋void cmy3_lview:searchcandown4(int i, int j, int n) int k; / num
41、0 ”一”if(n=0) for (k=0;k5;k+) / 如果第一個是空if (wzqi j=0) / 如果下面有白棋if (wzqi+l j=l) / 下而位置可以下棋,已經(jīng)有四個白棋wpointcan4 ? x=i; wpointcan4 ? y二j; break; else / 下面位置可以下棋,已經(jīng)有四個黑棋bpointcan4 ? x二i; bpointcan4 ? y二j; break; / 如果找到下棋位置,一左能找到!else if(wzqi+kj=0) / 如果第一個是白棋if (wzqj j=l) wpointcan4 ? x二i+k; wpointcan4 ? y二j
42、; break; / 否則第一個是黑棋else 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ù):如果最大值是三,它有兩種情況,一種是三個同色和兩個空;一種是四個同色和一個異色。前一種必泄能找到一個空位置,賦值:后一種必立找不到空位宜,不賦值。所以我們的想法很簡單,先找到空位宜,證明有三個同色,這對于玩五子棋來說三個冋色是很重要的, 再判斷是哪種顏色,賦相應(yīng)的值。/ 最多有三個同色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) / 下一個是白棋if (wzqi+k+l j=l) / 下面位置可以下棋,已經(jīng)有三個白棋wpointcan3 ? x=i+k; wpointcan3 ? y二j; / 下一個是黑棋else 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ù):如果最大值是二,也有兩種情況:一種是有兩個同色和三個空位置:一種是有三個同色和一個異色和一個空位置,并且只算三個同色不連在一起的情況( 因為如果有三個連續(xù)的情況,重全盤搜索的角度看,必然會被另外的情況所代替)。分兩種算法:一種是有一個空位置,一種是有三個空位程。前者先找到空位置,再判斷它下而兩個是否同色,同色則賦值給相應(yīng)變量,異色則不賦值,因為意義不大:后者只要找到一
49、個空位置就行了。/ 最多有兩個同色void cmy3_lview ::searchcandown2(int i, int j, int n) int k=0, m=0, a=0, b=0; / num 0 if (n=0) / 判斷有多少個空位置for (k=0;k5;k+) if (wzqi+kj=0) m+=l; / 如果只有一個空位置if(m=l) for (a=0;a5;a+) / 找到空位置if(wzqi+aj=0) / 下面兩個棋子值的和b=wzqi+a+lj+wzqi+a+2j; / 都是黑棋if (b=-2) / 下而位置可以下棋,旁邊有兩個黑棋bpointcan2 ? x=i
50、+a; bpointcan2 ? y二j; / 都是白棋if (b=2) urpointcan2 ? x=i+a; wpointcan2 ? y=j; / 如果有三個空位置,說明另外兩個同色辻(m=二3) for (a=0;a5;a+) / 如果兩個是黑棋if (wzqi+a j二二 t) for (b=0;b5;b+) / 如果找到空位置if(wzqi+blj=0) / 下而位置可以下棋,旁邊有兩個黑棋bpointcan2 ? x二i+b; bpointcan2 ? y二j; break; else / 如果兩個是白棋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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度外賣配送服務(wù)承包合同(含食品安全)
- 2025年度個人獨院買賣合同(含租賃權(quán))協(xié)議書
- 課題申報參考:民族基層地區(qū)檢察聽證實質(zhì)化改革路徑構(gòu)建研究
- 二零二五年度智能停車場租賃與維護一體化合同
- 2025年個人擔(dān)保居間合同標(biāo)準(zhǔn)實施范本2篇
- 二零二五年度女方違反離婚協(xié)議財產(chǎn)分割及房產(chǎn)過戶合同4篇
- 2025年度個人戶外裝備分期購買合同
- 湖北省黃岡市重點中學(xué)高三上學(xué)期期末考試語文試題(含答案)
- 2025版美容院美容師團隊建設(shè)聘用標(biāo)準(zhǔn)合同4篇
- 二零二五年度牧業(yè)產(chǎn)業(yè)扶貧項目承包合同范本3篇
- 橋本甲狀腺炎-90天治療方案
- 《量化交易之門》連載27:風(fēng)險的角度談收益MAR和夏普比率
- (2024年)安全注射培訓(xùn)課件
- 2024版《建設(shè)工程開工、停工、復(fù)工安全管理臺賬表格(流程圖、申請表、報審表、考核表、通知單等)》模版
- 2024年廣州市高三一模普通高中畢業(yè)班高三綜合測試一 物理試卷(含答案)
- 部編版《道德與法治》六年級下冊教材分析萬永霞
- 粘液腺肺癌病理報告
- 酒店人防管理制度
- 油田酸化工藝技術(shù)
- 上海高考英語詞匯手冊列表
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)五 其他內(nèi)容類型的生產(chǎn)
評論
0/150
提交評論