畢業(yè)論文設(shè)計-基于C++的掃雷游戲設(shè)計與實(shí)現(xiàn)38822_第1頁
畢業(yè)論文設(shè)計-基于C++的掃雷游戲設(shè)計與實(shí)現(xiàn)38822_第2頁
畢業(yè)論文設(shè)計-基于C++的掃雷游戲設(shè)計與實(shí)現(xiàn)38822_第3頁
畢業(yè)論文設(shè)計-基于C++的掃雷游戲設(shè)計與實(shí)現(xiàn)38822_第4頁
畢業(yè)論文設(shè)計-基于C++的掃雷游戲設(shè)計與實(shí)現(xiàn)38822_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、核準(zhǔn)通過,歸檔資料。未經(jīng)允許,請勿外傳!9JWKffwvG#tYM*Jg&6a*CZ7H$dq8KqqfHVZFedswSyXTy#&QA9wkxFyeQ!djs#XuyUP2kNXpRWXmA&UE9aQGn8xp$R#CBitmap bk;bk.LoadBitmap(IDB_BACK);memdc.CreateCompatibleDC(pDC); pDC-BitBlt(0,0,600,600,&memdc,0,0,SRCCOPY);主要是美化運(yùn)行界面,如下:接下來要繪制鼠標(biāo)操作區(qū)域,即游戲區(qū)域。添加繪制棋盤函數(shù)DrawChessBoard()如下:void CShaoLeiDlg:Draw

2、ChessBoard() CDC* pDC = GetDC();CPen pen(PS_SOLID,1,RGB(0,0,0);pDC-SelectObject(&pen);for (int i = 0; iMoveTo(x+cx*(i),y);pDC-LineTo(x+cx*(i),y+row*cy);for (int j = 0; jMoveTo(x,y+(j)*cy);pDC-LineTo(x+col*cx,y+(j)*cy);然后的運(yùn)行結(jié)果如下: 主界面控制菜單的設(shè)計接下來回到資源編程界面,編寫菜單資源,用來控制掃雷的過程,以及難度選定,和背景音樂等。(1) “設(shè)置菜單“包含:開始,初級

3、,中級,高級,音樂開,音樂關(guān),退出 其中,音樂開 包含 默認(rèn)的音樂和翻開本地音樂兩個子菜單項(xiàng)。(2)“幫助“菜單獲取該軟件的版本信息。如下:將菜單添加到主界面,至此主窗體根本創(chuàng)立完畢。掃雷游戲核心-布雷算法設(shè)計(1) 掃雷游戲是由很多相同大小的格子組成的,一般計算機(jī)中自帶的游戲格子規(guī)格為9*9,16*15和30*16第一個數(shù)字代表函數(shù),第二個數(shù)字代表列數(shù)。規(guī)格不同,需要埋的地雷數(shù)目就 不同,這就會涉及到隨機(jī)埋雷算法,最簡單的是一下兩種函數(shù)的結(jié)合: SKIPIF 1 0 void srand(unsigned int seed);/seed為隨機(jī)種子一般這樣使用該函數(shù):srand(unsigne

4、d) time(NULL);/即利用系統(tǒng)時間作為隨機(jī)種子,因?yàn)橄到y(tǒng)內(nèi)置的時鐘是在時刻變化的。然后使用如下函數(shù)產(chǎn)生隨機(jī)數(shù):int randvoid/可嘗試0,RAND_MAX之間的隨機(jī)整數(shù),RAND_MAX為十六進(jìn)制的0X7fff可進(jìn)行一些算術(shù)運(yùn)算,使之產(chǎn)生所需要的任意隨機(jī)數(shù)。(2) 掃雷游戲還要求在沒有雷的地方被點(diǎn)擊后就會顯示一個數(shù)字表示它周圍有幾個雷,這里分析實(shí)現(xiàn)這個功能的算法。把整個游戲區(qū)看成一個二維數(shù)組minefieldij: SKIPIF 1 0 SKIPIF 1 0 SKIPIF 1 0 要知道m(xù)inefield26周圍有幾個雷,只要去檢測如下8個網(wǎng)格是否有雷即可。minefield

5、15,minefield16,minefield17minefield25,minefield27minefield35,minefield36,minefield37將上面的8個網(wǎng)格的位置關(guān)系與minefield26進(jìn)行比擬,不難發(fā)現(xiàn)它們之間存在一定的數(shù)學(xué)關(guān)系,抽象看來就是:minefieldij周圍雷的個數(shù)是由如下8個位置處的雷的總合決定的。minefieldi-1j-1,minefieldi-1j,minefieldi-1j+1minefieldij-1,minefieldij+1minefieldi+1j-1,minefieldi+1j,minefieldi+1j+1上面幾個位置可能超

6、出了邊界,因此需要根據(jù)實(shí)際情況給變量i與j設(shè)置范圍。根據(jù)以上的分析,設(shè)計布雷算法的代碼,添加BuLei()函數(shù)用于隨機(jī)布雷。void BuLei()/隨機(jī)布雷 int k1,k2; srand( (unsigned)time( NULL ) ); for(int i=0;i=0)&(k2-1=0)&(m_NodeListk1-1k2-1.m_Type!=ncLEI)/左上方m_NodeListk1-1k2-1.m_Type=ncNUMBER; m_NodeListk1-1k2-1.m_Around+=1;if(k1-1=0)&m_NodeListk1-1k2.m_Type!=ncLEI)/上方

7、m_NodeListk1-1k2.m_Type=ncNUMBER; m_NodeListk1-1k2.m_Around+=1; if(k1-1=0)&(k2+1=0)&m_NodeListk1k2-1.m_Type!=ncLEI)/左方m_NodeListk1k2-1.m_Type=ncNUMBER; m_NodeListk1k2-1.m_Around+=1;if(k2+1col)&m_NodeListk1k2+1.m_Type!=ncLEI)/右方m_NodeListk1k2+1.m_Type=ncNUMBER; m_NodeListk1k2+1.m_Around+=1;if(k1+1=0)

