C++課程設(shè)計(jì)-五子棋_第1頁(yè)
C++課程設(shè)計(jì)-五子棋_第2頁(yè)
C++課程設(shè)計(jì)-五子棋_第3頁(yè)
C++課程設(shè)計(jì)-五子棋_第4頁(yè)
C++課程設(shè)計(jì)-五子棋_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì) 五子棋學(xué)號(hào):201201051738學(xué)院:信息科學(xué)與工程學(xué)院班級(jí):網(wǎng)絡(luò)工程2班指導(dǎo)老師:學(xué)生姓名:日期:2013 年 06 月 24 日C+課程設(shè)計(jì)五子棋功能描述設(shè)計(jì)一個(gè)五子棋游戲,實(shí)現(xiàn)雙人對(duì)戰(zhàn),通過鼠標(biāo)進(jìn)行操作,具有悔棋功能,可以多次進(jìn)行游戲,界面美觀,有音效。重要的是按鍵進(jìn)行彈窗提醒,由用戶進(jìn)行確認(rèn)。概要設(shè)計(jì)窗口注冊(cè):向系統(tǒng)注冊(cè)窗口。建立窗口:初始化并建立窗口。處理消息:等待消息傳入,調(diào)用處理函數(shù)。POINT_類:記錄一個(gè)點(diǎn)及其處理函數(shù),包括點(diǎn)的位置規(guī)范化函數(shù)。Chess類:記錄棋子相關(guān)信息及其處理函數(shù),包括落子,起子函數(shù)。GameGolbal類:記錄一個(gè)五子棋

2、游戲的整體信息及其處理函數(shù),包括定義了POINT_類,Chess類的成員,及一些游戲中會(huì)用到的整體變量。主要函數(shù)包括如下:窗口刷新函數(shù):通過儲(chǔ)存的數(shù)據(jù)重新繪制窗口。新游戲函數(shù):對(duì)游戲的變量進(jìn)行初始化的處理?;谄搴瘮?shù):對(duì)儲(chǔ)存數(shù)據(jù)修改,達(dá)到悔棋的目的,會(huì)調(diào)用窗口刷新函數(shù)。聲音播放函數(shù):播放效果聲音。結(jié)果判斷函數(shù):每次落子后判斷結(jié)果。結(jié)果顯示函數(shù):繪制游戲勝利的結(jié)果。程序運(yùn)行流程及函數(shù)調(diào)用關(guān)系如下:注冊(cè)窗口建立窗口等待信息窗口菜單命令WM_COMMAND鼠標(biāo)左單擊WM_LBUTTONDOWN判斷勝負(fù)關(guān)于IDM_ABOUT悔棋ID_BACK退出IDM_EXIT新的一局ID_NEW判斷并累加操作的棋子數(shù)

3、據(jù)初始化修改數(shù)據(jù)窗口刷新標(biāo)準(zhǔn)化并記錄坐標(biāo)判斷是否棋子覆蓋繪制棋子判斷勝負(fù)調(diào)用聲音函數(shù)顯示結(jié)果詳細(xì)設(shè)計(jì)窗口注冊(cè):聲明窗口結(jié)構(gòu)與類別,對(duì)窗口的信息進(jìn)行描述建立窗口:通過窗口的描述,初始化窗口,顯示窗口。處理消息:等待消息傳入,調(diào)用處理函數(shù)處理信息。POINT_類:儲(chǔ)存棋子在棋盤上的位置,其中的void STAND(int X,int Y)函數(shù)負(fù)責(zé)將輸入的點(diǎn)規(guī)范為棋盤格上對(duì)應(yīng)位置。Chess類:棋子類儲(chǔ)存棋子信息,包括棋子顏色,陰線陽(yáng)線上的棋子個(gè)數(shù),同時(shí)其中包含落子函數(shù),起子函數(shù)來對(duì)相應(yīng)的數(shù)據(jù)進(jìn)行操作。落子函數(shù)除了對(duì)數(shù)據(jù)進(jìn)行記錄之外,還負(fù)責(zé)棋子的繪制,繪制棋子時(shí),主要是加載棋子貼圖,由于為了使棋子落

4、在邊緣時(shí)不會(huì)遮擋棋盤邊緣的紋理,所以對(duì)貼圖邊緣要進(jìn)行透明化處理,應(yīng)用的是簡(jiǎn)單的圖形運(yùn)算,通過異或處理,使圖片與背景貼合。最后悔棋函數(shù)用棋子類建立一個(gè)二維矩陣,其橫縱坐標(biāo)與棋盤上的位置對(duì)應(yīng)。GameGolbal類:記錄一個(gè)五子棋游戲的整體信息及其處理函數(shù),包括定義了POINT_類,Chess類的成員,及一些游戲中會(huì)用到的整體變量。主要函數(shù)包括如下:窗口刷新函數(shù):通過儲(chǔ)存的數(shù)據(jù)繪制窗口,屏幕刷新時(shí)調(diào)用,或者主動(dòng)調(diào)用,比如開始新的一局,悔棋時(shí)。新游戲函數(shù):對(duì)游戲的變量進(jìn)行初始化的處理,之后調(diào)用窗口刷新函數(shù)?;谄搴瘮?shù):對(duì)儲(chǔ)存數(shù)據(jù)修改,將棋盤矩陣的相應(yīng)縱坐標(biāo)減一,同時(shí)調(diào)用棋子類二維數(shù)組中對(duì)應(yīng)的元素起子函

