版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、MFC程序設(shè)計(jì)MFC制作五子棋目錄:1. 目的與要求.2. 主要功能.3. 設(shè)計(jì)過程中的經(jīng)驗(yàn)與教訓(xùn).4. 自己收獲與缺乏.5. 重要程序清單.6. 窗口截圖.1.目的與要求利用已有的C+根底,結(jié)合對(duì)MFC的學(xué)習(xí),進(jìn)行窗口化設(shè)計(jì)。由于MFC提供了MFCppWizard自動(dòng)生成框架。使得簡(jiǎn)單的編程更加簡(jiǎn)單,界面簡(jiǎn)潔。這次用MFC設(shè)計(jì)了一個(gè)簡(jiǎn)單的五子棋游戲??梢赃M(jìn)行簡(jiǎn)單的雙人對(duì)戰(zhàn)。目的在于更加熟悉MFC的使用來完成游戲的制作。再此期間,搜集大量信息,以及函數(shù)的源代碼。不斷進(jìn)行整合,進(jìn)行函數(shù)構(gòu)造。2主要功能MFC的窗口更適合小型游戲的界面。五子棋可以說是再簡(jiǎn)單不過的小游戲了,不過其中確包含了大量的函數(shù)
2、實(shí)現(xiàn)游戲的正常運(yùn)轉(zhuǎn)。假設(shè)要是游戲順利進(jìn)行,必須要有程序約束游戲規(guī)那么。因此本游戲要解決,棋子所放位置的判斷,棋子顏色的區(qū)分,以及玩家的輸贏。解決這些問題,玩家便可以進(jìn)行一場(chǎng)二人大戰(zhàn)了。本游戲可以讓兩個(gè)玩家在標(biāo)準(zhǔn)的五子棋盤上進(jìn)行游戲,最先連成五子者,游戲可以顯示哪一方獲勝。最終的結(jié)果可以保存入文件夾。3. 設(shè)計(jì)過程中的經(jīng)驗(yàn)與教訓(xùn)本次游戲設(shè)計(jì),所遇到的阻力比擬大。經(jīng)過屢次返工。屢次函數(shù)未能定義或?qū)崿F(xiàn)。整個(gè)設(shè)計(jì)過程所學(xué)的東西也很多。以五子棋游戲?yàn)槔?。首先要知道其根本?guī)那么,并設(shè)法用不同的函數(shù)來解決規(guī)那么的限定。設(shè)計(jì)過程中常常會(huì)出現(xiàn)函數(shù)已經(jīng)構(gòu)造,卻未加定義的情況。做本游戲時(shí),查看了大量資料。在棋盤的畫
3、法上有所糾結(jié)。是直接將棋盤背景圖直接參加還是調(diào)用函數(shù)進(jìn)行棋盤繪制都是要考慮的。經(jīng)過屢次嘗試,不斷進(jìn)行函數(shù)的調(diào)試和界面圖標(biāo)的設(shè)計(jì)。最終完成此次實(shí)驗(yàn)。雖然屢次返工,雖然有一天從早上做到第二天凌晨5點(diǎn),但最終的成功,使這些都變成浮云。不斷嘗試,永不放棄,最終一定成功。4. 自己收獲與缺乏此次實(shí)驗(yàn)初期,本方案完成一個(gè)比擬優(yōu)秀的作品,但最終多種原因沒有到達(dá)預(yù)期理想的界面。首先談?wù)勈斋@,個(gè)人認(rèn)為此次MFC課程設(shè)計(jì)更適合簡(jiǎn)單游戲的設(shè)計(jì)。五子棋的界面簡(jiǎn)單,相對(duì)規(guī)那么也不多。設(shè)計(jì)過程中,最大的收獲要算程序的擴(kuò)充,函數(shù)的調(diào)試。其實(shí)MFC已給出框架,所要做的便是填充內(nèi)容。懂得了以位圖的形式表示棋子,以cusor替換
4、當(dāng)前鼠標(biāo)。還有鼠標(biāo)熱點(diǎn)的設(shè)置。在BOOL CMainFrame下構(gòu)造函數(shù)以坐標(biāo)的形式以改變棋盤大小。同時(shí)構(gòu)造出一系列畫棋盤,判斷鼠標(biāo),判斷輸贏等函數(shù)。為函數(shù)添加數(shù)據(jù)成員并使其一一實(shí)現(xiàn)。對(duì)相應(yīng)菜單進(jìn)行屬性更改并進(jìn)行消息映射,建立響應(yīng)函數(shù)。整個(gè)過程都得到了了解及應(yīng)用。同時(shí),缺乏也很多,本游戲調(diào)用函數(shù)進(jìn)行了棋盤繪制,使得界面過于簡(jiǎn)單。由于時(shí)間,能力等問題,未能參加人工智能實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)。而且對(duì)于老師所給出的對(duì)話框的設(shè)計(jì)及應(yīng)用也未能參加。棋子的位圖都是自己繪制,并不十分美觀。如果有充足的時(shí)間,我想這些一定會(huì)得到完善。5. 重要程序清單構(gòu)造函數(shù)/兩個(gè)鼠標(biāo) HCURSOR hcursorwhite;HCUR
5、SOR hcursorblack; /棋盤數(shù)組int wzq1919; / colorwhite TRUE時(shí)白棋下,否那么黑棋下bool colorwhite; /棋子位圖CBitmap m_bmblack;CBitmap m_bmwhite; /保存文件void Save();/檢查是否結(jié)束void over(CPoint point);/鼠標(biāo)操作afx_msg void OnLButtonUp(UINT nFlags, CPoint point);/鼠標(biāo)圖形更換afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT mes
6、sage);/菜單的開始afx_msg void OnStart();/菜單的保存afx_msg void OnSave();/菜單的翻開afx_msg void OnOpen(); 窗口設(shè)計(jì)BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cscs.dwExStyle=cs.d
7、wExStyle|WS_EX_TOPMOST;/cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;/; /設(shè)置窗口大小:400*340cs.cx=450;cs.cy=500; return TRUE;棋盤與棋子的繪制void CMy3_1View:OnDraw(CDC* pDC)CMy3_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/畫背景 CBrush mybrush1; mybrush1.CreateSolidB
8、rush(RGB(192,192,192); CRect myrect1(0,0,1200,800); pDC->FillRect(myrect1,&mybrush1);/畫棋盤框線CPen mypen;CPen*myoldPen;mypen.CreatePen(PS_SOLID,1,RGB(0,0,0); myoldPen=pDC->SelectObject(&mypen); for(int i=0;i<19;i+)pDC->MoveTo(40,40+i*20);pDC->LineTo(400,40+i*20);pDC->MoveTo(40
9、+i*20,40);pDC->LineTo(40+i*20,400); /重畫時(shí)顯示存在的棋子CDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMessageBox("Can't create DC");for(int n=0;n<19;n+)for(int m=0;m<19;m+)if(wzqnm=1)/顯示白棋Dc.SelectObject(m_bmwhite);pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);else if(wz
10、qnm=-1)/顯示黑棋Dc.SelectObject(m_bmblack);pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY); 設(shè)置鼠標(biāo): BOOL CMy3_1View:OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) / TODO: Add your message handler code here and/or call defaultif(nHitTest=HTCLIENT)/白棋下,顯示白棋鼠標(biāo)if(colorwhite) /調(diào)用主框架
11、里面的狀態(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)elseSetCursor(hcursorblack);
12、CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;CStatusBar*pStatus=&pFrm->m_wndStatusBar;if(pStatus)/顯示圖像pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->LoadIcon(IDI_BLACK);/顯示文字pStatus->SetPaneText(0,"黑棋下");return 1;return CView:OnSetCursor(pWnd, nHitTest, messa
13、ge);判斷輸贏void CMy3_1View:over(CPoint point)/獲取鼠標(biāo)指向數(shù)組位置,即中心位置int x=(point.x-30)/20;int y=(point.y-30)/20;/計(jì)算開始判斷的坐標(biāo) xx,yyint xx,yy; if(x<4)xx=0;elsexx=x-4;if(y<4)yy=0;elseyy=y-4;int i,j,a;/橫向判斷for(i=xx;i<15;i+) a=0;for(j=i;j<i+5;j+)a=a+wzqjy;/五個(gè)都是白棋 if(a=5)AfxMessageBox("白棋勝!");/
14、重新開始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+wzqxj; if(a=5)AfxMessageBox("白棋勝!");OnStart();return;if(a=-5)AfxMessageBox("黑棋勝!");OnStart();return;/向右下角/判斷起點(diǎn)位置if(x<y)if(xx=0)yy=y-x;else
15、if(yy=0)xx=x-y;/參數(shù)over=1時(shí)退出循環(huán)int over=0;doa=0;for(i=0;i<5;i+)if(xx+i)<19|(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); /向左下角 if(y>(18-x)if(x>13)yy=y
16、-(18-x);xx=18;elseyy=y-4;xx=x+4;elseif(y<5)xx=x+y;yy=0;elseyy=y-4;xx=x+4; over=0;doa=0;for(i=0;i<5;i+)if(xx-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(
17、over=0); 文件保存void CMy3_1View:OnSave() / TODO: Add your command handler code here/設(shè)置保存的文件,后綴名wzqCFileDialog dlg(FALSE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|All Files|*.*|",this);/如果公共類對(duì)話框?yàn)榇_定if(dlg.DoModal()=IDOK) /獲取文件名dlg.GetFileName();/否那么,退出elsereturn;/
18、字符串變量CString str;int i,j; CStdioFile file;/如果有問題,退出if(file.Open(dlg.GetFileName(),CFile:modeCreate|CFile:modeWrite|CFile:typeText)=0)AfxMessageBox("save error!");return;/循環(huán)把棋盤數(shù)組的值寫進(jìn)文件for(i=0;i<19;i+)for(j=0;j<19;j+)if(wzqij=-1)file.WriteString("-1n");if(wzqij=0)file.W
19、riteString("0n");if(wzqij=1)file.WriteString("1n");/保存當(dāng)前下棋顏色if(colorwhite=true)file.WriteString("1n");elsefile.WriteString("0n");/關(guān)閉文件 file.Close(); 讀取文件: 讀文件就是把我們以前保存的文件翻開,讀取當(dāng)前翻開文件的內(nèi)容,并給數(shù)組賦值使和文件內(nèi)容相同,然后可以繼續(xù)進(jìn)行游戲。 /與保存文件相反void CMy3_1View:OnOpen() / TODO: Add your command handler code hereCFileDialog dlg(TRUE,&
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 招標(biāo)文件購買信用先行
- 旅店服務(wù)合同的性質(zhì)分析
- 專業(yè)團(tuán)隊(duì)的筆譯
- 短期借款人協(xié)議合同
- 房屋買賣合同標(biāo)準(zhǔn)模板
- 廣場(chǎng)物業(yè)服務(wù)合同文本
- 面磚供應(yīng)鏈合作協(xié)議
- 煙草制品保證
- 外加工與采購合同的更新
- 購房貸款合同范本模板示例
- 應(yīng)急預(yù)案演練記錄表范例
- 工程派工單模板
- 帶頸對(duì)焊法蘭尺寸與質(zhì)量
- 二氧化氯復(fù)合解堵技術(shù)
- 花鍵跨棒距的計(jì)算
- 國家開放大學(xué)《C語言程序設(shè)計(jì)》形考任務(wù)1-4參考答案
- 北京市海淀區(qū)2021-2022學(xué)年七年級(jí)上學(xué)期期末考試語文試卷(word版含答案)
- 佛山批發(fā)市場(chǎng)匯總
- WordA4信紙(A4橫條直接打印版)
- (精選)甲醇一書一簽Word版
- 國標(biāo)-墜落防護(hù)+帶柔性導(dǎo)軌的自鎖器
評(píng)論
0/150
提交評(píng)論