8、&m_NodeListk1+1k2-1.m_Type!=ncLEI)/左下方m_NodeListk1+1k2-1.m_Type=ncNUMBER; m_NodeListk1+1k2-1.m_Around+=1; if(k1+1row)&m_NodeListk1+1k2.m_Type!=ncLEI)/下方m_NodeListk1+1k2.m_Type=ncNUMBER; m_NodeListk1+1k2.m_Around+=1;if(k1+1row)&(k2+1col)&m_NodeListk1+1k2+1.m_Type!=ncLEI)/右下方m_NodeListk1+1k2+1.m_Type=

9、ncNUMBER; m_NodeListk1+1k2+1.m_Around+=1; 當(dāng)然,還得添加繪圖代碼用來在游戲區(qū)域顯示隨機(jī)布置的雷和周邊情況,在OnPaint函數(shù)中添加如下代碼:void OnPaint()for(int i=0;irow;i+)for(int j=0;jBitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=1)memdc.SelectObject(&bmp_1); pDC-BitBlt(m

10、_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=2) memdc.SelectObject(&bmp_2); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=3) memdc.SelectObject(&bmp_3); pDC-

11、BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=4) memdc.SelectObject(&bmp_4); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=5) memdc.SelectObject(&bmp_

12、5); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=6) memdc.SelectObject(&bmp_6); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=7) memdc.SelectObje

13、ct(&bmp_7); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=8) memdc.SelectObject(&bmp_8); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);隨機(jī)布雷效果比擬如下:第一次運(yùn)行:第二次運(yùn)行:如上看來,隨機(jī)布雷成功。3.3 掃雷