5、數(shù)。之后調(diào)用窗口刷新函數(shù),棋子會(huì)在棋盤上消失。聲音播放函數(shù):主要是產(chǎn)生落子聲音和勝利的聲音,播放聲音函數(shù)將完成建立DirectSound對(duì)象,創(chuàng)建緩存區(qū),設(shè)置文件格式,讀取文件,播放聲音,清空緩存區(qū)等一系列操作,完成聲音的播放。結(jié)果判斷函數(shù):每次落子后調(diào)用,通過判斷相鄰的陰線,陽(yáng)線上是否存在5個(gè)連續(xù)的同色棋子,判斷是否一方已勝利,若存在勝利的一方,返回的結(jié)果是勝利的一方的整形數(shù)據(jù)代號(hào),否則返回的是無(wú)關(guān)整形數(shù)據(jù)。結(jié)果顯示函數(shù):繪制游戲勝利的結(jié)果,加載貼圖。彈窗:彈窗的目的主要是對(duì)讓用戶先前做出的行為進(jìn)行確認(rèn),通過調(diào)用系統(tǒng)的int MessageBox(HWND hWnd,LPCTSTR lpTe

6、xt,LPCTSTRlpCaption,UINT uType)函數(shù),彈出一個(gè)窗口,由用戶對(duì)輸入消息確認(rèn),通過返回值獲取用戶結(jié)果,進(jìn)行相應(yīng)的操作。效果及存在問題 效果圖如下:進(jìn)入后界面 落子效果 悔棋后 結(jié)果顯示 選項(xiàng)菜單 幫助菜單 彈窗提示 關(guān)于窗口不足之處不能進(jìn)行存檔,學(xué)習(xí)文件流之后可以進(jìn)一步改進(jìn)。不能進(jìn)行人機(jī)對(duì)戰(zhàn),這屬于策略型游戲AI,我本身對(duì)五子棋不是很擅長(zhǎng),確實(shí)有一定難度,這方面有時(shí)間可以參考相關(guān)資料的算法進(jìn)行改進(jìn)。彈出的窗口比較簡(jiǎn)單,只是調(diào)用了MessageBox命令,而已,對(duì)API窗口的建立和調(diào)用以及其他資源文件的加載還是不夠了解。因?yàn)楸境绦虿恍枰淖兇翱诖笮?,游戲全屏后部分地方?/p>

7、白色,改變之后反而有可能會(huì)影響美觀,因此可以去掉最大化窗口和改變窗口大小的功能, 但我對(duì)窗口的建立不是很熟悉,因此暫時(shí)還沒有去掉。心得體會(huì)通過對(duì)這個(gè)五子棋程序的編寫,我在一定的程度上對(duì)的可視化編程有了一定的了解,對(duì)下程序運(yùn)行流程有了簡(jiǎn)單的認(rèn)識(shí),修正了一些以前對(duì)程序運(yùn)行的錯(cuò)誤觀念。在編程的過程中,我認(rèn)識(shí)到編程前對(duì)程序整體結(jié)構(gòu)的分析,對(duì)各個(gè)部分的聯(lián)系的把握的重要性,否則在編程中就會(huì)產(chǎn)生混亂,耽誤時(shí)間。同時(shí),編程一定要仔細(xì),在關(guān)鍵的地方或者有疑惑的地方寫下備注,以備以后查看或者修改,一個(gè)小小的錯(cuò)誤就要花上大量的時(shí)間去尋找,這是很不值得的。雖然這個(gè)程序?qū)︻惖膽?yīng)用不是很多,但是仍然可以看到類的應(yīng)用使程序

8、的編寫更加的方便,增加了程序的可移植性。同時(shí)系統(tǒng)自定義的一些類的熟練運(yùn)用無(wú)疑會(huì)極大地提高編程速度。附錄窗口的注冊(cè),初始化,以及消息獲取與循環(huán)函數(shù)有系統(tǒng)自動(dòng)生成,在此不再顯示。POINT_類:class POINT_public:int x,y;public:POINT_()x=0;y=0;POINT_(int x_,int y_)x=x_;y=y_;POINT_ ()void STAND(int X,int Y)int dis=36,x_=17,y_=18;x=X+(dis+3)/2-x_;y=Y+dis/2-y_;x=x/(dis+3)*(dis+3)+x_;y=y/dis*dis+y_;C

