版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《計(jì)算機(jī)圖形學(xué)》課程設(shè)計(jì)報(bào)告</p><p> VC++掃雷游戲的程序設(shè)計(jì)</p><p><b> 專業(yè)班級:</b></p><p><b> 小組成員:</b></p><p><b> 指導(dǎo)老師:</b></p><p&
2、gt; 日 期:2012年12月24日</p><p><b> 1、需求分析</b></p><p> 本課程設(shè)計(jì)實(shí)現(xiàn)類似于Windows XP操作系統(tǒng)自帶的掃雷游戲。該設(shè)計(jì)以Visual C++ 6.0為開發(fā)環(huán)境, Windows 7/XP為程序運(yùn)行平臺。在程序設(shè)計(jì)中,把整個雷區(qū)看成一個二維數(shù)組,把雷方塊定義為具有所在雷區(qū)二維數(shù)組的行和列、當(dāng)前狀態(tài)、方
3、塊屬性、歷史狀態(tài)的結(jié)構(gòu)體,采用了MFC機(jī)制解決問題的方法。整個游戲程序包括了布雷、掃雷過程和結(jié)果三個階段,在處理鼠標(biāo)響應(yīng)事件中伴隨著GDI繪圖。程序通過調(diào)試運(yùn)行,實(shí)現(xiàn)簡單的設(shè)計(jì)目標(biāo),滿足掃雷游戲初學(xué)者的需要。</p><p> 通過本課程設(shè)計(jì),以便更好的鞏固計(jì)算機(jī)圖形學(xué)相關(guān)知識,掌握課程設(shè)計(jì)基本的方法和技巧,同時增加同學(xué)之間的團(tuán)隊(duì)合作精神以及培養(yǎng)分析問題、解決問題的能力。</p><p>
4、;<b> 2.總體設(shè)計(jì)</b></p><p><b> 2.1 功能概述</b></p><p> 掃雷游戲的游戲界面如圖1所示。在這個界面中,由眾多面積均等的小方塊所組成的區(qū)域稱之為雷區(qū),雷區(qū)的大小由用戶設(shè)置的游戲等級決定。</p><p><b> 圖1 </b></p>
5、<p> 游戲開始時,系統(tǒng)會在雷區(qū)中隨機(jī)布下若干個地雷。安放地雷的小方塊稱之為雷方塊,其他的稱之為非雷方塊。部署完畢后,系統(tǒng)會在其他非雷方塊中填充一些數(shù)字。某一個具體數(shù)字表示與其緊鄰的8個方塊中有多少雷方塊。玩家可以根據(jù)這些信息去判斷是否可以鼠標(biāo)點(diǎn)擊方塊,并把認(rèn)為是地雷的方塊打上標(biāo)識。當(dāng)玩家將所有地雷找出后,其余的非雷方塊區(qū)域都已打開,此時游戲結(jié)束。在游戲過程中,一旦錯誤地打開了雷方塊則立即失敗,游戲結(jié)束。 </p&
6、gt;<p><b> 游戲規(guī)則總結(jié):</b></p><p> ● 開始:按左鍵開始游戲,按按鈕或菜單重新開始。</p><p> ●左鍵:按下時,是雷則結(jié)束,非雷則顯示數(shù)字。</p><p> ●數(shù)字:代表此數(shù)字周圍一圈八格中雷的個數(shù)。</p><p> ●右鍵:奇次按下表示雷,偶數(shù)按
7、下表示對上次的否定。</p><p> ●結(jié)束:左鍵按到雷結(jié)束,找出全部雷結(jié)束。</p><p> 在游戲開始后,雷區(qū)上方有兩個計(jì)數(shù)器。右邊的計(jì)數(shù)器顯示用戶掃雷所花費(fèi)的總時間,以秒為單位;左邊的計(jì)數(shù)器顯示當(dāng)前還剩余多少個雷方塊。</p><p><b> 2.2 設(shè)計(jì)流程圖</b></p><p><b&g
8、t; 圖1</b></p><p><b> 3.詳細(xì)設(shè)計(jì)</b></p><p><b> 3.1界面設(shè)置</b></p><p> 在vc++運(yùn)行環(huán)境下編寫程序并調(diào)試,最終實(shí)現(xiàn)的游戲界面為圖2所示,點(diǎn)擊鼠標(biāo)可開始游戲。</p><p><b> 圖2</b&
9、gt;</p><p><b> 3.2功能設(shè)計(jì)</b></p><p><b> 3.2.1 布雷</b></p><p> 隨即獲取一個狀態(tài)為非雷的點(diǎn),將它的屬性標(biāo)志為雷,重復(fù)這樣的工作,直到布下足夠的雷為止,其流程圖如圖3所示。</p><p><b> 圖3</b&g
10、t;</p><p> 在CMineWnd類中添加游戲的布雷模塊的處理函數(shù),其具體實(shí)現(xiàn)代碼如下所示。</p><p> void CMineWnd::LayMines(UINT row, UINT col)</p><p><b> {</b></p><p><b> //埋下隨機(jī)種子</b&g
11、t;</p><p> srand( (unsigned)time( NULL ) );</p><p> UINT i, j;</p><p> for(UINT index = 0; index < m_uMineNum;) </p><p><b> {</b></p><p&g
12、t;<b> //取隨即數(shù)</b></p><p> i = rand() % m_uYNum;</p><p> j = rand() % m_uXNum;</p><p> if (i == row && j == col) continue;</p><p> if(m_pMines[i]
13、[j].uAttrib != ATTRIB_MINE) </p><p> {m_pMines[i][j].uAttrib = ATTRIB_MINE;//修改屬性為雷</p><p> index++;}</p><p><b> }</b></p><p><b> }</b>
14、</p><p><b> 3.2.2掃雷</b></p><p> 3.2.2.1鼠標(biāo)左擊事件</p><p><b> 其流程如圖4所示。</b></p><p><b> 圖4</b></p><p> 當(dāng)鼠標(biāo)左鍵點(diǎn)擊雷區(qū)域,并且該區(qū)域不
15、是雷方塊,需要進(jìn)行打開以及拓展工作。流程如圖5所示。</p><p><b> 圖5</b></p><p> 鼠標(biāo)左鍵點(diǎn)擊事件的關(guān)鍵代碼詳見附錄2所示。</p><p> 在函數(shù)體的開始部分,先用rcBtn和rcMineArea兩個矩形變量存儲游戲的用戶提示區(qū)域位置中的笑臉圖區(qū)域以及雷區(qū)域的位置。利用接口函數(shù)PtInRect()判斷當(dāng)前
16、鼠標(biāo)的位置(由參數(shù)point攜帶鼠標(biāo)當(dāng)前位置信息)是否在這兩個區(qū)域內(nèi),如果檢測到鼠標(biāo)左鍵點(diǎn)擊并釋放在笑臉圖的按鈕區(qū)域rcBtn上,則調(diào)用初始化函數(shù)重新開始游戲,如果檢測到鼠標(biāo)左鍵點(diǎn)擊并釋放在雷區(qū)域rcMineArea,假若當(dāng)前游戲狀態(tài)處于已初始化完成但尚未開始的狀態(tài)GS_WAIT時,則打開計(jì)時器,并且調(diào)用LayMines()函數(shù)進(jìn)行布雷,然后修改游戲狀態(tài)為GS_RUN進(jìn)入游戲。接著判斷點(diǎn)擊在小方塊的狀態(tài)是否被用于通過右鍵標(biāo)記(可以標(biāo)記為
17、雷或者未知,此時游戲規(guī)則規(guī)定左鍵點(diǎn)擊不生效),如果未標(biāo)記,該狀態(tài)為普通狀態(tài)STATE_NORMAL時,先通過IsMine()檢測是否點(diǎn)中地雷而失敗地結(jié)束游戲,如果是,則調(diào)用函數(shù)Dead()來進(jìn)行失敗后的工作處理,反之對它進(jìn)行打開顯示與拓展操作。先通過GetAroundNum()函數(shù)獲取當(dāng)前小方塊相鄰的8個位置的雷數(shù)。如果當(dāng)前小方塊相鄰區(qū)域的雷數(shù)為0,則可以向8個方向進(jìn)行拓展,并顯示該方塊區(qū)域</p><p>
18、經(jīng)過打開或拓展后,最后通過Victory()判斷游戲是否已經(jīng)勝利結(jié)束,如果是則作勝利處理。</p><p> 3.2.1.2鼠標(biāo)右擊事件</p><p><b> 其流程如圖6所示。</b></p><p><b> 圖6</b></p><p> 其實(shí)現(xiàn)代碼詳見附錄3所示。</p&g
19、t;<p> 3.2.3 繪圖界面的設(shè)計(jì)</p><p> 3.2.3.1雷區(qū)、笑臉模塊的繪制</p><p> 添加三個位圖資源如圖7所示。</p><p><b> 圖7</b></p><p> ID分別為ID_BTN_COLOR、ID_MINE_COLOR、ID_NUM_COLOR,并分別
20、添加三個位圖類型的變量,然后調(diào)用LoadBitmap(UINT nIDResource)函數(shù)來實(shí)現(xiàn)位圖資源與變量的關(guān)聯(lián)并添加函數(shù)DrawButton()、DrawMineArea()、DrawNumber()分別實(shí)現(xiàn)笑臉按鈕、雷區(qū)、數(shù)字圖像(計(jì)時器數(shù)字和剩余雷數(shù)數(shù)字)的繪圖。繪制雷區(qū)的函數(shù)DrawMineArea()的實(shí)現(xiàn)代碼見附錄4所示。繪制笑臉按鈕的函數(shù)實(shí)現(xiàn)類似。</p><p> 3.2.3.2數(shù)字模塊的
21、繪制</p><p> 數(shù)字圖像的繪制不是由鼠標(biāo)事件觸發(fā)的,而是由系統(tǒng)時間觸發(fā)的。首先在CMineWnd類中添加定時器標(biāo)識的成員變量m_uTimer和一個記錄游戲開始直到目前所花費(fèi)的時間的成員變量m_uSpendTime。接著在游戲的開始函數(shù)布下時間種子,時間間隔為1000us,然后選擇到預(yù)定時間間隔后發(fā)送Windows命令消息函數(shù)WM_TIMER。接著在CMineWnd類中找到對應(yīng)的消息WM_TIMER,并為
22、其添加重寫函數(shù)OnTimer(),該函數(shù)首先判斷這次的WM_TIMER命令是否為所布下的時間種子到時而產(chǎn)生的,如果是則讓使用的時間變量m_uSpendTime自增,然后通知系統(tǒng)重繪圖像。</p><p> 數(shù)字圖像的繪制完成后,最終游戲界面顯示如圖8所示。</p><p><b> 圖8</b></p><p> 雷區(qū)、笑臉按鈕、3D效果
23、外殼和數(shù)字圖像的繪制都是在OnPaint()函數(shù)中實(shí)現(xiàn)的。其函數(shù)代碼見附錄5所示。</p><p><b> 5 測試運(yùn)行</b></p><p> 調(diào)試運(yùn)行結(jié)果,直接點(diǎn)擊鼠標(biāo)左鍵開始游戲,踩中地雷是的界面顯示如圖9所示;</p><p><b> 圖9</b></p><p> 未踩中地雷
24、并掃完所有的雷時的界面顯示如圖10所示。</p><p><b> 圖10</b></p><p><b> 結(jié)論及分析</b></p><p> 隨著掃雷游戲的開發(fā)完成,本游戲中預(yù)期的主要功能也基本實(shí)現(xiàn)。本論文闡述了掃雷游戲的分析與設(shè)計(jì)的全過程,并在論文中相應(yīng)的位置插入了圖片、流程圖以及一些具有技巧性的程序代碼,更
25、加清晰的描述了該游戲是如何實(shí)現(xiàn)的。</p><p> 掃雷游戲是一款益智類游戲,該游戲與那些網(wǎng)絡(luò)游戲和3D游戲相比,它有編寫簡單容易上手等特點(diǎn),非常適合人們在完成工作的時候適當(dāng)?shù)膴蕵芬?。這些小游戲大都是以益智和娛樂為目的,不僅給緊張工作的人們以放松,還可以讓人們的大腦得到開發(fā)。</p><p> 通過這次課程設(shè)計(jì)收獲很多,尤其是加深了對計(jì)算機(jī)圖形學(xué)知識和遞歸算法以及VC的理解,將課堂
26、上所學(xué)的理論知識應(yīng)用到了實(shí)際中。但是由于我們對Visual C++ 6.0的掌握程度不夠好,其中的很多知識還沒有理解,所以在課程設(shè)計(jì)過程中,遇到了很多問題,我們小組利用圖書館和網(wǎng)上查閱相關(guān)資料,以及周圍同學(xué)的幫助,最終大部分問題得到解決。設(shè)計(jì)所實(shí)現(xiàn)的功能是windows xp系統(tǒng)自帶掃雷游戲的簡化,相比之下,功能不夠齊全,比如聲音、用戶自定義以及玩家成績的排名等都未能實(shí)現(xiàn)。但是通過不斷上機(jī)實(shí)驗(yàn),調(diào)試程序,總結(jié)經(jīng)驗(yàn),動手實(shí)踐能力和解決問題
27、的能力有很大提高。希望在以后的工作和學(xué)習(xí)中不斷的充實(shí)自己的知識結(jié)構(gòu),把掃雷游戲的功能進(jìn)一步完善,使它成為一個更具有實(shí)用價值的游戲軟件。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]楊欽等.計(jì)算機(jī)圖形學(xué).清華大學(xué)出版社,2005</p><p> [2]Ben Sawyer.游戲軟件設(shè)計(jì)與開發(fā)指南[M].北京:人民
28、郵電出版社,1998.8~46</p><p> [3]陳志泊等.Visual C++程序設(shè)計(jì). 中國鐵道出版社.2005.7</p><p> [4]欽科技.Visual C++游戲設(shè)計(jì)[M]. 北京:科海電子出版社,2003.1~211</p><p> [5]楊正華等.Visual C++游戲編程導(dǎo)學(xué)[M].北京:清華大學(xué)出版社,2003.206~268
29、</p><p><b> 附 錄</b></p><p> 附錄1:掃雷的處理函數(shù)</p><p> //鼠標(biāo)左鍵點(diǎn)擊事件代碼</p><p> void CMineWnd::OnLButtonUp(UINT nFlags, CPoint point) </p><p><b&
30、gt; {</b></p><p> //笑臉圖按鈕所在的區(qū)域</p><p> CRect rcBtn(m_uBtnRect[1], 15, m_uBtnRect[2], 39);</p><p><b> //雷區(qū)所在的區(qū)域</b></p><p> CRect rcMineArea(MINE_
31、AREA_LEFT, MINE_AREA_TOP, </p><p> MINE_AREA_LEFT + m_uXNum * MINE_WIDTH, </p><p> MINE_AREA_TOP + m_uYNum * MINE_HEIGHT);</p><p> if (rcBtn.PtInRect(point)) </p><p>
32、;<b> {// 點(diǎn)擊笑臉圖</b></p><p> Invalidate();</p><p> InitGame();</p><p><b> }</b></p><p> else if (rcMineArea.PtInRect(point)) </p><
33、p><b> {//點(diǎn)擊雷區(qū)域</b></p><p> CString value;</p><p> UINT around = 0;</p><p> //根據(jù)不同的游戲狀態(tài)作處理</p><p> switch(m_uGameState) </p><p> {//
34、游戲進(jìn)行狀態(tài)</p><p> case GS_WAIT: case GS_RUN:</p><p> // first get the MINEWND which if pushing down</p><p> m_pOldMine = GetMine(point.x, point.y);</p><p> if (!m_pOld
35、Mine) </p><p> { ReleaseCapture();</p><p><b> return;</b></p><p><b> }</b></p><p> //檢測判斷當(dāng)前狀態(tài)是否為左鼠標(biāo)同時按下</p><p> if (m_bLRBt
36、nDown) </p><p><b> {</b></p><p> m_bLRBtnDown = FALSE;</p><p> OnLRBtnUp(m_pOldMine->uRow, m_pOldMine->uCol);</p><p> if (m_uGameState == GS_WAIT)
37、</p><p> {m_uBtnState = BUTTON_NORMAL;</p><p> Invalidate();</p><p> ReleaseCapture();</p><p><b> return;</b></p><p><b> }</b>
38、;</p><p> //假若周圍已經(jīng)標(biāo)識的雷=周圍真正的雷數(shù),拓展</p><p> if (m_pOldMine->uState != STATE_FLAG)</p><p><b> {</b></p><p> OpenAround(m_pOldMine->uRow, m_pOldMine-&
39、gt;uCol);</p><p><b> }</b></p><p> if (ErrorAroundFlag(m_pOldMine->uRow, m_pOldMine->uCol))</p><p><b> {</b></p><p> Dead(m_pOldMine-&
40、gt;uRow, m_pOldMine->uCol);</p><p> ReleaseCapture();</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><
41、;p><b> else </b></p><p><b> {</b></p><p> //如果游戲尚未開始,點(diǎn)擊左鍵啟動游戲</p><p> if (m_uGameState == GS_WAIT) </p><p><b> {</b></p&
42、gt;<p> if (m_uTimer)</p><p><b> {</b></p><p> KillTimer(ID_TIMER_EVENT);</p><p> m_uTimer = 0;</p><p><b> }</b></p><p>
43、; m_uSpendTime = 1;</p><p> Invalidate();</p><p> if (m_bSoundful) </p><p><b> {</b></p><p> sndPlaySound((LPCTSTR)LockResource(m_pSndClock), SND_MEMOR
44、Y | SND_ASYNC | SND_NODEFAULT);</p><p><b> }</b></p><p><b> //啟動定時器</b></p><p> m_uTimer = SetTimer(ID_TIMER_EVENT, 1000, NULL);</p><p><b
45、> //布雷</b></p><p> LayMines(m_pOldMine->uRow, m_pOldMine->uCol);</p><p> //改變游戲狀態(tài)為"運(yùn)行/GS_RUN"</p><p> m_uGameState = GS_RUN;</p><p><b
46、> }</b></p><p> if (m_pOldMine->uOldState == STATE_NORMAL)</p><p> {//當(dāng)該雷區(qū)域?yàn)檎N醋鳂?biāo)記才打開</p><p> //如果該區(qū)域?yàn)槔?,則死亡</p><p> if (IsMine(m_pOldMine->uRow, m_p
47、OldMine->uCol)) </p><p> {Dead(m_pOldMine->uRow, m_pOldMine->uCol);</p><p> ReleaseCapture();</p><p><b> return;</b></p><p><b> }</b&
48、gt;</p><p> //不是雷的時候,獲取其周圍的雷數(shù)目</p><p> around = GetAroundNum(m_pOldMine->uRow, m_pOldMine->uCol);</p><p> // 如果為空白區(qū)域,拓展,否則打開該區(qū)域(顯示周圍有多少雷數(shù))</p><p> if (around
49、== 0) ExpandMines(m_pOldMine->uRow, m_pOldMine->uCol);</p><p> else DrawDownNum(m_pOldMine, around);</p><p><b> }</b></p><p> else if (m_pOldMine->uOldState
50、== STATE_DICEY)</p><p><b> { </b></p><p> //標(biāo)志為“?”問號的時候</p><p> m_pOldMine->uState = STATE_DICEY;</p><p><b> }</b></p><p>
51、<b> //判斷是否為勝利</b></p><p> if (Victory())</p><p><b> {</b></p><p> Invalidate();</p><p> ReleaseCapture();</p><p><b> re
52、turn;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> break;</b></p><p> case GS_VICTORY:</p><p> case GS_D
53、EAD:</p><p> ReleaseCapture();</p><p><b> return;</b></p><p><b> default :</b></p><p><b> break;</b></p><p><b&g
54、t; }</b></p><p> m_uBtnState = BUTTON_NORMAL;</p><p> Invalidate();</p><p><b> }</b></p><p><b> else </b></p><p><b&g
55、t; {//點(diǎn)擊非雷區(qū)域</b></p><p> if (m_uGameState == GS_WAIT || m_uGameState == GS_RUN)</p><p><b> {</b></p><p> m_uBtnState = BUTTON_NORMAL;</p><p> Inv
56、alidateRect(rcBtn);</p><p><b> }</b></p><p><b> }</b></p><p> ReleaseCapture();</p><p> CWnd::OnLButtonUp(nFlags, point);</p><p&g
57、t;<b> }</b></p><p> //拓展操作的實(shí)現(xiàn)代碼</p><p> void CMineWnd::ExpandMines(UINT row, UINT col)</p><p><b> {</b></p><p> UINT i, j;</p><p
58、> UINT minRow = (row == 0) ? 0 : row - 1;</p><p> UINT maxRow = row + 2;</p><p> UINT minCol = (col == 0) ? 0 : col - 1;</p><p> UINT maxCol = col + 2;</p><p>
59、UINT around = GetAroundNum(row, col);</p><p> //顯示該區(qū)域的方塊狀態(tài)</p><p> m_pMines[row][col].uState = 15 - around;</p><p> m_pMines[row][col].uOldState = 15 - around;</p><p&g
60、t; // “打開”該區(qū)域,重繪</p><p> DrawSpecialMine(row, col);</p><p> //對周圍一個雷都沒有的空白區(qū)域</p><p> if (around == 0)</p><p><b> {</b></p><p> for (i = m
61、inRow; i < maxRow; i++) </p><p><b> {</b></p><p> for (j = minCol; j < maxCol; j++) </p><p><b> {</b></p><p> //對于周圍可以拓展的區(qū)域進(jìn)行的規(guī)拓展&l
62、t;/p><p> if (!(i == row && j == col) && </p><p> m_pMines[i][j].uState == STATE_NORMAL</p><p> && m_pMines[i][j].uAttrib != ATTRIB_MINE) </p><p&g
63、t;<b> {</b></p><p> if (!IsInMineArea(i, j)) continue;</p><p> ExpandMines(i, j);// 遞歸拓展操作</p><p><b> }</b></p><p><b> }</b>&l
64、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 附錄2:鼠標(biāo)右鍵點(diǎn)擊事件代碼</p><p> void CMineWnd::OnRButtonDown(UINT
65、 nFlags, CPoint point) </p><p><b> {</b></p><p> //笑臉圖按鈕所在的區(qū)域</p><p> CRect rcBtn(m_uBtnRect[1], 15, m_uBtnRect[2], 39);</p><p><b> //雷區(qū)所在的區(qū)域</
66、b></p><p> CRect rcMineArea(MINE_AREA_LEFT, MINE_AREA_TOP, </p><p> MINE_AREA_LEFT + m_uXNum * MINE_WIDTH, </p><p> MINE_AREA_TOP + m_uYNum * MINE_HEIGHT);</p><p>
67、; m_bLRBtnDown = FALSE;</p><p> if (rcMineArea.PtInRect(point)) </p><p> {//點(diǎn)擊雷區(qū)域</p><p> if (m_uGameState == GS_WAIT || m_uGameState == GS_RUN) </p><p><b>
68、; {</b></p><p> m_pNewMine = GetMine(point.x, point.y);</p><p> if (!m_pNewMine) return;</p><p> //檢測判斷當(dāng)前狀態(tài)是否為左右鼠標(biāo)同時按下</p><p> if (nFlags == (MK_LBUTTON | MK
69、_RBUTTON))</p><p> {m_bLRBtnDown = TRUE;</p><p> OnLRBtnDown(m_pNewMine->uRow, m_pNewMine->uCol);</p><p><b> }</b></p><p><b> else</b
70、></p><p> {switch(m_pNewMine->uState) </p><p><b> {</b></p><p><b> //普通狀態(tài)</b></p><p> case STATE_NORMAL:</p><p> m_p
71、NewMine->uState = STATE_FLAG;</p><p> m_pNewMine->uOldState = STATE_FLAG;</p><p> m_nLeaveNum--;</p><p><b> break;</b></p><p><b> //標(biāo)記狀態(tài)<
72、/b></p><p> case STATE_FLAG:</p><p> m_pNewMine->uState = STATE_DICEY;</p><p> m_pNewMine->uOldState = STATE_DICEY;</p><p> m_nLeaveNum++;</p><p
73、><b> break;</b></p><p><b> //未知狀態(tài)</b></p><p> case STATE_DICEY:</p><p> m_pNewMine->uState = STATE_NORMAL;</p><p> m_pNewMine->uOl
74、dState = STATE_NORMAL;</p><p><b> break;</b></p><p><b> default: </b></p><p><b> break;</b></p><p><b> }</b></p&g
75、t;<p><b> }</b></p><p> Invalidate();</p><p><b> }</b></p><p><b> }</b></p><p> CWnd::OnRButtonDown(nFlags, point);</
76、p><p><b> }</b></p><p> 附錄3:繪制雷區(qū)的函數(shù)代碼</p><p> void CMineWnd::DrawMineArea(CPaintDC &dc)</p><p><b> {</b></p><p> CDC dcMemory
77、; //用作內(nèi)存設(shè)備 //源設(shè)備</p><p> dcMemory.CreateCompatibleDC(&dc); //使得這個設(shè)備與dc兼容 //dc是目標(biāo)設(shè)備</p><p> dcMemory.SelectObject(m_bmpMine); //將內(nèi)存設(shè)備與位圖資源關(guān)聯(lián)</p><p> for (UINT i = 0; i<m
78、_uYNum; i++) </p><p><b> {</b></p><p> for (UINT j = 0; j<m_uXNum; j++) </p><p> {//根據(jù)[i][j]區(qū)域的雷方塊狀態(tài)拷貝相應(yīng)的圖像到[i][j]雷區(qū)的特定區(qū)域</p><p> dc.StretchBlt(MINEA
79、REA_FRAME_X+16*j, MINEAREA_FRAME_Y+16*i, </p><p> 16, 16, &dcMemory, 0, 16*m_pMines[i][j].uState, 16, 16, SRCCOPY);</p><p><b> }</b></p><p><b> }</b>&
80、lt;/p><p><b> }</b></p><p> 附錄4:雷區(qū)、笑臉按鈕、3D效果外殼和數(shù)字圖像的繪制代碼</p><p> void CMineWnd::OnPaint() </p><p><b> {</b></p><p> CPaintDC dc(t
81、his); //創(chuàng)建一個CPaintDC類型的用以屏幕顯示的dc設(shè)備</p><p> //參數(shù)是指向當(dāng)前框架窗口</p><p> CDC dcMemory;// 內(nèi)存設(shè)備</p><p> CBitmap bitmap;//創(chuàng)建臨時的位圖資源</p><p> if (!dc.IsPrinting()) //判斷不是
82、使用打印機(jī)來進(jìn)行繪制工作</p><p><b> {</b></p><p> // 使內(nèi)存設(shè)備與dc設(shè)備兼容</p><p> if (dcMemory.CreateCompatibleDC(&dc))</p><p><b> {</b></p><p&g
83、t; // 使得bitmap與實(shí)際顯示的dc設(shè)備兼容</p><p> if(bitmap.CreateCompatibleBitmap(&dc,m_rcClient.right,</p><p> m_rcClient.bottom))</p><p><b> {</b></p><p> // 內(nèi)
84、存設(shè)備選擇物件-位圖</p><p> dcMemory.SelectObject(&bitmap);</p><p><b> //繪制背景框</b></p><p> dcMemory.FillRect(&m_rcClient, &m_brsBG);</p><p> DrawButt
85、on((CPaintDC&) dcMemory);//笑臉按鈕繪圖</p><p> DrawNumber((CPaintDC&) dcMemory);//數(shù)字圖像繪圖DrawShell((CPaintDC&) dcMemory);//3D效果外殼繪圖</p><p> DrawMineArea((CPaintDC&) dcMemory);/
86、/雷區(qū)繪圖</p><p> // 將內(nèi)存設(shè)備的內(nèi)容拷貝到實(shí)際屏幕顯示的設(shè)備</p><p> dc.BitBlt(m_rcClient.left, m_rcClient.top, m_rcClient.right, m_rcClient.bottom, &dcMemory, 0, 0, SRCCOPY);</p><p> bitmap.Delete
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖形學(xué)課程設(shè)計(jì)-- 計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)--圖形學(xué)基礎(chǔ)圖形處理實(shí)現(xiàn)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)--- 轉(zhuǎn)動鐘表
- 計(jì)算機(jī)圖形學(xué)論文-計(jì)算機(jī)圖形學(xué)
- 圖形學(xué)教案計(jì)算機(jī)圖形學(xué)a
- barsky直線裁剪算法計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)-- 彈跳的彩球動畫
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)構(gòu)造完整系統(tǒng)
- 計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)
- 掃雷游戲程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)圖形學(xué)簡介
- 計(jì)算機(jī)圖形學(xué)題庫
- 計(jì)算機(jī)圖形學(xué)答案
- 計(jì)算機(jī)圖形學(xué)簡介
- 計(jì)算機(jī)圖形學(xué)試題
- 計(jì)算機(jī)圖形學(xué) 瑣碎
- 計(jì)算機(jī)圖形學(xué)復(fù)習(xí)
評論
0/150
提交評論