版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程設(shè)計(jì)闡明書題目:五子棋姓名:院(系):專業(yè)班級(jí):學(xué)號(hào):指導(dǎo)教師:成績(jī):時(shí)間:年月日至年月日課程設(shè)計(jì)任務(wù)書題目五子棋專業(yè)、班級(jí)學(xué)號(hào)姓名五子棋:又名五子連珠棋,是一項(xiàng)有趣、益智的棋類游戲,易學(xué)難精,但妙趣橫生。下一局棋所費(fèi)時(shí)間不多,工余飯后“殺上一盤”,開發(fā)智力,勤于動(dòng)腦,調(diào)劑感情,有助于開發(fā)智商居家必備。故此運(yùn)用已學(xué)知識(shí)在Visualc++6.0上寫出五子棋程序。完成期限:12月4日指導(dǎo)教師簽名:課程負(fù)責(zé)人簽名:月日目錄設(shè)計(jì)目的與內(nèi)容............................................................1設(shè)計(jì)規(guī)定.........................................................................22.1新建工程game_wzq..................................................32.2資源編輯....................................................................42.3變量函數(shù).....................................................................52.4具體實(shí)現(xiàn).....................................................................62.5文獻(xiàn)保存和讀取........................................................22附錄...................................................................................27參考文獻(xiàn).............................................................................29第一章設(shè)計(jì)目的與內(nèi)容理解Windows編程的基礎(chǔ)知識(shí),掌握MFC應(yīng)用程序的基本知識(shí);基本掌握面對(duì)對(duì)象程序設(shè)計(jì)的基本思路和辦法;掌握用VC++開發(fā)應(yīng)用程序的的普通環(huán)節(jié)和辦法;能夠運(yùn)用所學(xué)的基本知識(shí),設(shè)計(jì)一種簡(jiǎn)樸的五子棋游戲,含有下列功效:①數(shù)據(jù)構(gòu)造的設(shè)計(jì);五子棋棋盤的繪制。②兩人下棋時(shí),兩人下棋算法的設(shè)計(jì)。③兩人下棋時(shí),判斷任一方獲勝的算法的設(shè)計(jì)。第二章設(shè)計(jì)規(guī)定用VC++進(jìn)行編碼,實(shí)現(xiàn)應(yīng)用程序的功效。重視編碼質(zhì)量,代碼要有合適的注釋;提交設(shè)計(jì)報(bào)告一份(課程設(shè)計(jì)任務(wù)書、目錄、重要的數(shù)據(jù)構(gòu)造、設(shè)計(jì)的基本思路、設(shè)計(jì)的環(huán)節(jié)及重要代碼、心得體會(huì)、參考文獻(xiàn))??傮w設(shè)計(jì)運(yùn)行時(shí)效果以下:圖1這個(gè)程序只能進(jìn)行兩個(gè)人之間的對(duì)弈,不能進(jìn)行人機(jī)對(duì)弈,由于時(shí)間和個(gè)人能力的因素因此人機(jī)對(duì)弈的算法就沒(méi)有寫出。同時(shí)程序中也存在著諸多漏洞,但基本的功效都已經(jīng)實(shí)現(xiàn),尚有待繼續(xù)改善。具體設(shè)計(jì)第一節(jié)新建工程game_wzq選擇單文檔應(yīng)用程序,在Step4of6中先中WindowsSockets復(fù)選框。以下圖:圖2第二節(jié)資源編輯黑白位圖Bitmap以表達(dá)棋盤上面的棋子:IDB_BLACKDB_WHITE黑白鼠標(biāo)Cursor以替代目前鼠標(biāo):IDC_CURSOR1黑棋子IDC_CURSOR2白棋子黑白圖標(biāo)Icon以顯示在狀態(tài)欄供以提示IDI_BLACKIDI_WHITE菜單以供操作:開始:ID_START保存:ID_SAVE打開:ID_OPEN以下圖所示:圖3第三節(jié)變量函數(shù)首先,為了實(shí)現(xiàn)狀態(tài)欄的應(yīng)用,我們必須更改它的變量:在MainFrm.h文獻(xiàn)里面,把CStatusBarm_wndStatusBar為public接著是在game_wzqView.h文獻(xiàn)里面添加變量函數(shù)://兩個(gè)鼠標(biāo)HCURSORhcursorwhite;HCURSORhcursorblack;//棋盤數(shù)組intwzq[19][19];//colorwhiteTRUE時(shí)白棋下,否則黑棋下boolcolorwhite;//棋子位圖CBitmapm_bmblack;CBitmapm_bmwhite;//保存文獻(xiàn)voidSave();//檢查與否結(jié)束voidover(CPointpoint);//鼠標(biāo)操作afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);//鼠標(biāo)圖形更換afx_msgBOOLOnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage);//菜單的開始afx_msgvoidOnStart();//菜單的保存afx_msgvoidOnSave();//菜單的打開afx_msgvoidOnOpen();第四節(jié)具體實(shí)現(xiàn)1、由于我們的游戲的棋盤大小是一定的,不能變化大小的,是應(yīng)當(dāng)符合規(guī)定的。在以下函數(shù)添加設(shè)立窗口大小的語(yǔ)句: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表達(dá)沒(méi)有棋子for(inti=0;i<19;i++)for(intj=0;j<19;j++)wzq[i][j]=0;//白棋先下colorwhite=true;} 3、畫棋盤:在OnDraw(CDC*pDC)函數(shù)中畫棋盤,由于在游戲過(guò)程中有可能重畫棋盤,而那時(shí)棋盤上面有棋子,因此,我們?cè)谶@個(gè)函數(shù)里面必須有畫棋子的語(yǔ)句。我們用數(shù)組的做為1表達(dá)白棋,-1表達(dá)黑棋。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):棋盤畫好了,接下來(lái)就是下棋了。但鼠標(biāo)并沒(méi)有像我們上面說(shuō)的那樣變成白棋,加函數(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_pMainWnd;CStatusBar*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è)?用Down函數(shù)時(shí)是在鼠標(biāo)按下時(shí)放下棋子,可是,要是我們按下后意識(shí)到按錯(cuò)了怎么辦;那就改用Up函數(shù),表達(dá)當(dāng)鼠標(biāo)鍵松開時(shí)放下棋子。OK!添加函數(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;//與否已有棋子if(colorwhite&&wzq[px][py]==0){Dc.SelectObject(m_bmwhite);pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);//表達(dá)存在白棋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è)位置沒(méi)有棋子,則放下,并把棋盤數(shù)組賦對(duì)應(yīng)的值:1或-16、與否結(jié)束:接著是用一種over()函數(shù)判斷與否結(jié)束,是則結(jié)束并重新開始;否則,接著把鼠標(biāo)變成對(duì)方棋子,表達(dá)對(duì)方下棋。那over()函數(shù)又是如何的呢?此函數(shù)是運(yùn)用剛下棋的位置為中心,檢查它各個(gè)方向上的持續(xù)五個(gè)棋子與否同色,是則結(jié)束并重新開始。然而,我們又是如何判斷一種方向上的五個(gè)棋子的同色的?這就涉及地為什么我要把五子棋數(shù)組賦值為1和-1的問(wèn)題。由于這樣有一種好處:運(yùn)用持續(xù)五個(gè)棋子的值相加,如果它們的值的絕對(duì)值等于5,則闡明是同色。固然,這只是這樣賦值的一點(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=1時(shí)退出循環(huán)intover=0;do{a=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);第五節(jié)文獻(xiàn)保存和讀取保存文獻(xiàn)函數(shù)是一種菜單選項(xiàng)。它的作用就是保存目前游戲的狀態(tài)。首先,我們應(yīng)當(dāng)為我們自己的文獻(xiàn)定義一種后綴名:.wzq;接著是打開保存文獻(xiàn)的公共對(duì)話框,如果擬定,則表達(dá)保存,那么就先獲取文獻(xiàn)名,然后按照一定的次序保存各個(gè)點(diǎn)的數(shù)組的值,最后保存目前是哪種顏色下棋。voidCGame_wzqView::OnSave(){ //設(shè)立保存的文獻(xiàn),后綴名wzq CFileDialogdlg(FALSE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|AllFiles|*.*||",this); //如果公共類對(duì)話框?yàn)閿M定 if(dlg.DoModal()==IDOK) //獲取文獻(xiàn)名 dlg.GetFileName(); //否則,退出 elsereturn; //字符串變量 CStringstr; inti,j; CStdioFilefile; //如果有問(wèn)題,退出 if(file.Open(dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite|CFile::typeText)==0) {AfxMessageBox("saveerror!");return; } //循環(huán)把棋盤數(shù)組的值寫進(jìn)文獻(xià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)file.WriteString("0\n");if(wzq[i][j]==1)file.WriteString("1\n");}//保存目前下棋顏色if(colorwhite==true)file.WriteString("1\n");elsefile.WriteString("0\n");//關(guān)閉文獻(xiàn)file.Close();} 讀文獻(xiàn)就是把我們以前保存的文獻(xiàn)打開,讀取目前打開文獻(xiàn)的內(nèi)容,并給數(shù)組賦值使和文獻(xiàn)內(nèi)容相似,然后能夠繼續(xù)進(jìn)行游戲。voidCGame_wzqView::OnOpen(){ CFileDialogdlg(TRUE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|AllFiles|*.*||",this); if(dlg.DoModal()==IDOK)dlg.GetFileName(); elsereturn; CStringstr; inti,j,m; CStdioFilefile; if(file.Open(dlg.GetFileName(),CFile::modeRead)==0) {AfxMessageBox("openerror!");return; } CArchivear(&file,CArchive::load); for(i=0;i<19;i++)for(j=0;j<19;j++){ar.ReadString(str);sscanf(str,"%d",&m);if(m==-1)wzq[i][j]=-1;if(m==0)wzq[i][j]=0;if(m==1)wzq[i][j]=1;}ar.ReadStrin
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度外賣配送服務(wù)承包合同(含食品安全)
- 2025年度個(gè)人獨(dú)院買賣合同(含租賃權(quán))協(xié)議書
- 課題申報(bào)參考:民族基層地區(qū)檢察聽(tīng)證實(shí)質(zhì)化改革路徑構(gòu)建研究
- 二零二五年度智能停車場(chǎng)租賃與維護(hù)一體化合同
- 2025年個(gè)人擔(dān)保居間合同標(biāo)準(zhǔn)實(shí)施范本2篇
- 二零二五年度女方違反離婚協(xié)議財(cái)產(chǎn)分割及房產(chǎn)過(guò)戶合同4篇
- 2025年度個(gè)人戶外裝備分期購(gòu)買合同
- 湖北省黃岡市重點(diǎn)中學(xué)高三上學(xué)期期末考試語(yǔ)文試題(含答案)
- 2025版美容院美容師團(tuán)隊(duì)建設(shè)聘用標(biāo)準(zhǔn)合同4篇
- 二零二五年度牧業(yè)產(chǎn)業(yè)扶貧項(xiàng)目承包合同范本3篇
- 橋本甲狀腺炎-90天治療方案
- 《量化交易之門》連載27:風(fēng)險(xiǎn)的角度談收益MAR和夏普比率
- (2024年)安全注射培訓(xùn)課件
- 2024版《建設(shè)工程開工、停工、復(fù)工安全管理臺(tái)賬表格(流程圖、申請(qǐng)表、報(bào)審表、考核表、通知單等)》模版
- 2024年廣州市高三一模普通高中畢業(yè)班高三綜合測(cè)試一 物理試卷(含答案)
- 部編版《道德與法治》六年級(jí)下冊(cè)教材分析萬(wàn)永霞
- 粘液腺肺癌病理報(bào)告
- 酒店人防管理制度
- 油田酸化工藝技術(shù)
- 上海高考英語(yǔ)詞匯手冊(cè)列表
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)五 其他內(nèi)容類型的生產(chǎn)
評(píng)論
0/150
提交評(píng)論