




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
設(shè)計(jì)一個(gè)簡(jiǎn)單的五子棋游戲一、設(shè)計(jì)目標(biāo)與內(nèi)容了解Windows編程的基礎(chǔ)知識(shí),掌握MFC應(yīng)用程序的基本知識(shí);基本掌握面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思路和方法;掌握用VC++開發(fā)應(yīng)用程序的的一般步驟和方法;能夠利用所學(xué)的基本知識(shí),設(shè)計(jì)一個(gè)簡(jiǎn)單的五子棋游戲,具有以下功能:①數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì);五子棋棋盤的繪制。②兩人下棋時(shí),兩人下棋算法的設(shè)計(jì)。③兩人下棋時(shí)判斷任一方獲勝的算法的設(shè)計(jì)。二、設(shè)計(jì)要求1.用VC++進(jìn)行編碼,實(shí)現(xiàn)應(yīng)用程序的功能。注重編碼質(zhì)量,代碼要有適當(dāng)?shù)淖⑨專惶峤辉O(shè)計(jì)報(bào)告一份(課程設(shè)計(jì)任務(wù)書、目錄、主要的數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)的基本思路、設(shè)計(jì)的步驟及主要代碼、心得體會(huì)、參考文獻(xiàn))??傮w設(shè)計(jì)運(yùn)行時(shí)效果如下:
圖3-1這個(gè)程序只能進(jìn)行兩個(gè)人之間的對(duì)弈,不能進(jìn)行人機(jī)對(duì)弈,由于時(shí)間和個(gè)人能力的原因所以人機(jī)對(duì)弈的算法就沒有寫出。同時(shí)程序中也存在著很多漏洞,但基本的功能都已經(jīng)實(shí)現(xiàn),還有待繼續(xù)改進(jìn)。詳細(xì)設(shè)計(jì)新建工程game_wzq
選擇單文檔應(yīng)用程序,在Step4of6中先中WindowsSockets復(fù)選框。如下圖:MFC應(yīng)用啟序向?qū)?歩慕4共白歩|▼ ApplicationPr?t...PriatPrevievPriktSct?p...Exit您是否希璽包含以下特點(diǎn):P|▼ ApplicationPr?t...PriatPrevievPriktSct?p...Exit您是否希璽包含以下特點(diǎn):PP[7ReadyEditingControl:|Record鹽藏工具欄初始化狀態(tài)欄打印和打印預(yù)覽上下文相關(guān)幫助3D外觀MAPI(MessagingAPI][J]7WindowsSockets(W|Ch?ckBoxCh?ckBox(S)RadioBvttoaORadioBvttoa您的工具欄的樣式:檸普通「類似IE您的最近文件列表數(shù)目:高級(jí)回…I<上一步下一步》完成取涓圖3-2資源編輯黑白位圖Bitmap以表示棋盤上面的棋子IDB_BLACKDB_WHITE黑白鼠標(biāo)Cursor以替換當(dāng)前鼠標(biāo):IDC_CURSOR1黑棋子
IDC_CURSOR2白棋子黑白圖標(biāo)Icon以顯示在狀態(tài)欄供以提示IDI_BLACKIDI_WHITE菜單以供操作:開始:ID_START保存:ID_SAVE打開:ID_OPEN如下圖所示:-I-t3gamewzqresourcesi21Accelerator-BitmapIDBBLACK鱉IDB_WHITE-卜日Cursor驗(yàn)IDC_CURSOR1關(guān)IDC_CURSOR2-Dialog冒IDD_ABOUTBOXT日Icon□IDI_BU\CKIQIDI_WHITE|QIDR_GAME_WTYPE:匚金曲閤ReSourjFileVie^VAVie^1□idrZmainframe由QMenu:匚金曲閤ReSourjFileVie^VAVie^圖3-3變量函數(shù)首先,為了實(shí)現(xiàn)狀態(tài)欄的應(yīng)用,我們必須更改它的變量在MainFrm.h文件里面,把CStatusBarm_wndStatusBar為public接著是在game_wzqView.h文件里面添加變量函數(shù)://兩個(gè)鼠標(biāo)HCURSORhcursorwhite;HCURSORhcursorblack;//棋盤數(shù)組intwzq[19][19];//colorwhiteTRUE時(shí)白棋下,否則黑棋下boolcolorwhite;//棋子位圖CBitmapm_bmblack;CBitmapm_bmwhite;//保存文件voidSave();//檢查是否結(jié)束voidover(CPointpoint);//鼠標(biāo)操作afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);//鼠標(biāo)圖形更換afx_msgBOOLOnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage);//菜單的開始afx_msgvoidOnStart();//菜單的保存afx_msgvoidOnSave();//菜單的打開afx_msgvoidOnOpen();具體實(shí)現(xiàn)1、由于我們的游戲的棋盤大小是一定的,不能改變大小的,是應(yīng)該符合要求的。在如下函數(shù)添加設(shè)置窗口大小的語句:BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){if(!CFrameWnd::PreCreateWindow(cs))returnFALSE;//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcscs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//設(shè)置窗口大?。?00*340cs.cx=450;cs.cy=500;returnTRUE;}2、初始化變量:在構(gòu)造函數(shù)里添加初始代碼:CGame_wzqView::CGame_wzqView(){//Load鼠標(biāo)圖像和棋子位圖hcursorblack=AfxGetApp()->LoadCursor(IDC_CURSOR1);hcursorwhite=AfxGetApp()->LoadCursor(IDC_CURSOR2);m_bmwhite.LoadBitmap(IDB_WHITE);m_bmblack.LoadBitmap(IDB_BLACK);//清理棋盤//數(shù)組值為0表示沒有棋子for(inti=0;i<19;i++)for(intj=0;j<19;j++)wzq[i][j]=0;//白棋先下colorwhite=true;3、畫棋盤:在OnDraw(CDC*pDC)函數(shù)中畫棋盤,由于在游戲過程中有可能重畫棋盤,而那時(shí)棋盤上面有棋子,所以,我們?cè)谶@個(gè)函數(shù)里面必須有畫棋子的語句。我們用數(shù)組的做為1表示白棋,-1表示黑棋。voidCGame_wzqView::OnDraw(CDC*pDC){CGame_wzqDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//畫背景CBrushmybrush1;mybrush1.CreateSolidBrush(RGB(192,192,192));CRectmyrect1(0,0,1200,800);pDC->FillRect(myrect1,&mybrush1);//畫棋盤框線CPenmypen;CPen*myoldPen;mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));myoldPen=pDC->SelectObject(&mypen);for(inti=0;i<19;i++){pDC->MoveTo(40,40+i*20);pDC->LineTo(400,40+i*20);pDC->MoveTo(40+i*20,40);pDC->LineTo(40+i*20,400);}//重畫時(shí)顯示存在的棋子CDCDc;if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can'tcreateDC");for(intn=0;n<19;n++)for(intm=0;m<19;m++)if(wzq[n][m]==1){//顯示白棋Dc.SelectObject(m_bmwhite);pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY)}elseif(wzq[n][m]==-1){//顯示黑棋Dc.SelectObject(m_bmblack);pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY)}}4、設(shè)置鼠標(biāo):棋盤畫好了,接下來就是下棋了。但鼠標(biāo)并沒有像我們上面說的那樣變成白棋,加函數(shù)如下:BOOLCGame_wzqView::OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage){if(nHitTest==HTCLIENT){//白棋下,顯示白棋鼠標(biāo)if(colorwhite){//調(diào)用主框架里面的狀態(tài)欄CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;CStatusBar*pStatus=&pFrm->m_wndStatusBar;if(pStatus){pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->LoadIcon(IDI_WHITE));pStatus-〉SetPaneText(0,"白棋下");}SetCursor(hcursorwhite);}//顯示黑棋鼠標(biāo)else{SetCursor(hcursorblack);CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-〉m_pMainWndCStatusBar*pStatus=&pFrm-〉m_wndStatusBar;if(pStatus){//顯示圖像pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->LoadIcon(IDI_BLACK));//顯示文字pStatus-〉SetPaneText(0,"黑棋下");}}return1;}returnCView::OnSetCursor(pWnd,nHitTest,message);}5、下棋操作:這就涉及到OnLButtonDown(UINTnFlags,CPointpoint)和OnLButtonUp(UINTnFlags,CPointpoint)兩個(gè)函數(shù)了。要用哪一個(gè)或用兩個(gè)?用Down函數(shù)時(shí)是在鼠標(biāo)按下時(shí)放下棋子,可是,要是我們按下后意識(shí)到按錯(cuò)了怎么辦;那就改用Up函數(shù),表示當(dāng)鼠標(biāo)鍵松開時(shí)放下棋子。0K!添加函數(shù)如下:voidCGame_wzqView::OnLButtonUp(UINTnFlags,CPointpoint){CView::OnLButtonUp(nFlags,point);CDC*pDC=GetDC();CDCDc;if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can'tcreateDC");//是否在棋盤內(nèi)if(point.x>30&&point.x<410&&point.y>30&&point.y<410){intpx=(point.x-30)/20;intpy=(point.y-30)/20;//是否已經(jīng)有棋子if(colorwhite&&wzq[px][py]==0){Dc.SelectObject(m_bmwhite);pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);//表示存在白棋wzq[px][py]=1;//檢查是否結(jié)束over(point);//換黑棋下colorwhite=false;}elseif(wzq[px][py]==0){Dc.SelectObject(m_bmblack);pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);wzq[px][py]=-1;over(point);colorwhite=true;}}}由上面可以看出,當(dāng)鼠標(biāo)鍵松開時(shí)判斷,如果那個(gè)位置沒有棋子則放下,并把棋盤數(shù)組賦相應(yīng)的值:1或-16、是否結(jié)束:接著是用一個(gè)over()函數(shù)判斷是否結(jié)束,是則結(jié)束并重新開始;否則,接著把鼠標(biāo)變成對(duì)方棋子,表示對(duì)方下棋。那over()函數(shù)又是怎樣的呢?此函數(shù)是利用剛下棋的位置為中心,檢查它各個(gè)方向上的連續(xù)五個(gè)棋子是否同色,是則結(jié)束并重新開始。然而,我們又是怎樣判斷一個(gè)方向上的五個(gè)棋子的同色的?這就涉及地為什么我要把五子棋數(shù)組賦值為1和-1的問題。因?yàn)檫@樣有一個(gè)好處:利用連續(xù)五個(gè)棋子的值相加,如果它們的值的絕對(duì)值等于5,則說明是同色。當(dāng)然,這只是這樣賦值的一點(diǎn)作用,真正的作用將在后面介紹。添加如下:voidCGame_wzqView::over(CPointpoint){//獲取鼠標(biāo)指向數(shù)組位置,即中心位置intx=(point.x-30)/20;inty=(point.y-30)/20;//計(jì)算開始判斷的坐標(biāo)xx,yyintxx,yy;if(x<4)xx=0;elsexx=x-4;if(y<4)yy=0;elseyy=y-4;inti,j,a;//橫向判斷for(i=xx;i<15;i++){a=0;for(j=i;j<i+5;j++){a=a+wzq[j][y];//五個(gè)都是白棋if(a==5){AfxMessageBox("白棋勝!");//重新開始OnStart();return;}//五個(gè)都是黑棋if(a==-5){AfxMessageBox("黑棋勝!");OnStart();return;}}}//豎向判斷for(i=yy;i<15;i++){a=0;for(j=i;j<i+5;j++){a=a+wzq[x][j];if(a==5){AfxMessageBox("白棋勝!");OnStart();return;}if(a==-5)AfxMessageBox("黑棋勝!");OnStart();return;}}}//向右下角//判斷起點(diǎn)位置if(x<y){if(xx==0)yy=y-x;}else{if(yy==0)xx=x-y;}//參數(shù)over=l時(shí)退出循環(huán)intover=0;doa=0;for(i=0;i<5;i++){if((xx+i)<19||(yy+i)<19){a=a+wzq[xx+i][yy+i];if(a==5){AfxMessageBox("白棋勝!");OnStart();return;}if(a==-5){AfxMessageBox("黑棋勝!");OnStart();return;}}//到了邊界elseover=1;}xx+=1;yy+=1;}while(over==0);//向左下角if(y>(18-x)){if(x>13){yy=y-(18-x);xx=18;}else{yy=y-4;xx=x+4;}}else{if(y<5){xx=x+y;yy=0;}else{yy=y-4;xx=x+4;}}over=0;do{a=0;for(i=0;i<5;i++){if((xx-i)>=0||(yy+i)<19){a=a+wzq[xx-i][yy+i];if(a==5){AfxMessageBox("白棋勝!");OnStart();return;}if(a==-5){AfxMessageBox("黑棋勝!");OnStart();return;}}//到了邊界elseover=1;}xx-=1;yy+=1;}while(over==0);}文件保存和讀取1、保存文件函數(shù)是一個(gè)菜單選項(xiàng)。它的作用就是保存當(dāng)前游戲的狀態(tài)。首先,我們應(yīng)該為我們自己的文件定義一個(gè)后綴名:.wzq;接著是打開保存文件的公共對(duì)話框,如果確定,則表示保存,那么就先獲取文件名,然后按照一定的順序保存各個(gè)點(diǎn)的數(shù)組的值,最后保存當(dāng)前是哪種顏色下棋。voidCGame_wzqView::OnSave(){//設(shè)置保存的文件,后綴名wzqCFileDialogdlg(FALSE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|AllFiles|*.*||",this);//如果公共類對(duì)話框?yàn)榇_定if(dlg.DoModal()==IDOK)//獲取文件名dlg.GetFileName();//否則,退出elsereturn;//字符串變量CStringstr;inti,j;CStdioFilefile;//如果有問題,退出if(file.Open(dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite|CFile::typeText)==0){AfxMessageBox("saveerror!");return;}//循環(huán)把棋盤數(shù)組的值寫進(jìn)文件for(i=0;i<19;i++)for(j=0;j<19;j++){if(wzq[i][j]==-1)file.WriteString("-1\n");if(wzq[i][j]==0)f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年生物質(zhì)能源分布式能源系統(tǒng)能源效率與環(huán)保標(biāo)準(zhǔn)優(yōu)化報(bào)告
- 金融科技行業(yè)估值方法與投資策略研究報(bào)告-2025年展望
- 現(xiàn)場(chǎng)演藝市場(chǎng)復(fù)蘇2025年虛擬現(xiàn)實(shí)演出形式研究報(bào)告001
- 2025年基層醫(yī)療衛(wèi)生機(jī)構(gòu)信息化建設(shè)中的醫(yī)療信息化與醫(yī)療服務(wù)互聯(lián)網(wǎng)化監(jiān)管體系報(bào)告
- 交通設(shè)備制造業(yè)數(shù)字化轉(zhuǎn)型與智能生產(chǎn)質(zhì)量保障報(bào)告
- 安全主管試題及答案
- 安全責(zé)任試題及答案
- 區(qū)塊鏈技術(shù)驅(qū)動(dòng)2025年數(shù)字貨幣在金融領(lǐng)域應(yīng)用與風(fēng)險(xiǎn)控制報(bào)告
- 安全試題單選竅門及答案
- K2教育STEM課程實(shí)施與2025年教育評(píng)價(jià)改革路徑研究報(bào)告001
- 生物-七年級(jí)下冊(cè)期末復(fù)習(xí)知識(shí)點(diǎn)匯Z(冀少版2024)速記版 2024-2025學(xué)年七年級(jí)生物下學(xué)期
- 2025屆浙江省精誠(chéng)聯(lián)盟高三下學(xué)期適應(yīng)性聯(lián)考生物試題
- 2025-2030年中國(guó)背光單元(BLU)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 夏季高溫安全生產(chǎn)培訓(xùn)
- 2025浙江中考:化學(xué)必背知識(shí)點(diǎn)
- 護(hù)理職業(yè)安全文化試題及答案
- 《神經(jīng)調(diào)控機(jī)制》課件
- DB63-T 2135-2023 鹽湖資源動(dòng)態(tài)監(jiān)測(cè)技術(shù)規(guī)程
- 汽車空氣凈化系統(tǒng)原理與效果
- 酒店掛賬信用管理制度
- 公司合伙合同樣本
評(píng)論
0/150
提交評(píng)論