14、鼠標(biāo)事件的處理(1) 首先,設(shè)計雷區(qū)和非雷區(qū)的判斷算法。掃雷時需要判斷每個格子的狀態(tài),可事先為格子設(shè)定一些狀態(tài),使之對應(yīng)不同的BOOL值或整數(shù)值。在二維、三維游戲里,有一種簡單的構(gòu)造地圖的方法,即將地圖劃分為m*n的規(guī)格格子,使每一個格子對應(yīng)二維數(shù)組中的一項(xiàng),當(dāng)鼠標(biāo)單擊時,通過找出鼠標(biāo)點(diǎn)擊區(qū)域,找到相應(yīng)的格子,判斷格子狀態(tài)來替換相應(yīng)的位圖。 具體算法思想如下: 在應(yīng)用程序的客戶區(qū)劃分一塊區(qū)域,將該區(qū)域劃分為n*m相同大小的格子;將每一個格子的狀態(tài)對應(yīng)到二維數(shù)組的相應(yīng)項(xiàng)上;當(dāng)鼠標(biāo)點(diǎn)擊某一塊區(qū)域時,首先判斷是否在各種區(qū)域,然后再通過鼠標(biāo)的坐標(biāo)找到相應(yīng)的格子;查詢格子的狀態(tài),從而調(diào)用相應(yīng)的位圖進(jìn)行位

15、圖替換;說明:Windows的消息響應(yīng)機(jī)制對于編寫一些小游戲是非常方便的,當(dāng)編寫大型2D或3D游戲時,Windows API 就顯得有些缺乏,此時應(yīng)使用DirectX或OpenGL等大型圖形庫來進(jìn)行設(shè)計及編碼。(2) 鼠標(biāo)左鍵事件的處理。分兩種情況:當(dāng)相應(yīng)區(qū)域不是雷區(qū)時,挖開區(qū)域,并且假設(shè)能據(jù)此判斷周圍區(qū)域也不是雷區(qū)那么將周圍相應(yīng)區(qū)域也挖開;當(dāng)區(qū)域是雷區(qū)時,那么界面中所有的雷區(qū)同時“炸開“:第一步先顯示一個提示框,第二部當(dāng)提示框關(guān)閉時,所有非雷區(qū)顯示出來。鼠標(biāo)在笑臉圖片上,單擊可以重新開始。(3) 對單擊鼠標(biāo)右鍵事件處理第一次用右鍵單擊某個區(qū)域時,改區(qū)域上插上一面小紅旗,此時單擊左鍵沒有任何變

16、化,第二次用右鍵單擊時恢復(fù)原狀。(4) 雙擊左鍵事件處理在展開的區(qū)域,并且已經(jīng)確定了周圍的雷數(shù),雙擊可以疊加展開非雷區(qū)域,以減少用戶的單擊操作。的核心編碼如下:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultint num;OnLei(point);OnNumber(point);OnBlank(point);num=0;for(int a=0;arow;a+) for(int b=0;b=row*col) m_Face=2; Invalid

