2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論