9、hess類:class Chessprivate:int NS,WE,WN,EN,color;friend class GameGlobal;public:Chess()NS=0;WE=0;WN=0;EN=0;color=2;Chess ()void down( int c ,HWND hWnd,POINT_ p)HDC hdc,mdc;HBITMAP dra;int X=p.x,Y=p.y;NS=1;WE=1;WN=1;EN=1;color=c;hdc = GetDC(hWnd);mdc = CreateCompatibleDC (hdc);if(c = 0)/黑子dra = (HBITMA

10、P) LoadImage (NULL,drabchess.bmp,IMAGE_BITMAP,72,36,LR_LOADFROMFILE) ;else/白子dra = (HBITMAP) LoadImage (NULL,drawchess.bmp,IMAGE_BITMAP,72,36,LR_LOADFROMFILE) ;SelectObject (mdc,dra);BitBlt (hdc,X-18,Y-18,36,36,mdc,36,0,SRCAND);BitBlt (hdc,X-18,Y-18,36,36,mdc,0,0,SRCPAINT);ReleaseDC (hWnd,hdc);void

11、up ()NS=0;WE=0;WN=0;EN=0;color=2;int showcolor ()return color;GameGlobal類:class GameGlobalprivate:HWND hWnd;HDC mdc,hdc;int color;/顏色int winer;int ax_i,ax_j;/二維矩陣參數(shù)HBITMAP hbmp,dra;POINT_ circle216*16/2;Chess chess1616;/棋子類,儲(chǔ)存棋子周圍信息及其顏色public:GameGlobal()color=0;ax_i=0;ax_j=0;winer = 2;GameGlobal(HW

12、ND h) hWnd = h;GameGlobal()void getHWND(HWND h)hWnd = h;int getwiner()return winer;void changewiner(int w)winer = w;void back();int downchess(int L,int H);BOOL Result(int x,int y);void ShowResult (int winer);void MyPaint ();void newgame();void PlaySound (int song);/結(jié)果判斷函數(shù)int GameGlobal:Result(int x,

13、int y)int c,n=15;c=chessxy.showcolor();int re;for (re=1;x-re=0;re+)/判斷橫向if (chessx-rey.WE=0|chessx-rey.color!=c)break;elsechessxy.WE+;for (re=1;x+re=0;re+)/判斷縱向if (chessxy-re.NS=0|chessxy-re.color!=c)break;elsechessxy.NS+;for (re=1;y+re=0&y-re=0;re+)/判斷西北if (chessx-rey-re.WN=0|chessx-rey-re.color!=c

14、)break;elsechessxy.WN+;for (re=1;x+ren&y+re=0&y+ren;re+)/判斷東北if (chessx-rey+re.EN=0|chessx-rey+re.color!=c)break;elsechessxy.EN+;for (re=1;x+re=0;re+)if (chessx+rey-re.EN=0|chessx+rey-re.color!=c)break;elsechessxy.EN+;if (chessxy.NS4|chessxy.WE4|chessxy.WN4|chessxy.EN4)return c;elsereturn 2; /窗口刷新函數(shù)

15、void GameGlobal:MyPaint () hdc = GetDC (hWnd);mdc = CreateCompatibleDC (hdc);if (winer != 2)if (winer=1)hbmp=(HBITMAP)LoadImage(NULL,whbmp.bmp,IMAGE_BITMAP,600,550,LR_LOADFROMFILE) ;elsehbmp=(HBITMAP)LoadImage(NULL,bhbmp.bmp,IMAGE_BITMAP,600,550,LR_LOADFROMFILE) ;SelectObject (mdc,hbmp);BitBlt (hdc,

16、0,0,600,550,mdc,0,0,SRCCOPY);ReleaseDC (hWnd,hdc);elseint i;hbmp=(HBITMAP)LoadImage(NULL,hbmp.bmp,IMAGE_BITMAP,585,543,LR_LOADFROMFILE) ;SelectObject (mdc,hbmp);BitBlt (hdc,0,0,600,600,mdc,0,0,SRCCOPY);dra=(HBITMAP)LoadImage(NULL,drawchess.bmp,IMAGE_BITMAP,72,36,LR_LOADFROMFILE) ;SelectObject (mdc,d

17、ra);for (i=0;iax_i;i+)BitBlt (hdc,circle1i.x-18,circle1i.y-18,36,36,mdc,36,0,SRCAND);BitBlt (hdc,circle1i.x-18,circle1i.y-18,36,36,mdc,0,0,SRCPAINT);dra=(HBITMAP)LoadImage(NULL,drabchess.bmp,IMAGE_BITMAP,72,36,LR_LOADFROMFILE) ;SelectObject (mdc,dra);for (i=0;iax_j;i+)BitBlt (hdc,circle0i.x-18,circl

18、e0i.y-18,36,36,mdc,36,0,SRCAND);BitBlt (hdc,circle0i.x-18,circle0i.y-18,36,36,mdc,0,0,SRCPAINT);ReleaseDC (hWnd,hdc);/結(jié)果顯示函數(shù)void GameGlobal:ShowResult (int winer)hdc = GetDC(hWnd);mdc = CreateCompatibleDC (hdc);if (winer=1)hbmp=(HBITMAP)LoadImage(NULL,whbmp.bmp,IMAGE_BITMAP,600,550,LR_LOADFROMFILE)