17、ate(); MessageBox(你真聰明!,掃雷,MB_ICONWARNING|MB_OKCANCEL); CDialog:OnLButtonUp(nFlags, point);其中的OnLei(),OnNumber(),OnBlank()函數(shù)分別如下:void CShaoLeiDlg:OnLei(CPoint point)for (int i = 0 ;irow;i+)for (int j = 0; jcol;j+)tmp = m_NodeListij.m_Point;CRect rect(tmp.x-10,tmp.y-10,tmp.x+10,tmp.y+10);if (rect.PtI

18、nRect(point) if(m_NodeListij.m_IsUsed=TRUE&m_NodeListij.m_IsSign=FALSE)if(m_NodeListij.m_Type=ncLEI)for (int m = 0 ;mrow;m+) for (int n= 0; ncol;n+)if(m_NodeListmn.m_Type=ncLEI)m_NodeListmn.m_IsUsed=FALSE; m_NodeListmn.m_IsSign=FALSE;else if(m_NodeListmn.m_IsUsed=TRUE) m_NodeListmn.m_IsSign=TRUE; if

19、(m_NodeListmn.m_IsUsed=FALSE&m_NodeListmn.m_IsSign=TRUE) m_NodeListmn.m_IsUsed=TRUE;m_Face=1;Invalidate();BaoZha();MessageBox(你還差了點(diǎn),不服重來!,掃雷,MB_ICONWARNING|MB_OKCANCEL); void CShaoLeiDlg:OnNumber(CPoint point) CPoint tmp; for (int i = 0 ;irow;i+)for (int j = 0; jcol;j+)tmp = m_NodeListij.m_Point;CRe

20、ct rect(tmp.x-10,tmp.y-10,tmp.x+10,tmp.y+10);if (rect.PtInRect(point) if(m_NodeListij.m_IsUsed=TRUE&m_NodeListij.m_IsSign=FALSE)if(m_NodeListij.m_Type=ncNUMBER) m_NodeListij.m_IsUsed=FALSE; m_NodeListij.m_IsSign=FALSE; Invalidate();void CShaoLeiDlg:OnBlank(CPoint point)CPoint tmp;for (int i = 0 ;iro

21、w;i+)for (int j = 0; j=0)&(j-1=0)m_NodeListi-1j-1.m_IsUsed=FALSE;if(m_NodeListi-1j-1.m_Type=ncBLANK)if(i-1-1=0)&(j-1-1=0)&m_NodeListi-1-1j-1-1.m_Type!=ncLEI) m_NodeListi-1-1j-1-1.m_IsUsed=FALSE; if(j-1-1=0)&m_NodeListi-1j-1-1.m_Type!=ncLEI) m_NodeListi-1j-1-1.m_IsUsed=FALSE; if(i-1-1=0)&m_NodeListi-

22、1-1j-1.m_Type!=ncLEI) m_NodeListi-1-1j-1.m_IsUsed=FALSE;if(i-1-1=0)&m_NodeListi-1-1j.m_Type!=ncLEI) m_NodeListi-1-1j.m_IsUsed=FALSE; if(i-1=0) m_NodeListi-1j.m_IsUsed=FALSE;if(i-1=0)&(j+1=0)&m_NodeListi-1-1j+1.m_Type!=ncLEI) m_NodeListi-1-1j+1.m_IsUsed=FALSE; if(i-1-1=0)&(j+1+1col)&m_NodeListi-1-1j+

23、1+1.m_Type!=ncLEI) m_NodeListi-1-1j+1+1.m_IsUsed=FALSE; if(j+1+1col)&m_NodeListi-1j+1+1.m_Type!=ncLEI)m_NodeListi-1j+1+1.m_IsUsed=FALSE;if(j+1+1=0)m_NodeListij-1.m_IsUsed=FALSE;if(j+1col)m_NodeListij+1.m_IsUsed=FALSE;if(i+1=0) m_NodeListi+1j-1.m_IsUsed=FALSE;if(i+1+1row)&m_NodeListi+1j-1.m_Type!=ncL

24、EI) m_NodeListi+1j-1.m_IsUsed=FALSE; if(i+1+1=0)&m_NodeListi+1+1j-1-1.m_Type!=ncLEI)m_NodeListi+1+1j-1-1.m_IsUsed=FALSE;if(j-1-1=0)&m_NodeListi+1j-1-1.m_Type!=ncLEI)m_NodeListi+1j-1-1.m_IsUsed=FALSE;if(j-1-1=0)&m_NodeListij-1-1.m_Type!=ncLEI)m_NodeListij-1-1.m_IsUsed=FALSE;if(i+1row)m_NodeListi+1j.m

25、_IsUsed=FALSE;if(i+1row)&(j+1col)m_NodeListi+1j+1.m_IsUsed=FALSE;if(j+1+1col)&m_NodeListi+1j+1+1.m_Type!=ncLEI) m_NodeListi+1j+1+1.m_IsUsed=FALSE;if(i+1+1row)&(j+1+1col)&m_NodeListi+1+1j+1+1.m_Type!=ncLEI) m_NodeListi+1+1j+1+1.m_IsUsed=FALSE; if(i+1+1row)&m_NodeListi+1+1j+1.m_Type!=ncLEI) m_NodeList

