![計算機圖形學課程設計——掃雷游戲程序設計_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/13/7df22716-5130-4392-a6fa-4c111b3b5c46/7df22716-5130-4392-a6fa-4c111b3b5c461.gif)
![計算機圖形學課程設計——掃雷游戲程序設計_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/13/7df22716-5130-4392-a6fa-4c111b3b5c46/7df22716-5130-4392-a6fa-4c111b3b5c462.gif)
![計算機圖形學課程設計——掃雷游戲程序設計_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/13/7df22716-5130-4392-a6fa-4c111b3b5c46/7df22716-5130-4392-a6fa-4c111b3b5c463.gif)
![計算機圖形學課程設計——掃雷游戲程序設計_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/13/7df22716-5130-4392-a6fa-4c111b3b5c46/7df22716-5130-4392-a6fa-4c111b3b5c464.gif)
![計算機圖形學課程設計——掃雷游戲程序設計_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/13/7df22716-5130-4392-a6fa-4c111b3b5c46/7df22716-5130-4392-a6fa-4c111b3b5c465.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算機圖形學課程設計報告VC+掃雷游戲的程序設計專業(yè)班級:小組成員: 指導老師:日 期:2012年12月24日1、需求分析本課程設計實現(xiàn)類似于Windows XP操作系統(tǒng)自帶的掃雷游戲。該設計以Visual C+ 6.0為開發(fā)環(huán)境, Windows 7/XP為程序運行平臺。在程序設計中,把整個雷區(qū)看成一個二維數(shù)組,把雷方塊定義為具有所在雷區(qū)二維數(shù)組的行和列、當前狀態(tài)、方塊屬性、歷史狀態(tài)的結構體,采用了MFC機制解決問題的方法。整個游戲程序包括了布雷、掃雷過程和結果三個階段,在處理鼠標響應事件中伴隨著GDI繪圖。程序通過調試運行,實現(xiàn)簡單的設計目標,滿足掃雷游戲初學者的需要。 通過本課程設計,以
2、便更好的鞏固計算機圖形學相關知識,掌握課程設計基本的方法和技巧,同時增加同學之間的團隊合作精神以及培養(yǎng)分析問題、解決問題的能力。2.總體設計2.1 功能概述掃雷游戲的游戲界面如圖1所示。在這個界面中,由眾多面積均等的小方塊所組成的區(qū)域稱之為雷區(qū),雷區(qū)的大小由用戶設置的游戲等級決定。玩家標定地雷周圍雷數(shù)提示未知雷區(qū)玩家標定未知雷圖1 游戲開始時,系統(tǒng)會在雷區(qū)中隨機布下若干個地雷。安放地雷的小方塊稱之為雷方塊,其他的稱之為非雷方塊。部署完畢后,系統(tǒng)會在其他非雷方塊中填充一些數(shù)字。某一個具體數(shù)字表示與其緊鄰的8個方塊中有多少雷方塊。玩家可以根據這些信息去判斷是否可以鼠標點擊方塊,并把認為是地雷的方塊
3、打上標識。當玩家將所有地雷找出后,其余的非雷方塊區(qū)域都已打開,此時游戲結束。在游戲過程中,一旦錯誤地打開了雷方塊則立即失敗,游戲結束。 游戲規(guī)則總結: 開始:按左鍵開始游戲,按按鈕或菜單重新開始。左鍵:按下時,是雷則結束,非雷則顯示數(shù)字。數(shù)字:代表此數(shù)字周圍一圈八格中雷的個數(shù)。右鍵:奇次按下表示雷,偶數(shù)按下表示對上次的否定。結束:左鍵按到雷結束,找出全部雷結束。在游戲開始后,雷區(qū)上方有兩個計數(shù)器。右邊的計數(shù)器顯示用戶掃雷所花費的總時間,以秒為單位;左邊的計數(shù)器顯示當前還剩余多少個雷方塊。2.2 設計流程圖開始初始化游戲繪制雷區(qū)繪制笑臉繪制計數(shù)器鼠標右鍵觸發(fā)動作鼠標左鍵觸發(fā)動作圖13.詳細設計3
4、.1界面設置在vc+運行環(huán)境下編寫程序并調試,最終實現(xiàn)的游戲界面為圖2所示,點擊鼠標可開始游戲。圖23.2功能設計3.2.1 布雷隨即獲取一個狀態(tài)為非雷的點,將它的屬性標志為雷,重復這樣的工作,直到布下足夠的雷為止,其流程圖如圖3所示。開始生成隨機的雷方塊的坐標(x,y)判斷(x,y)區(qū)域是否已經布下雷在(x,y)區(qū)域布雷,修改狀態(tài)數(shù)據判斷是否布下所有雷結束否是是否圖3在CMineWnd類中添加游戲的布雷模塊的處理函數(shù),其具體實現(xiàn)代碼如下所示。void CMineWnd:LayMines(UINT row, UINT col)/埋下隨機種子srand( (unsigned)time( NULL
5、 ) );UINT i, j;for(UINT index = 0; index < m_uMineNum;) /取隨即數(shù)i = rand() % m_uYNum;j = rand() % m_uXNum;if (i = row && j = col) continue;if(m_pMinesij.uAttrib != ATTRIB_MINE) m_pMinesij.uAttrib = ATTRIB_MINE;/修改屬性為雷 index+;3.2.2掃雷3.2.2.1鼠標左擊事件其流程如圖4所示。開始在雷區(qū)雷方塊定位游戲結束勝利失敗處理顯示結束繼續(xù)處理打開區(qū)域拓展最大的可
6、能顯示范圍其他區(qū)域處理勝利處理否是是否否圖4當鼠標左鍵點擊雷區(qū)域,并且該區(qū)域不是雷方塊,需要進行打開以及拓展工作。流程如圖5所示。開始獲取該區(qū)域周圍雷的數(shù)目numNum = 0拓展該區(qū)域修改標志,打開顯示該區(qū)域結束否是圖5鼠標左鍵點擊事件的關鍵代碼詳見附錄2所示。在函數(shù)體的開始部分,先用rcBtn和rcMineArea兩個矩形變量存儲游戲的用戶提示區(qū)域位置中的笑臉圖區(qū)域以及雷區(qū)域的位置。利用接口函數(shù)PtInRect()判斷當前鼠標的位置(由參數(shù)point攜帶鼠標當前位置信息)是否在這兩個區(qū)域內,如果檢測到鼠標左鍵點擊并釋放在笑臉圖的按鈕區(qū)域rcBtn上,則調用初始化函數(shù)重新開始游戲,如果檢測到
7、鼠標左鍵點擊并釋放在雷區(qū)域rcMineArea,假若當前游戲狀態(tài)處于已初始化完成但尚未開始的狀態(tài)GS_WAIT時,則打開計時器,并且調用LayMines()函數(shù)進行布雷,然后修改游戲狀態(tài)為GS_RUN進入游戲。接著判斷點擊在小方塊的狀態(tài)是否被用于通過右鍵標記(可以標記為雷或者未知,此時游戲規(guī)則規(guī)定左鍵點擊不生效),如果未標記,該狀態(tài)為普通狀態(tài)STATE_NORMAL時,先通過IsMine()檢測是否點中地雷而失敗地結束游戲,如果是,則調用函數(shù)Dead()來進行失敗后的工作處理,反之對它進行打開顯示與拓展操作。先通過GetAroundNum()函數(shù)獲取當前小方塊相鄰的8個位置的雷數(shù)。如果當前小方
8、塊相鄰區(qū)域的雷數(shù)為0,則可以向8個方向進行拓展,并顯示該方塊區(qū)域,直到不可拓展為止;如果當前小方塊相鄰區(qū)域的雷數(shù)不為0,則顯示該方塊區(qū)域的相鄰雷數(shù),用作提供用戶對其他位置的信息判斷的提示。拓展操作的實現(xiàn)代碼見附錄2。經過打開或拓展后,最后通過Victory()判斷游戲是否已經勝利結束,如果是則作勝利處理。3.2.1.2鼠標右擊事件其流程如圖6所示。開始雷方塊定位判斷歷史屬性以及相關狀態(tài)修改相關狀態(tài)顯示結束圖6其實現(xiàn)代碼詳見附錄3所示。3.2.3 繪圖界面的設計3.2.3.1雷區(qū)、笑臉模塊的繪制添加三個位圖資源如圖7所示。 圖7ID分別為ID_BTN_COLOR、ID_MINE_COLOR、ID
9、_NUM_COLOR,并分別添加三個位圖類型的變量,然后調用LoadBitmap(UINT nIDResource)函數(shù)來實現(xiàn)位圖資源與變量的關聯(lián)并添加函數(shù)DrawButton()、DrawMineArea()、DrawNumber()分別實現(xiàn)笑臉按鈕、雷區(qū)、數(shù)字圖像(計時器數(shù)字和剩余雷數(shù)數(shù)字)的繪圖。繪制雷區(qū)的函數(shù)DrawMineArea()的實現(xiàn)代碼見附錄4所示。繪制笑臉按鈕的函數(shù)實現(xiàn)類似。3.2.3.2數(shù)字模塊的繪制數(shù)字圖像的繪制不是由鼠標事件觸發(fā)的,而是由系統(tǒng)時間觸發(fā)的。首先在CMineWnd類中添加定時器標識的成員變量m_uTimer和一個記錄游戲開始直到目前所花費的時間的成員變量m
10、_uSpendTime。接著在游戲的開始函數(shù)布下時間種子,時間間隔為1000us,然后選擇到預定時間間隔后發(fā)送Windows命令消息函數(shù)WM_TIMER。接著在CMineWnd類中找到對應的消息WM_TIMER,并為其添加重寫函數(shù)OnTimer(),該函數(shù)首先判斷這次的WM_TIMER命令是否為所布下的時間種子到時而產生的,如果是則讓使用的時間變量m_uSpendTime自增,然后通知系統(tǒng)重繪圖像。數(shù)字圖像的繪制完成后,最終游戲界面顯示如圖8所示。圖8雷區(qū)、笑臉按鈕、3D效果外殼和數(shù)字圖像的繪制都是在OnPaint()函數(shù)中實現(xiàn)的。其函數(shù)代碼見附錄5所示。5 測試運行調試運行結果,直接點擊鼠標
11、左鍵開始游戲,踩中地雷是的界面顯示如圖9所示;圖9未踩中地雷并掃完所有的雷時的界面顯示如圖10所示。圖106 結論及分析隨著掃雷游戲的開發(fā)完成,本游戲中預期的主要功能也基本實現(xiàn)。本論文闡述了掃雷游戲的分析與設計的全過程,并在論文中相應的位置插入了圖片、流程圖以及一些具有技巧性的程序代碼,更加清晰的描述了該游戲是如何實現(xiàn)的。掃雷游戲是一款益智類游戲,該游戲與那些網絡游戲和3D游戲相比,它有編寫簡單容易上手等特點,非常適合人們在完成工作的時候適當?shù)膴蕵芬?。這些小游戲大都是以益智和娛樂為目的,不僅給緊張工作的人們以放松,還可以讓人們的大腦得到開發(fā)。通過這次課程設計收獲很多,尤其是加深了對計算機圖形
12、學知識和遞歸算法以及VC的理解,將課堂上所學的理論知識應用到了實際中。但是由于我們對Visual C+ 6.0的掌握程度不夠好,其中的很多知識還沒有理解,所以在課程設計過程中,遇到了很多問題,我們小組利用圖書館和網上查閱相關資料,以及周圍同學的幫助,最終大部分問題得到解決。設計所實現(xiàn)的功能是windows xp系統(tǒng)自帶掃雷游戲的簡化,相比之下,功能不夠齊全,比如聲音、用戶自定義以及玩家成績的排名等都未能實現(xiàn)。但是通過不斷上機實驗,調試程序,總結經驗,動手實踐能力和解決問題的能力有很大提高。希望在以后的工作和學習中不斷的充實自己的知識結構,把掃雷游戲的功能進一步完善,使它成為一個更具有實用價值的
13、游戲軟件。參考文獻1楊欽等.計算機圖形學.清華大學出版社,20052Ben Sawyer.游戲軟件設計與開發(fā)指南M.北京:人民郵電出版社,1998.8463陳志泊等.Visual C+程序設計. 中國鐵道出版社.2005.74欽科技.Visual C+游戲設計M. 北京:科海電子出版社,2003.12115楊正華等.Visual C+游戲編程導學M.北京:清華大學出版社,2003.206268附 錄附錄1:掃雷的處理函數(shù)/鼠標左鍵點擊事件代碼void CMineWnd:OnLButtonUp(UINT nFlags, CPoint point) /笑臉圖按鈕所在的區(qū)域CRect rcBtn(m
14、_uBtnRect1, 15, m_uBtnRect2, 39);/雷區(qū)所在的區(qū)域CRect rcMineArea(MINE_AREA_LEFT, MINE_AREA_TOP, MINE_AREA_LEFT + m_uXNum * MINE_WIDTH, MINE_AREA_TOP + m_uYNum * MINE_HEIGHT);if (rcBtn.PtInRect(point) / 點擊笑臉圖Invalidate();InitGame();else if (rcMineArea.PtInRect(point) /點擊雷區(qū)域CString value;UINT around = 0;/根據不
15、同的游戲狀態(tài)作處理switch(m_uGameState) /游戲進行狀態(tài)case GS_WAIT: case GS_RUN:/ first get the MINEWND which if pushing downm_pOldMine = GetMine(point.x, point.y);if (!m_pOldMine) ReleaseCapture(); return;/檢測判斷當前狀態(tài)是否為左鼠標同時按下if (m_bLRBtnDown) m_bLRBtnDown = FALSE;OnLRBtnUp(m_pOldMine->uRow, m_pOldMine->uCol);i
16、f (m_uGameState = GS_WAIT)m_uBtnState = BUTTON_NORMAL;Invalidate();ReleaseCapture();return;/假若周圍已經標識的雷周圍真正的雷數(shù),拓展if (m_pOldMine->uState != STATE_FLAG)OpenAround(m_pOldMine->uRow, m_pOldMine->uCol);if (ErrorAroundFlag(m_pOldMine->uRow, m_pOldMine->uCol)Dead(m_pOldMine->uRow, m_pOldMi
17、ne->uCol);ReleaseCapture();return;else /如果游戲尚未開始,點擊左鍵啟動游戲if (m_uGameState = GS_WAIT) if (m_uTimer)KillTimer(ID_TIMER_EVENT);m_uTimer = 0;m_uSpendTime = 1;Invalidate();if (m_bSoundful) sndPlaySound(LPCTSTR)LockResource(m_pSndClock), SND_MEMORY | SND_ASYNC | SND_NODEFAULT);/啟動定時器m_uTimer = SetTimer
18、(ID_TIMER_EVENT, 1000, NULL);/布雷LayMines(m_pOldMine->uRow, m_pOldMine->uCol);/改變游戲狀態(tài)為"運行/GS_RUN"m_uGameState = GS_RUN;if (m_pOldMine->uOldState = STATE_NORMAL)/當該雷區(qū)域為正常未作標記才打開/如果該區(qū)域為雷,則死亡if (IsMine(m_pOldMine->uRow, m_pOldMine->uCol) Dead(m_pOldMine->uRow, m_pOldMine->
19、uCol);ReleaseCapture();return;/不是雷的時候,獲取其周圍的雷數(shù)目around = GetAroundNum(m_pOldMine->uRow, m_pOldMine->uCol);/ 如果為空白區(qū)域,拓展,否則打開該區(qū)域(顯示周圍有多少雷數(shù))if (around = 0) ExpandMines(m_pOldMine->uRow, m_pOldMine->uCol);else DrawDownNum(m_pOldMine, around);else if (m_pOldMine->uOldState = STATE_DICEY) /標
20、志為“?”問號的時候m_pOldMine->uState = STATE_DICEY;/判斷是否為勝利if (Victory()Invalidate();ReleaseCapture();return;break;case GS_VICTORY:case GS_DEAD:ReleaseCapture();return;default :break;m_uBtnState = BUTTON_NORMAL;Invalidate();else /點擊非雷區(qū)域if (m_uGameState = GS_WAIT | m_uGameState = GS_RUN)m_uBtnState = BUTT
21、ON_NORMAL;InvalidateRect(rcBtn);ReleaseCapture();CWnd:OnLButtonUp(nFlags, point);/拓展操作的實現(xiàn)代碼void CMineWnd:ExpandMines(UINT row, UINT col)UINT i, j;UINT minRow = (row = 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col = 0) ? 0 : col - 1;UINT maxCol = col + 2;UINT around = GetAroundNum(row, co
22、l);/顯示該區(qū)域的方塊狀態(tài)m_pMinesrowcol.uState = 15 - around;m_pMinesrowcol.uOldState = 15 - around;/ “打開”該區(qū)域,重繪DrawSpecialMine(row, col);/對周圍一個雷都沒有的空白區(qū)域if (around = 0)for (i = minRow; i < maxRow; i+) for (j = minCol; j < maxCol; j+) /對于周圍可以拓展的區(qū)域進行的規(guī)拓展if (!(i = row && j = col) && m_pMines
23、ij.uState = STATE_NORMAL&& m_pMinesij.uAttrib != ATTRIB_MINE) if (!IsInMineArea(i, j) continue;ExpandMines(i, j);/ 遞歸拓展操作附錄2:鼠標右鍵點擊事件代碼void CMineWnd:OnRButtonDown(UINT nFlags, CPoint point) /笑臉圖按鈕所在的區(qū)域CRect rcBtn(m_uBtnRect1, 15, m_uBtnRect2, 39);/雷區(qū)所在的區(qū)域CRect rcMineArea(MINE_AREA_LEFT, MINE
24、_AREA_TOP, MINE_AREA_LEFT + m_uXNum * MINE_WIDTH, MINE_AREA_TOP + m_uYNum * MINE_HEIGHT);m_bLRBtnDown = FALSE;if (rcMineArea.PtInRect(point) /點擊雷區(qū)域if (m_uGameState = GS_WAIT | m_uGameState = GS_RUN) m_pNewMine = GetMine(point.x, point.y);if (!m_pNewMine) return;/檢測判斷當前狀態(tài)是否為左右鼠標同時按下if (nFlags = (MK_L
25、BUTTON | MK_RBUTTON)m_bLRBtnDown = TRUE; OnLRBtnDown(m_pNewMine->uRow, m_pNewMine->uCol);elseswitch(m_pNewMine->uState) /普通狀態(tài)case STATE_NORMAL:m_pNewMine->uState = STATE_FLAG;m_pNewMine->uOldState = STATE_FLAG;m_nLeaveNum-;break;/標記狀態(tài)case STATE_FLAG:m_pNewMine->uState = STATE_DICEY
26、;m_pNewMine->uOldState = STATE_DICEY;m_nLeaveNum+;break;/未知狀態(tài)case STATE_DICEY:m_pNewMine->uState = STATE_NORMAL;m_pNewMine->uOldState = STATE_NORMAL;break;default: break;Invalidate();CWnd:OnRButtonDown(nFlags, point);附錄3:繪制雷區(qū)的函數(shù)代碼void CMineWnd:DrawMineArea(CPaintDC &dc)CDC dcMemory; /用作內存設備 /源設備dcMemory.CreateCompatibleDC(&dc); /使得這個設備與dc兼容 /dc是目標設備dcMemory.SelectObject(m_bmpMine); /將內存設備與位圖資源關聯(lián)for (UINT i = 0; i<m_uYNum; i+) for (UINT j = 0; j<m_uXNum; j+) /根據ij區(qū)域的雷方塊狀態(tài)拷貝相應的圖像到ij雷區(qū)的特定區(qū)域dc.Stretch
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年手持喇叭項目可行性研究報告
- 2025至2030年靜電平拖項目投資價值分析報告
- 2025至2030年素色毯項目投資價值分析報告
- 2025至2030年低應力鋼印項目投資價值分析報告
- 二零二五年度多功能高空作業(yè)升降機定制購買合同3篇
- 二零二五年度破碎機生產線自動化升級合同4篇
- 2025年全球及中國輕工業(yè)平板電腦行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 化工原料安全運輸合同模板
- 邊防工程土方運輸協(xié)議范本
- 精密儀器用水配送合同
- 2024年西藏中考物理模擬試題及參考答案
- 九型人格與領導力講義
- 藥品經營和使用質量監(jiān)督管理辦法培訓試題及答案2023年9月27日國家市場監(jiān)督管理總局令第84號公布
- 人教版五年級上冊數(shù)學脫式計算練習200題及答案
- 卵巢黃體囊腫破裂教學查房
- 醫(yī)院定崗定編
- 計算機網絡畢業(yè)論文3000字
- 2023年大學物理化學實驗報告化學電池溫度系數(shù)的測定
- 腦出血的護理課件腦出血護理查房PPT
- 煤礦機電運輸安全培訓課件
- 扣繳個人所得稅報告表-(Excel版)
評論
0/150
提交評論