19、;elsehbmp=(HBITMAP)LoadImage(NULL,bhbmp.bmp,IMAGE_BITMAP,600,550,LR_LOADFROMFILE) ;SelectObject (mdc,hbmp);BitBlt (hdc,0,0,600,550,mdc,0,0,SRCCOPY);ReleaseDC (hWnd,hdc);/重新開始函數(shù)void GameGlobal:newgame ()for (int i=0;i16;i+)for (int j=0;j 0)color = 1;ax_i = ax_i - 1;x = (circle colorax_i.x-O.x)/(dis+3

20、);/對(duì)應(yīng)的棋子類二維數(shù)組的中成員y = (circle colorax_i.y-O.y)/dis;elseif (ax_j 0)color = 0;ax_j = ax_j - 1;x = (circle colorax_j.x-O.x)/(dis+3);/對(duì)應(yīng)的棋子類二維數(shù)組的中成員y = (circle colorax_j.y-O.y)/dis;chessxy.up();Game.MyPaint ();/播放聲音void GameGlobal:PlaySound (int song)LPDIRECTSOUND pDS; HRESULT result;LPDIRECTSOUNDBUFFER

21、pPBuf; DSBUFFERDESC dsdesc; WAVEFORMATEX pwfmt; WAVEFORMATEX swfmt; MMCKINFO ckRiff; MMCKINFO ckInfo; MMRESULT mmresult;HMMIO hmmio;DWORD size; LPDIRECTSOUNDBUFFER pSBuf; LPVOID pAudio;DWORD bytesAudio;result = DirectSoundCreate( NULL, &pDS, NULL ); /建立 DirectSound if(result != DS_OK)MessageBox(NULL

22、,建立 DirectSound 對(duì)象失敗!,MB_OK); result = pDS-SetCooperativeLevel( hWnd, DSSCL_PRIORITY );if(result != DS_OK)MessageBox(NULL,設(shè)定協(xié)調(diào)層級(jí)失敗!,MB_OK); memset( &dsdesc,0, sizeof(dsdesc) ); dsdesc.dwSize = sizeof(dsdesc); dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; dsdesc.dwBufferBytes = 0; dsdesc.lpwfxFormat = NULL

23、; result = pDS-CreateSoundBuffer( &dsdesc, &pPBuf, NULL );if(result != DS_OK)MessageBox(NULL,建立主緩存區(qū)失敗!,MB_OK); memset( &pwfmt,0, sizeof(pwfmt) ); pwfmt.wFormatTag = WAVE_FORMAT_PCM; pwfmt.nChannels = 2; pwfmt.nSamplesPerSec = 44100; pwfmt.wBitsPerSample = 16; /位元 pwfmt.nBlockAlign = pwfmt.wBitsPerSa

24、mple / 8 * pwfmt.nChannels; pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign; result = pPBuf-SetFormat(&pwfmt); /設(shè)定播放格式if(result != DS_OK)MessageBox(NULL,設(shè)定播放格式失敗!,MB_OK);if (song = 1)hmmio = mmioOpen(1.wav, NULL, MMIO_ALLOCBUF|MMIO_READ );/文件名稱elsehmmio = mmioOpen(2.wav, NULL, MMIO_

25、ALLOCBUF|MMIO_READ );/開啟文件if(hmmio = NULL) /判斷是否為空MessageBox(NULL,檔案不存在!,MB_OK);ckRiff.fccType = mmioFOURCC(W, A, V, E);/設(shè)定檔案類型mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);/if(mmresult != MMSYSERR_NOERROR)MessageBox(NULL,檔案格式錯(cuò)誤!,MB_OK);ckInfo.ckid = mmioFOURCC(f,m,t, ); mmresult = mmioDe

26、scend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);/if(mmresult != MMSYSERR_NOERROR)MessageBox(NULL,檔案格式錯(cuò)誤!,MB_OK);if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt) = -1) /讀取檔案格式MessageBox(NULL,讀取格式失敗!,MB_OK);mmresult = mmioAscend(hmmio,&ckInfo,0); ckInfo.ckid = mmioFOURCC(d,a,t,a); mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDC

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論