26、i+1+1j+1.m_IsUsed=FALSE; if(i+1+1row)&m_NodeListi+1+1j.m_Type!=ncLEI) m_NodeListi+1+1j.m_IsUsed=FALSE; Invalidate();右鍵及雙擊左鍵處理代碼從略。 難度設(shè)置菜單消息處理菜單項(xiàng)中包含掃雷難度設(shè)置,如初級、中級、高級的菜單消息處理:初級設(shè)置如下:10行10列,雷數(shù)設(shè)置為20中級設(shè)置如下:15行15列,雷數(shù)設(shè)置為40高級設(shè)置如下:20行20列,雷數(shù)設(shè)置為60主要編碼如下:void CShaoLeiDlg:OnChuji() / TODO: Add your command handler

27、 code hererow=10;col=10;m_Num=20;InitializeNode();中級和高級代碼雷同,在此從略。 背景音樂菜單消息處理本次仿微軟的掃雷游戲中添加了一項(xiàng)新功能,即背景音樂,讓玩家在游戲放松的同時可以欣賞寧靜的音樂,徹底娛樂。1翻開默認(rèn)的背景音樂,包含Kiss The Rain,Snow Dream.2可以翻開本地音樂,滿足不同玩家的需求。主要代碼如下:void CShaoLeiDlg:OnMusic() / TODO: Add your command handler code here MCI_OPEN_PARMS mciOpenParms; mciSendC

28、ommand(m_mciDevID, MCI_CLOSE, 0, NULL); / mciOpenParms.lpstrDeviceType = waveaudio; mciOpenParms.lpstrDeviceType =MpegVideo; mciOpenParms.lpstrElementName =ressnowdream 雪夢.mp3; / 翻開指定的mciSendCommand(m_mciDevID, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpenParms);m_mciDevID = mciOpenPar

29、ms.wDeviceID;/ 設(shè)置MCI設(shè)備標(biāo)識MCI_PLAY_PARMS mciPlayParms;/ MCI_PLAY_PARMS結(jié)構(gòu)對象mciPlayParms.dwCallback = (long)GetSafeHwnd();/ 指定消息接受窗口句柄mciPlayParms.dwFrom = 0;/ 從頭開始播放mciSendCommand(m_mciDevID, MCI_PLAY, MCI_FROM , (DWORD)&mciPlayParms);/ 發(fā)送MCI_PLAY命令消息其它處理這里主要就是代碼的優(yōu)化以及其它界面美化的處理,代碼從略。由于本程序中包含了很多消息處理,難免出現(xiàn)

30、很多錯誤,不過在不懈努力之下,總是成功運(yùn)行:首先啟動程序:然后選擇“開始“或者高級“菜單:開始游戲,踩雷后:開始游戲,勝利后:其它音樂的演示勝利。5 掃雷游戲設(shè)計總結(jié)隨著掃雷游戲的開發(fā)完成,本游戲中預(yù)期的主要功能也根本實(shí)現(xiàn)。本系統(tǒng)以Visual C+ 6.0作為前臺開發(fā)工具,Visual C+ 6.0以簡單、易用等優(yōu)點(diǎn)成為開發(fā)本系統(tǒng)的首選工具。本論文闡述了掃雷游戲的分析與設(shè)計的全過程,并在論文中相應(yīng)的位置插入了圖片、流程圖以及一些具有技巧性的程序代碼,更加清晰的描述了該游戲是如何實(shí)現(xiàn)的。掃雷游戲是一款益智類游戲,該游戲與那些網(wǎng)絡(luò)游戲和3D游戲相比,它有編寫簡單容易上手等特點(diǎn),非常適合人們在完成工作的時候適當(dāng)?shù)膴蕵芬蟆_@些小游戲大都是以益智和娛樂為目的,不僅給緊張工作的人們以放松,還可以讓人們的大腦得到開發(fā)。由于我學(xué)習(xí)Vis

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論