




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。VC+MFC單機和網(wǎng)絡(luò)版五子棋-五子棋五子棋是一種很受人們喜愛的游戲,它的規(guī)則簡單,但玩法變化多端,富有趣味性,適合人們消遣。這里我們就來設(shè)計一個五子棋游戲。(一)人對人游戲1.游戲?qū)崿F(xiàn)人對人游戲,其實只是對游戲規(guī)則的實現(xiàn),我們只是利用五子棋游戲的規(guī)則來編程,至于真正的游戲?qū)崿F(xiàn)計算機的“智能”算法,我們將在后面講述。五子棋的規(guī)則很簡單:1,判斷是否能放下棋子(是否已經(jīng)有了棋子);2,判斷是哪種顏色下棋;3,判斷是否已經(jīng)結(jié)束(是誰贏?)。這些規(guī)則,我們將用相應(yīng)的函數(shù)來實現(xiàn)。其它,我們還將介紹其它一些功能的
2、實現(xiàn)。如鼠標的更換,工具欄和狀態(tài)欄的編輯,類與類之間的相互調(diào)用。新建工程3_1,選擇單文檔,在Step4of6中先中WindowsSockets復(fù)選框。如下圖:圖3-1-12.資源編輯由于我們這個程序出現(xiàn)的關(guān)于資源編輯的內(nèi)容太多,我們具體介紹如下:見下圖3-1-2,我們需要添加的有:圖3-1-2黑白位圖Bitmap以表示棋盤上面的棋子:IDB_BLACKIDB_WHITE黑白鼠標Cursor以替換當前鼠標:IDC_CURSOR1黑棋子IDC_CURSOR2白棋子說明:由于下棋時我們必須把鼠標熱點設(shè)置在中間,點擊下圖(圖3-1-3)最右邊按扭,然后把鼠標移動到圖像中你想設(shè)置為熱點的地方,按下鼠標
3、左鍵。圖3-1-3黑白圖標Icon以顯示在狀態(tài)欄供以提示:IDI_BLACKIDI_WHITE說明:由于我們的圖標支持256色,按下下圖(圖3-1-4)最右邊按扭,選擇Device里面顯示的選項。圖3-1-4菜單以供操作:開始:ID_START保存:ID_SAVE打開:ID_OPEN工具欄:如上圖所示。說明:工具欄一般都是根據(jù)菜單選項而產(chǎn)生的,它的ID一般都能從菜單的ID中找到。3.變量函數(shù)首先,為了實現(xiàn)狀態(tài)欄的應(yīng)用,我們必須更改它的變量:在MainFrm.h文件里面,把CStatusBarm_wndStatusBar為public接著是在3_1View.h文件里面添加變量函數(shù):/兩個鼠標HC
4、URSORhcursorwhite;HCURSORhcursorblack;/棋盤數(shù)組intwzq1919;/colorwhiteTRUE時白棋下,否則黑棋下boolcolorwhite;/棋子位圖CBitmapm_bmblack;CBitmapm_bmwhite;/保存文件voidSave();/檢查是否結(jié)束voidover(CPointpoint);/鼠標操作afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);/鼠標圖形更換afx_msgBOOLOnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage);/菜單的
5、開始afx_msgvoidOnStart();/菜單的保存afx_msgvoidOnSave();/菜單的打開afx_msgvoidOnOpen();4.具體實現(xiàn)棋盤大小設(shè)置:由于我們的游戲的棋盤大小是一定的,不能改變大小的,是應(yīng)該符合要求的。在如下函數(shù)添加設(shè)置窗口大小的語句:BOOLCMainFrame:PreCreateWindow(CREATESTRUCT&cs)if(!CFrameWnd:PreCreateWindow(cs)returnFALSE;/TODO:ModifytheWindowclassorstylesherebymodifying/theCREATESTRUCTcscs
6、.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;/cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;/;/設(shè)置窗口大?。?00*340cs.cx=450;cs.cy=500;returnTRUE;初始化變量:在構(gòu)造函數(shù)里添加初始代碼:CMy3_1View:CMy3_1View()/TODO:addconstructioncodehere/Load鼠標圖像和棋子位圖hcursorblack=AfxGetApp()-LoadCursor(IDC_CURSOR1);hcursorwhite=AfxGetApp()-LoadC
7、ursor(IDC_CURSOR2);m_bmwhite.LoadBitmap(IDB_WHITE);m_bmblack.LoadBitmap(IDB_BLACK);/清理棋盤/數(shù)組值為0表示沒有棋子for(inti=0;i19;i+)for(intj=0;jFillRect(myrect1,&mybrush1);/畫棋盤框線CPenmypen;CPen*myoldPen;mypen.CreatePen(PS_SOLID,1,RGB(0,0,0);myoldPen=pDC-SelectObject(&mypen);for(inti=0;iMoveTo(40,40+i*20);pDC-LineT
8、o(400,40+i*20);pDC-MoveTo(40+i*20,40);pDC-LineTo(40+i*20,400);/重畫時顯示存在的棋子CDCDc;if(Dc.CreateCompatibleDC(pDC)=FALSE)AfxMessageBox(CantcreateDC);for(intn=0;n19;n+)for(intm=0;mBitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);elseif(wzqnm=-1)/顯示黑棋Dc.SelectObject(m_bmblack);pDC-BitBlt(n*20+32,m*20+32,160,
9、160,&Dc,0,0,SRCCOPY);設(shè)置鼠標:棋盤畫好了,接下來就是下棋了。但鼠標并沒有像我們上面說的那樣變成白棋,加函數(shù)如下:BOOLCMy3_1View:OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)/TODO:Addyourmessagehandlercodehereand/orcalldefaultif(nHitTest=HTCLIENT)/白棋下,顯示白棋鼠標if(colorwhite)/調(diào)用主框架里面的狀態(tài)欄CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-m_pMainWnd;CStatusBa
10、r*pStatus=&pFrm-m_wndStatusBar;if(pStatus)pStatus-GetStatusBarCtrl().SetIcon(0,AfxGetApp()-LoadIcon(IDI_WHITE);pStatus-SetPaneText(0,白棋下);SetCursor(hcursorwhite);/顯示黑棋鼠標elseSetCursor(hcursorblack);CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-m_pMainWnd;CStatusBar*pStatus=&pFrm-m_wndStatusBar;if(pStatus)
11、/顯示圖像pStatus-GetStatusBarCtrl().SetIcon(0,AfxGetApp()-LoadIcon(IDI_BLACK);/顯示文字pStatus-SetPaneText(0,黑棋下);return1;returnCView:OnSetCursor(pWnd,nHitTest,message);現(xiàn)在運行程序,怎樣,鼠標變成白棋了,而且下面的狀態(tài)欄也能夠顯示鼠標狀態(tài)了,真是一舉兩得??墒?,又該怎樣把棋子放在棋盤上呢?下棋操作:這就涉及到OnLButtonDown(UINTnFlags,CPointpoint)和OnLButtonUp(UINTnFlags,CPointp
12、oint)兩個函數(shù)了。要用哪一個或用兩個?用Down函數(shù)時是在鼠標按下時放下棋子,可是,要是我們按下后意識到按錯了怎么辦;那就改用Up函數(shù),表示當鼠標鍵松開時放下棋子。OK!添加函數(shù)如下:voidCMy3_1View:OnLButtonUp(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehereand/orcalldefaultCDC*pDC=GetDC();CDCDc;if(Dc.CreateCompatibleDC(pDC)=FALSE)AfxMessageBox(CantcreateDC);/是否在棋盤內(nèi)if(point.x3
13、0&point.x30&point.yBitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);/表示存在白棋wzqpxpy=1;/檢查是否結(jié)束over(point);/換黑棋下colorwhite=false;elseif(wzqpxpy=0)Dc.SelectObject(m_bmblack);pDC-BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);wzqpxpy=-1;over(point);colorwhite=true;CView:OnLButtonUp(nFlags,point);由上面可
14、以看出,當鼠標鍵松開時判斷,如果那個位置沒有棋子,則放下,并把棋盤數(shù)組賦相應(yīng)的值:1或-1。是否結(jié)束:接著是用一個over()函數(shù)判斷是否結(jié)束,是則結(jié)束并重新開始;否則,接著把鼠標變成對方棋子,表示對方下棋。那over()函數(shù)又是怎樣的呢?此函數(shù)是利用剛下棋的位置為中心,檢查它各個方向上的連續(xù)五個棋子是否同色,是則結(jié)束并重新開始。然而,我們又是怎樣判斷一個方向上的五個棋子的同色的?這就涉及地為什么我要把五子棋數(shù)組賦值為1和-1的問題。因為這樣有一個好處:利用連續(xù)五個棋子的值相加,如果它們的值的絕對值等于5,則說明是同色。當然,這只是這樣賦值的一點作用,真正的作用將在后面介紹。添加如下:void
15、CMy3_1View:over(CPointpoint)/獲取鼠標指向數(shù)組位置,即中心位置intx=(point.x-30)/20;inty=(point.y-30)/20;/計算開始判斷的坐標xx,yyintxx,yy;if(x4)xx=0;elsexx=x-4;if(y4)yy=0;elseyy=y-4;inti,j,a;/橫向判斷for(i=xx;i15;i+)a=0;for(j=i;ji+5;j+)a=a+wzqjy;/五個都是白棋if(a=5)AfxMessageBox(白棋勝!);/重新開始OnStart();return;/五個都是黑棋if(a=-5)AfxMessageBox(
16、黑棋勝!);OnStart();return;/豎向判斷for(i=yy;i15;i+)a=0;for(j=i;ji+5;j+)a=a+wzqxj;if(a=5)AfxMessageBox(白棋勝!);OnStart();return;if(a=-5)AfxMessageBox(黑棋勝!);OnStart();return;/向右下角/判斷起點位置if(xy)if(xx=0)yy=y-x;elseif(yy=0)xx=x-y;/參數(shù)over=1時退出循環(huán)intover=0;doa=0;for(i=0;i5;i+)if(xx+i)19|(yy+i)(18-x)if(x13)yy=y-(18-x)
17、;xx=18;elseyy=y-4;xx=x+4;elseif(y5)xx=x+y;yy=0;elseyy=y-4;xx=x+4;over=0;doa=0;for(i=0;i=0|(yy+i)19)a=a+wzqxx-iyy+i;if(a=5)AfxMessageBox(白棋勝!);OnStart();return;if(a=-5)AfxMessageBox(黑棋勝!);OnStart();return;/到了邊界elseover=1;xx-=1;yy+=1;while(over=0);現(xiàn)在,我們的人對人游戲就完成了。下面介紹附加內(nèi)容。5.附加內(nèi)容理論上,這個游戲并無須保存,因為它確實太小了。
18、事實上,這個游戲有保存的功能,由于我們學(xué)習(xí)的需要。這個游戲的保存,與其說是學(xué)習(xí)文件的保存,不如說是我們學(xué)習(xí)字符串的操作。另外,這個附加的內(nèi)容并不是為了當前的學(xué)習(xí)而添加的,而是為了后面的學(xué)習(xí)和應(yīng)用而鋪墊的。保存文件:保存文件函數(shù)是一個菜單選項。它的作用就是保存當前游戲的狀態(tài)。首先,我們應(yīng)該為我們自己的文件定義一個后綴名:.wzq;接著是打開保存文件的公共對話框,如果確定,則表示保存,那么就先獲取文件名,然后按照一定的順序保存各個點的數(shù)組的值,最后保存當前是哪種顏色下棋。voidCMy3_1View:OnSave()/TODO:Addyourcommandhandlercodehere/設(shè)置保存的
19、文件,后綴名wzqCFileDialogdlg(FALSE,wzq,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(*.WZQ)|*.wzq|AllFiles|*.*|,this);/如果公共類對話框為確定if(dlg.DoModal()=IDOK)/獲取文件名dlg.GetFileName();/否則,退出elsereturn;/字符串變量CStringstr;inti,j;CStdioFilefile;/如果有問題,退出if(file.Open(dlg.GetFileName(),CFile:modeCreate|CFile:modeWrite|CFi
20、le:typeText)=0)AfxMessageBox(saveerror!);return;/循環(huán)把棋盤數(shù)組的值寫進文件for(i=0;i19;i+)for(j=0;j19;j+)if(wzqij=-1)file.WriteString(-1n);if(wzqij=0)file.WriteString(0n);if(wzqij=1)file.WriteString(1n);/保存當前下棋顏色if(colorwhite=true)file.WriteString(1n);elsefile.WriteString(0n);/關(guān)閉文件file.Close();讀取文件:讀文件就是把我們以前保存的
21、文件打開,讀取當前打開文件的內(nèi)容,并給數(shù)組賦值使和文件內(nèi)容相同,然后可以繼續(xù)進行游戲。/與保存文件相反voidCMy3_1View:OnOpen()/TODO:AddyourcommandhandlercodehereCFileDialogdlg(TRUE,wzq,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(*.WZQ)|*.wzq|AllFiles|*.*|,this);if(dlg.DoModal()=IDOK)dlg.GetFileName();elsereturn;CStringstr;inti,j,m;CStdioFilefile;if(fi
22、le.Open(dlg.GetFileName(),CFile:modeRead)=0)AfxMessageBox(saveerror!);return;CArchivear(&file,CArchive:load);for(i=0;i19;i+)for(j=0;j30&point.x30&point.yBitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);wzqpxpy=1;over(point);colorwhite=false;/保存白棋位置vspoint=point;/計算機下棋computerdown();/人對人if(vscompute
23、r=2)if(point.x30&point.x30&point.yBitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);wzqpxpy=1;over(point);colorwhite=false;elseif(wzqpxpy=0)Dc.SelectObject(m_bmblack);pDC-BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);wzqpxpy=-1;over(point);colorwhite=true;CView:OnLButtonUp(nFlags,point);由上面可知,我們
24、對人對機游戲的方法是采用:人下完了之后,檢查是否勝利,是則結(jié)束游戲,重新開始,并改為黑棋(即計算機)先下;如果人沒有勝利,也改為計算機下。而對于計算機怎么下棋,我們只是用了一個函數(shù)computerdown()表示。但是現(xiàn)在我們并不能運行程序,因為有一個沒有定義的函數(shù),怎么辦呢?程序擴展思想:添加一個空函數(shù)!仔細看程序的話,你還會發(fā)現(xiàn)一個變量Cpointvspoint,這是后來添加的它的用處是保存剛才白棋下的位置,有利于黑棋下棋時的定位。接著,我們的主要問題就是實現(xiàn)computerdown()函數(shù),讓計算機能夠自動下棋!計算機下棋:計算機是怎樣下棋?這就是定位的問題了。即搜索棋盤,找出一個最佳點
25、,放下黑棋。我們實現(xiàn)的方法是:全盤搜索,并把搜索到的位置,保存在變量。由于有多種情況,我們定義變量如下:CPointbpointcan4,/這個位置空,它旁邊有四個黑棋wpointcan4,/這個位置空,它旁邊有四個白棋bpointcan3,/這個位置空,它的旁邊有三個黑棋wpointcan3,/這個位置空,它的旁邊有三個白棋bpointcan2,/這個位置空,它的旁邊有兩個黑棋wpointcan2,/這個位置空,它的旁邊有兩個白棋bpointcan1;/不是以上情況,這個位置空并在搜索之前都賦值為(-1,-1),然后,進行搜索,并把相應(yīng)的值保存在相應(yīng)變量里面,而如果前面已經(jīng)對變量賦值,我們依
26、然賦值,用新值代替舊值。注意:我們只保存最后一個值,這樣的一個好處是,避免了每次都從左上角開始,并且它的隨機性比隨機函數(shù)還隨機。全盤搜索完之后,由于上面的變量中至少有一個已經(jīng)被賦值,即不是(-1,-1),我們可以采用多數(shù)優(yōu)先的方法,讓已經(jīng)有多個同色棋子的位置先下棋。其原理是,如果已經(jīng)有四個黑棋,計算機再下一個黑棋就贏了;否則,如果人已經(jīng)有四個白棋,那么計算機就必須放下一個黑棋,阻止白棋下一步贏;如果已經(jīng)有三個黑棋,再下一個黑棋,變成四個;否則,如果已經(jīng)有三個白棋,下一個黑棋,破壞它;兩個棋子的同理;否則,在剛才白棋下的地方,順便找一個位置,下棋。computerdown()函數(shù)如下:/輪到計算
27、機下棋voidCMy3_1View:computerdown()/把各種情形賦值為如下bpointcan4=(-1,-1);wpointcan4=(-1,-1);bpointcan3=(-1,-1);wpointcan3=(-1,-1);bpointcan2=(-1,-1);wpointcan2=(-1,-1);bpointcan1=(-1,-1);/搜索最好的落棋點for(inti=0;i19;i+)for(intj=0;jBitBlt(point.x*20+32,point.y*20+32,160,160,&Dc,0,0,SRCCOPY);wzqpoint.xpoint.y=-1;/由于原
28、來我們檢查是否結(jié)束時用的是鼠標點下的坐標,而現(xiàn)在/putdown(CPointpoint)函數(shù)用的是數(shù)組棋盤的坐標,所以必須轉(zhuǎn)換CPointoverpoint;overpoint.x=point.x*20+30;overpoint.y=point.y*20+30;over(overpoint);colorwhite=true;搜索最佳落棋點:現(xiàn)在就剩下voidbestputdown(inti,intj)函數(shù)沒有定義了(雖然前面的變量函數(shù)已經(jīng)說明了,當時我們這里是用程序擴展的思路進行的,故如此說明)。它的實現(xiàn)原理是:在四個方向上,各自計算那個方向上棋子的狀態(tài),我們的思路是利用原來定義的白棋為1,
29、黑棋為-1,的思想,讓同個方向上的五個棋子的值相加,取絕對值并賦值給為這個方向定義的局部變量numi。為什么要用五個棋子的值相加呢?因為,如果幾個棋子是同色的,無論黑白,它的絕對值必然大,而對于幾個棋子中有黑棋和白棋的,其值必然相加而抵消變小。所以我們可以利用這種方法來尋找旁邊有多個同色棋子的空位置(前面已經(jīng)具體說明)。在每一個棋盤位置,計算以它為起點的四個方向(橫、豎、撇、捺),再比較這四個方向中哪個值最大,然后在這個方向上尋找落棋點。我們添加函數(shù)如下:/檢查四個方向,各算出五個棋子的和并賦值voidCMy3_1View:bestputdown(inti,intj)/四個方向的值intnum
30、4;inta,k;/num0-a=0;if(i15)for(k=0;k5;k+)a=a+wzqi+kj;num0=abs(a);/num1|a=0;if(j15)for(k=0;k5;k+)a=a+wzqij+k;num1=abs(a);/num2a=0;if(i15&j15)for(k=0;k4)&(j15)for(k=0;k=b)point.x=0;point.y=a;elsepoint.x=1;point.y=b;if(cpoint.y)point.x=2;point.y=c;if(dpoint.y)point.x=3;point.y=d;returnpoint;而另外的四個函數(shù),有其相
31、似性,分別介紹如下:voidsearchcandown4(inti,intj,intn)函數(shù):如果最大值是四,它必然有一個空位置;我們可以這樣計算,如果第一個是空,那我們把它賦值給相應(yīng)變量;否則,先找那個空位置,然后判斷第一個棋子的顏色,并賦相應(yīng)的值。/由于相似,下面代碼只解釋第一個方向/有四個同色棋voidCMy3_1View:searchcandown4(inti,intj,intn)intk;/num0-if(n=0)for(k=0;k5;k+)/如果第一個是空if(wzqij=0)/如果下面有白棋if(wzqi+1j=1)/下面位置可以下棋,已經(jīng)有四個白棋wpointcan4.x=i;
32、wpointcan4.y=j;break;else/下面位置可以下棋,已經(jīng)有四個黑棋bpointcan4.x=i;bpointcan4.y=j;break;/如果找到下棋位置,一定能找到!elseif(wzqi+kj=0)/如果第一個是白棋if(wzqjj=1)wpointcan4.x=i+k;wpointcan4.y=j;break;/否則第一個是黑棋elsebpointcan4.x=i+k;bpointcan4.y=j;break;/num1|if(n=1)for(k=0;k5;k+)if(wzqij=0)if(wzqij+1=1)wpointcan4.x=i;wpointcan4.y=j
33、;break;elsebpointcan4.x=i;bpointcan4.y=j;break;elseif(wzqij+k=0)if(wzqij=1)wpointcan4.x=i;wpointcan4.y=j+k;break;elsebpointcan4.x=i;bpointcan4.y=j+k;break;/num2if(n=2)for(k=0;k5;k+)if(wzqij=0)if(wzqi+1j+1=1)wpointcan4.x=i;wpointcan4.y=j;break;elsebpointcan4.x=i;bpointcan4.y=j;break;elseif(wzqi+kj+k=
34、0)if(wzqij=1)wpointcan4.x=i+k;wpointcan4.y=j+k;break;elsebpointcan4.x=i+k;bpointcan4.y=j+k;break;/num3/if(n=3)for(k=0;k5;k+)if(wzqij=0)if(wzqi-1j+1=1)wpointcan4.x=i;wpointcan4.y=j;break;elsebpointcan4.x=i;bpointcan4.y=j;break;elseif(wzqi-kj+k=0)if(wzqij=1)wpointcan4.x=i-k;wpointcan4.y=j+k;break;else
35、bpointcan4.x=i-k;bpointcan4.y=j+k;break;voidsearchcandown3(inti,intj,intn)函數(shù):如果最大值是三,它有兩種情況,一種是三個同色和兩個空;一種是四個同色和一個異色。前一種必定能找到一個空位置,賦值;后一種必定找不到空位置,不賦值。所以我們的想法很簡單,先找到空位置,證明有三個同色,這對于玩五子棋來說三個同色是很重要的,再判斷是哪種顏色,賦相應(yīng)的值。/最多有三個同色voidCMy3_1View:searchcandown3(inti,intj,intn)intk=0;/num0-if(n=0)for(k=0;k5;k+)/找到
36、位置if(wzqi+kj=0)/下一個是白棋if(wzqi+k+1j=1)/下面位置可以下棋,已經(jīng)有三個白棋wpointcan3.x=i+k;wpointcan3.y=j;/下一個是黑棋elseif(wzqi+k+1j=-1)bpointcan3.x=i+k;bpointcan3.y=j;/num1|if(n=1)for(k=0;k5;k+)if(wzqij+k=0)if(wzqij+k-1=1)wpointcan3.x=i;wpointcan3.y=j+k;elseif(wzqij+k+1=-1)bpointcan3.x=i;bpointcan3.y=j+k;/num2if(n=2)for(
37、k=0;k5;k+)if(wzqi+kj+k=0)if(wzqi+k+1j+k+1=1)wpointcan3.x=i+k;wpointcan3.y=j+k;elseif(wzqi+k+1j+k+1=-1)bpointcan3.x=i+k;bpointcan3.y=j+k;/num3/if(n=3)for(k=0;k5;k+)if(wzqi-kj+k=0)if(wzqi-k-1j+k+1=1)wpointcan3.x=i-k;wpointcan3.y=j+k;elseif(wzqi-k-1j+k+1=-1)bpointcan3.x=i-k;bpointcan3.y=j+k;voidsearchc
38、andown2(inti,intj,intn)函數(shù):如果最大值是二,也有兩種情況:一種是有兩個同色和三個空位置;一種是有三個同色和一個異色和一個空位置,并且只算三個同色不連在一起的情況(因為如果有三個連續(xù)的情況,重全盤搜索的角度看,必然會被另外的情況所代替)。分兩種算法:一種是有一個空位置,一種是有三個空位置。前者先找到空位置,再判斷它下面兩個是否同色,同色則賦值給相應(yīng)變量,異色則不賦值,因為意義不大;后者只要找到一個空位置就行了。/最多有兩個同色voidCMy3_1View:searchcandown2(inti,intj,intn)intk=0,m=0,a=0,b=0;/num0-if(n
39、=0)/判斷有多少個空位置for(k=0;k5;k+)if(wzqi+kj=0)m+=1;/如果只有一個空位置if(m=1)for(a=0;a5;a+)/找到空位置if(wzqi+aj=0)/下面兩個棋子值的和b=wzqi+a+1j+wzqi+a+2j;/都是黑棋if(b=-2)/下面位置可以下棋,旁邊有兩個黑棋bpointcan2.x=i+a;bpointcan2.y=j;/都是白棋if(b=2)wpointcan2.x=i+a;wpointcan2.y=j;/如果有三個空位置,說明另外兩個同色if(m=3)for(a=0;a5;a+)/如果兩個是黑棋if(wzqi+aj=-1)for(b=
40、0;b5;b+)/如果找到空位置if(wzqi+bj=0)/下面位置可以下棋,旁邊有兩個黑棋bpointcan2.x=i+b;bpointcan2.y=j;break;else/如果兩個是白棋if(wzqi+aj=1)for(b=0;b5;b+)if(wzqi+bj=0)wpointcan2.x=i+b;wpointcan2.y=j;break;/num1|m=0;if(n=1)for(k=0;k5;k+)if(wzqij+k=0)m+;if(m=1)for(a=0;a5;a+)if(wzqij+a=0)b=wzqij+a+1+wzqij+a+2;if(b=-2)bpointcan2.x=i;
41、bpointcan2.y=j+a;if(b=2)wpointcan2.x=i;wpointcan2.y=j+a;if(m=3)for(a=0;a5;a+)if(wzqij+a=-1)for(b=0;b5;b+)if(wzqij+b=0)bpointcan2.x=i;bpointcan2.y=j+b;break;elseif(wzqij+a=1)for(b=0;b5;b+)if(wzqij+b=0)wpointcan2.x=i;wpointcan2.y=j+b;break;/num2m=0;if(n=2)for(k=0;k5;k+)if(wzqi+kj+k=0)m+;if(m=1)for(a=0
42、;a5;a+)if(wzqi+aj+a=0)b=wzqi+a+1j+a+1+wzqi+a+2j+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+aj+a=-1)for(b=0;b5;b+)if(wzqi+bj+b=0)bpointcan2.x=i+b;bpointcan2.y=j+b;break;elseif(wzqi+aj+a=1)for(b=0;b5;b+)if(wzqi+bj+b=0)wpointcan2.x=i+b;wpointcan2.y=j+b;break;/num
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國智能移動辦公行業(yè)市場全景調(diào)研及投資規(guī)劃建議報告
- 2024-2030年中國牙齒膠托行業(yè)發(fā)展運行現(xiàn)狀及投資潛力預(yù)測報告
- 環(huán)??萍际痉秷@項目運營模式與管理結(jié)構(gòu)
- 環(huán)??萍际痉秷@市場需求分析
- 高校拔尖創(chuàng)新人才培養(yǎng)的戰(zhàn)略目標
- 地塊平整項目總結(jié)與經(jīng)驗分享
- 葡萄里有愛的秘訣
- 教案教學(xué)反思(19篇)
- 母親是道光照亮整個家
- 一年級閱讀理解基礎(chǔ)知識匯編及練習(xí)測試題經(jīng)典
- CentOS 7系統(tǒng)配置與管理(Linux 試題庫) 習(xí)題答案 (楊海艷 第2版)
- 中國氫內(nèi)燃機行業(yè)發(fā)展環(huán)境、市場運行格局及前景研究報告-智研咨詢(2024版)
- 開學(xué)季初三沖刺中考開學(xué)第一課為夢想加油課件
- 2025年四川綿陽科技城新區(qū)投資控股集團有限公司招聘筆試參考題庫附帶答案詳解
- 2024年沙洲職業(yè)工學(xué)院高職單招語文歷年參考題庫含答案解析
- 2025年人教版英語五年級下冊教學(xué)進度安排表
- 水文工程施工方案
- 學(xué)校食堂餐廳管理者食堂安全考試題附答案
- 同等學(xué)力英語申碩考試詞匯(第六版大綱)電子版
- 公務(wù)員考察政審表樣本
- 白菜花生長過程記錄
評論
0/150
提交評論