c++推箱子課程設(shè)計(jì)報(bào)告_第1頁(yè)
已閱讀1頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  課程設(shè)計(jì)報(bào)告書(shū)</b></p><p>  課程名稱(chēng): 軟件綜合 </p><p>  題 目:基于VC++6.0的“推箱子”游戲軟件的開(kāi)發(fā)與測(cè)試</p><p>  系 名: 信息工程系 </p><p>  專(zhuān)業(yè)班級(jí):

2、 </p><p>  姓 名: </p><p>  指導(dǎo)教師: </p><p>  2013 年 元月 18日</p><p><b>  課程設(shè)計(jì)任務(wù)書(shū)</b></p&

3、gt;<p>  學(xué)生姓名: 專(zhuān)業(yè)班級(jí): 軟件2101 </p><p>  指導(dǎo)教師: 工作單位: 信息系計(jì)算機(jī)教研室</p><p>  設(shè)計(jì)題目: 基于VC++6.0的“推箱子”游戲軟件的開(kāi)發(fā)與測(cè)試</p><p><b>  初始條件:</b></

4、p><p>  已完成c語(yǔ)言程序設(shè)計(jì)、軟件工程、數(shù)據(jù)庫(kù)概論或數(shù)據(jù)庫(kù)技術(shù)等課程的學(xué)習(xí)</p><p>  2. 系統(tǒng)環(huán)境:Intel 奔騰4以上處理器,1G以上內(nèi)存,40G以上硬盤(pán),</p><p>  Windows編程環(huán)境,Visual C++ 6.0編程工具</p><p>  要求完成的主要任務(wù):(在規(guī)定的時(shí)間內(nèi)完成下列任務(wù))</p

5、><p>  (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說(shuō)明書(shū)撰寫(xiě)等具體要求)</p><p><b>  主要任務(wù):</b></p><p>  系統(tǒng)完成用戶(hù)登錄及管理員增加、刪除、修改、查詢(xún)功能</p><p>  1. 按系統(tǒng)功能進(jìn)行游戲背景區(qū)域(移動(dòng)區(qū)域、圍墻)的設(shè)計(jì)與繪制:</p><p>  

6、2. 根據(jù)系統(tǒng)實(shí)現(xiàn)的功能,繪出功能圖、系統(tǒng)流程圖</p><p>  3. 模塊調(diào)試,運(yùn)行結(jié)果正確,并經(jīng)教師檢查及答辯;</p><p>  設(shè)計(jì)報(bào)告撰寫(xiě)格式要求:(課程設(shè)計(jì)報(bào)告按統(tǒng)一通用格式書(shū)寫(xiě))具體內(nèi)容如下:</p><p> ?、?設(shè)計(jì)任務(wù)與要求 ② 總體方案與說(shuō)明</p><p> ?、?程序主要模塊的流程圖

7、 ④ 問(wèn)題分析與解決方案的設(shè)計(jì)思想和改進(jìn)設(shè)想</p><p> ?、?系統(tǒng)的調(diào)試記錄、調(diào)試報(bào)告(即在調(diào)試中遇到的主要問(wèn)題、解決方法及改進(jìn)設(shè)想)</p><p><b> ?、?小結(jié)與體會(huì)</b></p><p>  附錄:① 使用說(shuō)明 ② 參考資料</p><p>  時(shí)間安排:2012年12月29

8、日---2013年元18日(共三周)</p><p>  指 導(dǎo) 教 師 簽 字: 2012年12月28日</p><p>  系 主 任 簽 字: 年 月 日</p><p><b>  目 錄</b></p><p><b>  1引言1

9、</b></p><p>  2項(xiàng)目需求分析1</p><p>  3系統(tǒng)概要設(shè)計(jì)1</p><p>  3.1功能控制模塊1</p><p>  3.2系統(tǒng)流程圖2</p><p>  3.3推箱子游戲具有的功能3</p><p>  3.3.1能夠顯示主菜單

10、和界面3</p><p>  3.3.2能夠?qū)崿F(xiàn)鍵盤(pán)操作功能3</p><p>  3.3.3能夠把放置到位置的箱子進(jìn)行變色顯示4</p><p>  3.3.4游戲勝負(fù)判斷功能4</p><p>  3.3.5支持關(guān)口選擇功能4</p><p>  3.4推箱子功能框架4</p>

11、<p>  3.5游戲界面設(shè)計(jì)5</p><p>  3.5.1游戲主界面5</p><p>  3.5.2游戲菜單與幫助結(jié)構(gòu)設(shè)計(jì)5</p><p>  3.5.3游戲中關(guān)卡選擇對(duì)話框設(shè)計(jì)6</p><p>  3.6游戲的界面實(shí)現(xiàn)6</p><p>  3.7關(guān)卡選擇對(duì)話框的實(shí)現(xiàn)7&

12、lt;/p><p><b>  4詳細(xì)設(shè)計(jì)10</b></p><p>  4.1地圖文件讀取模塊的設(shè)計(jì)與實(shí)現(xiàn)10</p><p>  4.2地圖繪制模塊的設(shè)計(jì)與實(shí)現(xiàn)10</p><p>  4.3鍵盤(pán)操作模塊的設(shè)計(jì)與實(shí)現(xiàn)12</p><p>  4.4游戲規(guī)則模塊設(shè)計(jì)與實(shí)現(xiàn)12&

13、lt;/p><p>  5VC調(diào)試方法介紹14</p><p>  5.1調(diào)試快捷鍵14</p><p>  5.2跟蹤調(diào)試14</p><p>  5.3異常調(diào)試15</p><p><b>  6功能測(cè)試17</b></p><p>  6.1主菜單和

14、界面顯示功能測(cè)試17</p><p>  6.2鍵盤(pán)操作功能測(cè)試17</p><p>  6.3箱子放置到指定位置時(shí)變色顯示功能測(cè)試19</p><p>  6.4支持地圖擴(kuò)展功能的演示20</p><p>  7特殊問(wèn)題及解決方法21</p><p><b>  8設(shè)計(jì)小結(jié)21<

15、/b></p><p><b>  9參考文獻(xiàn)21</b></p><p><b>  引言</b></p><p>  最經(jīng)典的推箱子游戲,類(lèi)似的游戲你一定早就玩過(guò)。要控制搬運(yùn)工上下左右移動(dòng),來(lái)將箱子推到指定地點(diǎn)</p><p>  記得幾年前,《推箱子》在PC機(jī)上刮起了一股不小的益智類(lèi)

16、游戲的旋風(fēng),現(xiàn)在許多資深玩家也都對(duì)《推箱子》贊不絕口,可見(jiàn)有深度的益智類(lèi)游戲是非常受大家歡迎的?!⊥葡渥佑螒?981年由日本人今林宏行首創(chuàng),是在1982年12月由Thinking Rabbit 公司首次發(fā)行,名“倉(cāng)庫(kù)番”。箱子只可以推, 不可以拉, 而且一次只能推動(dòng)一個(gè),勝利條件就是把所有的箱子都推到目的地。</p><p>  推箱子游戲是一種老少皆宜的益智游戲,既可以開(kāi)發(fā)青少年學(xué)生的智力,又可以防止老年癡呆癥

17、,全家一起攻關(guān)還可以促進(jìn)家庭和睦,何樂(lè)而不為?</p><p>  推箱子游戲是目前比較流行的游戲之一,很多操作系統(tǒng)或者流行軟件都會(huì)帶有這種游戲。它既能鍛煉思維的嚴(yán)密性,又有很多樂(lè)趣。我們團(tuán)隊(duì)比較喜歡玩這個(gè)游戲,于是備采用c++編程語(yǔ)言進(jìn)行實(shí)現(xiàn)。</p><p><b>  項(xiàng)目需求分析</b></p><p>  用戶(hù)可以進(jìn)行開(kāi)始游戲,退出游

18、戲,選關(guān),重新開(kāi)始游戲等操作。有結(jié)束提示。</p><p>  作為一款極為經(jīng)典的游戲,推箱子吸引了一代代玩家樂(lè)此不疲,通過(guò)使用Visual C++6.0進(jìn)行設(shè)計(jì),將學(xué)習(xí)過(guò)的知識(shí)應(yīng)用到實(shí)際程序中,以便于為以后的進(jìn)一步學(xué)習(xí)奠定基礎(chǔ)。</p><p>  推箱子游戲的設(shè)計(jì)目標(biāo)完成一個(gè)比較簡(jiǎn)單的游戲,使之能夠?qū)崿F(xiàn)推箱子游戲的基本功能,成為一個(gè)比較完整的游戲框架。在一個(gè)狹小的倉(cāng)庫(kù)中,要求把木箱放到

19、指定的位置,稍不小心就會(huì)出現(xiàn)箱子無(wú)法移動(dòng)或者通道被堵住的情況,所以需要巧妙的利用有限的空間和通道,合理安排移動(dòng)的次序和位置,才能順利的完成任務(wù)。</p><p>  在游戲主界面中,會(huì)出現(xiàn)一個(gè)小人、若干個(gè)箱子和箱子放置點(diǎn)。玩家需要利用方向鍵控制小人上下左右移動(dòng),并推動(dòng)界面中的箱子到達(dá)指定的箱子放置點(diǎn)。</p><p><b>  系統(tǒng)概要設(shè)計(jì) </b></p&g

20、t;<p><b>  功能控制模塊</b></p><p>  系統(tǒng)功能如圖3-1所示。</p><p><b>  圖3-1 功能模塊</b></p><p><b>  系統(tǒng)流程圖</b></p><p>  系統(tǒng)流程如圖3-2所示。</p>

21、<p>  圖3-2 系統(tǒng)流程圖</p><p>  推箱子游戲具有的功能</p><p>  能夠顯示主菜單和界面</p><p>  游戲需要一共主菜單讓玩家進(jìn)行游戲設(shè)置,同時(shí)能夠把地圖文件中的信息轉(zhuǎn)換成為圖像顯示在游戲界面上。</p><p>  能夠?qū)崿F(xiàn)鍵盤(pán)操作功能</p><p>  能夠接受到鍵盤(pán)

22、駛?cè)氲姆较蜴I信息,并根據(jù)不同的方向鍵把游戲人物移動(dòng)到相應(yīng)的位置。例如,當(dāng)玩家單機(jī)方向鍵向上“上”時(shí),如果向上的位置是可以移動(dòng)的,那么就當(dāng)把游戲人物向上西東一個(gè)方格。</p><p>  能夠把放置到位置的箱子進(jìn)行變色顯示</p><p>  當(dāng)玩家把箱子推到指定位置的格子時(shí),需要把這個(gè)箱子進(jìn)行變色,這樣就能明確的現(xiàn)實(shí)出該箱子已經(jīng)放置到指定位置。</p><p>&l

23、t;b>  游戲勝負(fù)判斷功能</b></p><p>  在游戲中,當(dāng)玩家把所有的箱子都推到指定點(diǎn)時(shí),玩家勝利通過(guò)當(dāng)前游戲關(guān)口,進(jìn)行下一關(guān)口的游戲。如果玩家無(wú)法將箱子全部推到指定位置時(shí),玩家失敗,玩家可以選擇重新開(kāi)始進(jìn)行當(dāng)前關(guān)口的游戲,還是退出游戲。</p><p><b>  支持關(guān)口選擇功能</b></p><p>  玩

24、家在游戲中可以自行選擇需要挑戰(zhàn)的關(guān)口。當(dāng)玩家點(diǎn)擊菜單中的“關(guān)卡選擇”,并在對(duì)話框中輸入所需要挑戰(zhàn)的關(guān)口,設(shè)置完畢后點(diǎn)擊開(kāi)始即可打開(kāi)所需關(guān)口。</p><p><b>  推箱子功能框架</b></p><p><b>  圖3-3 功能框架</b></p><p>  初始化模塊。該模塊包括屏幕初始化和游戲第一關(guān)到第最后一

25、關(guān)的初始化。屏幕初始化用于輸出操作信息,游戲每一關(guān)的初始化時(shí)構(gòu)建每一關(guān)的關(guān)卡。</p><p>  畫(huà)圖模塊。該模塊最要是被其他模塊調(diào)用,用于畫(huà)墻、在空地畫(huà)箱子、畫(huà)小人、和畫(huà)目的地。</p><p>  移動(dòng)箱子模塊。該模塊用于移動(dòng)箱子,包括目的地之間、空地之間和目的地與空地之間箱子的移動(dòng)</p><p>  移動(dòng)小人模塊。該模塊用于移動(dòng)人物,包括目的地之間、空地之

26、間和目的地與空地之間人物的移動(dòng)</p><p>  功能控制模塊。該模塊是幾個(gè)功能函數(shù)的集合,包括屏幕輸出功能、指定位置狀態(tài)功能和關(guān)卡重置功能。</p><p><b>  游戲界面設(shè)計(jì)</b></p><p><b>  游戲主界面</b></p><p>  推箱子游戲主界面設(shè)計(jì)如圖3-4所示&

27、lt;/p><p>  圖3-4 設(shè)計(jì)的游戲主界面</p><p>  游戲菜單與幫助結(jié)構(gòu)設(shè)計(jì)</p><p>  圖3-5 游戲菜單結(jié)構(gòu)</p><p>  圖3-6 幫助結(jié)構(gòu)設(shè)計(jì)</p><p>  游戲中關(guān)卡選擇對(duì)話框設(shè)計(jì)</p><p>  圖3-7 關(guān)卡選擇對(duì)話框</p>&

28、lt;p>  當(dāng)玩家在對(duì)話框中輸入關(guān)口數(shù)字,并重新點(diǎn)擊開(kāi)始游戲時(shí),游戲會(huì)自動(dòng)選擇對(duì)應(yīng)關(guān)口的地圖級(jí)別開(kāi)始新游戲。</p><p><b>  游戲的界面實(shí)現(xiàn)</b></p><p>  在推箱子游戲中,通過(guò)如下幾步即可實(shí)現(xiàn)游戲的菜單</p><p>  在推箱子游戲工程的資源中添加一個(gè)菜單資源,其屬性如表3-1所示:</p>

29、<p><b>  表3-1 資源屬性</b></p><p>  1給每個(gè)菜單欄添加相應(yīng)函數(shù)到CboxManDlg類(lèi)中。</p><p>  2菜單響應(yīng)函數(shù)的實(shí)現(xiàn),各類(lèi)菜單調(diào)用響應(yīng),要運(yùn)用到的代碼如下:</p><p>  void CBoxManDlg::OnExit() //退出游戲響應(yīng)</p><p&g

30、t;<b>  {</b></p><p>  int i=MessageBox("退出游戲","提示",MB_OKCANCEL);</p><p><b>  switch(i)</b></p><p><b>  { </b></p><

31、p><b>  case 1:</b></p><p>  CDialog::OnCancel();</p><p><b>  break;</b></p><p><b>  case 2: </b></p><p><b>  break;</b&g

32、t;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void CBoxManDlg::OnSelect() //關(guān)卡選擇</p><p><b>  {</b></p><p>  CSelect

33、sel;</p><p>  sel.DoModal();</p><p>  g_level=sel.m_level;;</p><p>  GameStart();</p><p><b>  }</b></p><p>  void CBoxManDlg::OnRestart() //重新開(kāi)

34、始</p><p><b>  {</b></p><p>  GameStart();</p><p><b>  }</b></p><p>  關(guān)卡選擇對(duì)話框的實(shí)現(xiàn)</p><p>  推箱子游戲關(guān)口選擇對(duì)話框的實(shí)現(xiàn),分為如下幾步:</p><p&g

35、t;  創(chuàng)建一個(gè)對(duì)話框資源,并添加相應(yīng)的控件,如圖:</p><p>  圖3-8 關(guān)口選擇對(duì)話框資源</p><p>  在資源視窗中,Menu一項(xiàng),雙擊IDR_MAINFRAME彈出菜單編輯框,添加一個(gè)“選關(guān)”選項(xiàng),隨便修改一個(gè)ID</p><p>  “查看->建立類(lèi)向?qū)А保–trl+W),第一個(gè)選項(xiàng)卡,找到“選關(guān)”選項(xiàng)的ID,選中COMMAND消息,點(diǎn)

36、右邊按鈕添加函數(shù)。</p><p>  圖3-9 添加函數(shù)圖1</p><p>  接下來(lái)資源視窗,Bitmap下插入Dialog對(duì)話框并編輯,添加一個(gè)編輯框,修改編輯框ID“查看->建立類(lèi)向?qū)А?,添加新?lèi),填好類(lèi)名就會(huì)自動(dòng)生成.cpp文件和.h文件。基類(lèi)選CDialog,對(duì)話框ID選上面建好的對(duì)話框。OK</p><p>  圖3-10 添加函數(shù)圖2<

37、;/p><p>  為編輯框添加一個(gè)變量,用來(lái)存儲(chǔ)編輯框獲得的數(shù)據(jù)。選項(xiàng)卡Member Variables,類(lèi)名選上面那個(gè)對(duì)話框的類(lèi)名,選中編輯框的ID,增加變量</p><p>  圖3-11 變量設(shè)置</p><p>  (6)要想在CBoxManDlg類(lèi)中使用這個(gè)對(duì)話框類(lèi),必須包含頭文件:</p><p>  #include "

38、MapSelect.h"</p><p>  最后,選項(xiàng)卡關(guān)聯(lián)函數(shù)中調(diào)用這個(gè)對(duì)話框類(lèi):void CBoxManDlg::OnSelect() //關(guān)卡選擇</p><p><b>  {</b></p><p>  // TODO: Add your command handler code here</p><

39、p>  CSelect sel;</p><p>  sel.DoModal();</p><p>  g_level=sel.m_level;</p><p>  // CString str;</p><p>  // str.Format("%d",g_level);</p><p&

40、gt;  // MessageBox(str);</p><p>  GameStart();</p><p><b>  }</b></p><p><b>  選關(guān)功能完成</b></p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p> 

41、 地圖文件讀取模塊的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  地圖文件讀取模塊,主要負(fù)責(zé)將對(duì)地圖文件讀取,并把相應(yīng)的文件數(shù)據(jù)轉(zhuǎn)換成地圖顯示出來(lái)。其設(shè)計(jì)步驟如下:</p><p> ?。?)讀取當(dāng)前文件夾中的地圖文件。</p><p> ?。?)判斷當(dāng)前選擇關(guān)口是否在文件夾中存在。</p><p>  (3)如果存在則把當(dāng)前關(guān)口的地圖信息放置到地圖數(shù)組中

42、。</p><p>  其實(shí)現(xiàn)代碼如下所示:</p><p>  void CBoxManDlg::loadMap(int num)</p><p><b>  {</b></p><p>  CString str;</p><p>  str.Format("[%d]",n

43、um); //格式化字符串,即將關(guān)卡編號(hào)變成[X]</p><p>  FILE *pFile=fopen("./Debug/map.txt","rb");//打開(kāi)地圖文件</p><p>  if (pFile==NULL)return;//判斷打開(kāi)是否失敗</p><p>  char cTmp[20];//創(chuàng)建

44、臨時(shí)字符數(shù)組</p><p>  fgets(cTmp,20,pFile);//讀取一行到數(shù)組中</p><p>  while (strncmp(cTmp,str,3)!=0)//讀取與當(dāng)前關(guān)口編號(hào)相同的地圖</p><p><b>  {</b></p><p>  fgets(cTmp,20,pFile);&l

45、t;/p><p><b>  }</b></p><p>  for (int i=0;i<14;i++)//讀取地圖數(shù)據(jù)到地圖數(shù)組</p><p><b>  {</b></p><p>  fgets(m_cMap[i],20,pFile);</p><p><

46、b>  }</b></p><p>  fclose(pFile);</p><p><b>  }</b></p><p>  地圖繪制模塊的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  地圖繪制模塊主要將地圖數(shù)組中的數(shù)據(jù)繪制成地圖圖像。其設(shè)計(jì)分為如下幾步。</p><p>  格局要求,實(shí)

47、現(xiàn)不同類(lèi)型格子的繪制函數(shù)。地圖數(shù)組及地圖文件中各字符代表的意思如表4-1所示:</p><p>  表4-1 地圖數(shù)組及地圖字符代表的意思</p><p>  (2)讀取地圖數(shù)據(jù),根據(jù)不同的數(shù)據(jù)調(diào)用不同的繪圖函數(shù)。</p><p>  地圖繪制,模塊的實(shí)現(xiàn)代碼如下:</p><p>  void CBoxManDlg::drawMap(CDC

48、 *pDC) //繪地圖接口函數(shù)</p><p><b>  {</b></p><p>  int i,j,x,y;</p><p>  for (i=0;i<14;i++) //遍歷行</p><p><b>  {</b></p><p>  for (

49、j=0;j<16;j++) //遍歷列</p><p><b>  {</b></p><p><b>  x=j*29;</b></p><p><b>  y=i*29;</b></p><p>  switch (m_cMap[i][j]) //根據(jù)數(shù)組中的數(shù)

50、據(jù)進(jìn)行繪圖</p><p><b>  {</b></p><p>  case MAP_BACK: //0繪制背景</p><p>  drawBack(x,y,pDC);</p><p><b>  break;</b></p><p>  case MAP_WHIT

51、EWALL: //1繪制地圖邊框</p><p>  drawWhiteWall(x,y,pDC);</p><p><b>  break;</b></p><p>  case MAP_BLUEWALL: //2繪制地板</p><p>  drawBlueWall(x,y,pDC);</p>

52、<p><b>  break;</b></p><p>  case MAP_BALL: //3繪制目標(biāo)</p><p>  drawBall(x,y,pDC);</p><p><b>  break;</b></p><p>  case MAP_BOX:/

53、/4繪制箱子</p><p>  drawBox(x,y,pDC);</p><p><b>  break;</b></p><p>  case MAP_REDBOX: //5 繪制箱子與目標(biāo)重合</p><p>  drawRedBox(x,y,pDC);</p><p><

54、;b>  break;</b></p><p>  case MAP_MAN://6繪制人</p><p>  drawMan(x,y,pDC);</p><p><b>  break;</b></p><p>  case MAP_MANBALL: //繪制人和目標(biāo)重合</p&

55、gt;<p>  drawManBall(x,y,pDC);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p

56、><p><b>  }</b></p><p>  鍵盤(pán)操作模塊的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  鍵盤(pán)操作模塊主要負(fù)責(zé)接收玩家鍵盤(pán)輸入并進(jìn)行箱子移動(dòng)等處理,其設(shè)計(jì)比較簡(jiǎn)單,只需要通過(guò)如下幾步即可實(shí)現(xiàn)。</p><p>  通過(guò)截獲當(dāng)前窗口中鍵盤(pán)按下消息來(lái)判斷玩家按下的按鍵。</p><p>  根據(jù)

57、玩家按下的按鍵把人的相關(guān)坐標(biāo)進(jìn)行加減。例如:當(dāng)玩家按下方向鍵“右”時(shí),把人的X坐標(biāo)增加,反之,把人的X坐標(biāo)減少。</p><p>  把增加后的數(shù)據(jù)與地圖數(shù)組中的數(shù)據(jù)進(jìn)行比較,只要不是地圖邊框就可以移動(dòng),如果是箱子就還需要將箱子的坐標(biāo)進(jìn)行移動(dòng)。</p><p>  但是要注意,要判斷箱子移動(dòng)后的坐標(biāo)是否可以移動(dòng)。</p><p>  鍵盤(pán)操作模塊的實(shí)現(xiàn),主要代碼如下

58、:</p><p>  BOOL CBoxManDlg::PreTranslateMessage(MSG* pMsg) </p><p><b>  {</b></p><p>  if (pMsg->message==WM_KEYDOWN)</p><p><b>  {</b></p

59、><p>  updateMap(pMsg->wParam); //根據(jù)按下的按鍵進(jìn)行判斷</p><p>  Invalidate(FALSE);</p><p>  if (isFinish()) //調(diào)用規(guī)則模塊函數(shù),判斷是否勝利</p><p><b>  {</b></p><p&

60、gt;  AfxMessageBox("恭喜你!過(guò)關(guān)?。。?quot;);</p><p>  g_level=g_level+1; //勝利后將當(dāng)前關(guān)口加1</p><p>  if (g_level>g_maxlevel)</p><p><b>  {</b></p><p>  g_level

61、=1; //如果大于最大關(guān)口編號(hào),重新開(kāi)始</p><p><b>  }</b></p><p>  GameStart();</p><p><b>  }</b></p><p><b>  }</b></p><p>  return CD

62、ialog::PreTranslateMessage(pMsg);</p><p><b>  }</b></p><p>  游戲規(guī)則模塊設(shè)計(jì)與實(shí)現(xiàn)</p><p>  游戲規(guī)則模塊,主要負(fù)責(zé)游戲規(guī)則的判斷。其設(shè)計(jì)方法需要在每次玩家移動(dòng)人物后,對(duì)當(dāng)前地圖數(shù)組進(jìn)行判斷。如果當(dāng)前地圖中存在單獨(dú)的“目標(biāo)區(qū)域”或者“人物站在目標(biāo)上”兩種情況,就說(shuō)明玩

63、家未過(guò)關(guān),放置就死過(guò)關(guān)。</p><p>  游戲規(guī)則模塊的實(shí)現(xiàn),代碼如下:</p><p>  BOOL CBoxManDlg::isFinish() //判斷是否過(guò)關(guān)</p><p><b>  {</b></p><p>  for (int i=0;i<14;i++) //遍歷所有列</p&g

64、t;<p><b>  {</b></p><p>  for (int j=0;j<16;j++)//遍歷所有行</p><p><b>  {</b></p><p>  if (m_cMap[i][j]==MAP_BALL || m_cMap[i][j]==MAP_MANBALL)</p&

65、gt;<p><b>  {</b></p><p>  return FALSE;//有目標(biāo)區(qū)域或人物站在目標(biāo)區(qū)域上</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

66、</p><p>  return TRUE;//游戲結(jié)束</p><p><b>  }</b></p><p><b>  VC調(diào)試方法介紹</b></p><p>  Visual C/C++ 是眾多C/C++編譯器中,調(diào)試功能較為強(qiáng)大的編譯器之一。調(diào)試程序是每個(gè)初學(xué)者必須經(jīng)歷的過(guò)程,只有

67、不斷發(fā)現(xiàn)自己的錯(cuò)誤,才能減少編程錯(cuò)誤,提高編程能力。當(dāng)然我們不建議一遇到錯(cuò)誤就調(diào)試,我希望大家先用眼睛看,把常見(jiàn)的錯(cuò)誤都改正后,最后不行再調(diào)試,這樣編程能力才會(huì)進(jìn)步。要做到十分鐘上百行無(wú)錯(cuò)代碼的能力,不下苦功是練不成的。</p><p>  常用的調(diào)試快捷鍵有:</p><p>  F10 單步運(yùn)行,不進(jìn)入函數(shù)。</p><p>  F11 單步運(yùn)行,進(jìn)入函數(shù)。如果

68、是自定義函數(shù),則進(jìn)入自定義函數(shù)。如果是系統(tǒng)函數(shù),如scanf,printf,return 等等,則進(jìn)入?yún)R編,當(dāng)然這不是我們期望的。</p><p>  單步運(yùn)行的同時(shí),左下方會(huì)自動(dòng)顯示當(dāng)前被改變值的變量,右下方則可以輸入自定義變量。一般F10,F11結(jié)合使用。</p><p>  F9 設(shè)置斷點(diǎn)。光標(biāo)所在行設(shè)置斷點(diǎn)。</p><p>  F5 運(yùn)行到斷點(diǎn)處暫停。&l

69、t;/p><p>  為了更快運(yùn)行到我們關(guān)心的地方,避免F10一步一步的運(yùn)行浪費(fèi)時(shí)間。 F9,F5一般結(jié)合使用,到我們關(guān)注的地方后,我們可以繼續(xù)F10。</p><p>  設(shè)斷點(diǎn)的另外一大好處,是在遞歸程序中設(shè)置斷點(diǎn),可以很快運(yùn)行到下一層中。</p><p>  寫(xiě)程序要養(yǎng)成良好代碼風(fēng)格,沒(méi)有人會(huì)喜歡看別人錯(cuò)誤的代碼,尤其是那些沒(méi)有分行縮進(jìn),一律左對(duì)齊的代碼。養(yǎng)成分行

70、縮進(jìn)的風(fēng)格在檢查括號(hào)匹配的時(shí)候,也非常方便。</p><p>  運(yùn)行時(shí)錯(cuò)誤:一運(yùn)行就彈出窗口,或在某些輸入數(shù)據(jù)的情況下,彈出“內(nèi)存出錯(cuò)警告”的窗口。多數(shù)是由于指針訪問(wèn)非法空間造成的,比如未動(dòng)態(tài)開(kāi)辟就訪問(wèn),釋放后再次訪問(wèn)或釋放等等。數(shù)組下標(biāo)越界,開(kāi)辟極大空間等也有可能導(dǎo)致此類(lèi)錯(cuò)誤。解決方法,可以通過(guò)單步運(yùn)行F10或運(yùn)行到斷點(diǎn)處F5,確定出錯(cuò)行,然后仔細(xì)檢查代碼,加以修正</p><p>&

71、lt;b>  調(diào)試快捷鍵</b></p><p><b>  F5:  開(kāi)始調(diào)試</b></p><p>  Shift+F5: 停止調(diào)試</p><p>  F10:   調(diào)試到下一句,這里是單步跟蹤  </p><p>  F11:   調(diào)

72、試到下一句,跟進(jìn)函數(shù)內(nèi)部</p><p>  Shift+F11:  從當(dāng)前函數(shù)中跳出</p><p>  Ctrl+F10:  調(diào)試到光標(biāo)所在位置</p><p>  F9:       設(shè)置(取消)斷點(diǎn)</p><p>  Alt+F9:&

73、#160;   高級(jí)斷點(diǎn)設(shè)置</p><p><b>  跟蹤調(diào)試</b></p><p>  1、 盡量使用快捷鍵時(shí)行調(diào)試</p><p><b>  2、 觀察調(diào)試信息</b></p><p><b>  3、 高級(jí)中斷設(shè)置&

74、lt;/b></p><p><b>  異常調(diào)試</b></p><p>  重試->取消->調(diào)試</p><p>  函數(shù)堆棧,用variables或者call stack 窗口</p><p>  VC6.0Debug調(diào)試總結(jié)1. 如何顯示Debug工具欄窗口①:在任意工具欄的位置,單擊鼠標(biāo)右

75、鍵,勾選Debug項(xiàng)  ②:Tools---->Customize--àToolbars--àDebug--àclose  引申:工具欄和工具條的區(qū)別?  一個(gè)工具欄可以放置多個(gè)工具條。2.?dāng)帱c(diǎn)調(diào)試F9:設(shè)置或去除斷點(diǎn)。如果當(dāng)前行未設(shè)置斷點(diǎn),按F9可在當(dāng)前行設(shè)置斷點(diǎn),如果當(dāng)前行已設(shè)置斷點(diǎn),按F9則為去除斷點(diǎn)設(shè)置。Alt+F9:調(diào)出斷點(diǎn)設(shè)置窗口  在

76、這個(gè)窗口里可以設(shè)置斷點(diǎn),去除所有已經(jīng)設(shè)置的斷點(diǎn)或者單個(gè)斷點(diǎn),也可以轉(zhuǎn)到已設(shè)置的斷點(diǎn)處,通過(guò)按鈕Edit Code,可以設(shè)置需要被計(jì)算的表達(dá)式,可以設(shè)置,監(jiān)視(Watch)數(shù)組或結(jié)構(gòu)體元素的個(gè)數(shù),可以在窗口過(guò)程函數(shù)中設(shè)置斷點(diǎn),可以為任何一個(gè)想要監(jiān)視(Watch)的消息(Message)設(shè)置一個(gè)斷點(diǎn)。3.開(kāi)始調(diào)試①:Build--Start Debug--Go②:F5注:F5有兩層含義。對(duì)于非調(diào)試階段,按F5用于開(kāi)始調(diào)試。對(duì)于調(diào)試階

77、段(已經(jīng)進(jìn)入調(diào)試階段),按F5用于運(yùn)行程序到下一個(gè)斷點(diǎn)處4.停止調(diào)試一旦按F5之后進(jìn)入調(diào)試階</p><p><b>  功能測(cè)試</b></p><p>  主菜單和界面顯示功能測(cè)試</p><p>  這個(gè)演示主要是測(cè)試游戲的菜單和界面顯示是否成功,其步驟如下。</p><p>  運(yùn)行推箱子程序.exe文件,如

78、圖6-1所示</p><p><b>  圖6-1 運(yùn)行文件</b></p><p>  程序啟動(dòng)后,其菜單及界面如圖6-2所示</p><p><b>  圖6-2 界面效果</b></p><p><b>  鍵盤(pán)操作功能測(cè)試</b></p><p>

79、;  鍵盤(pán)操作功能的演示,演示步驟如下:</p><p>  游戲開(kāi)始后人物的位置,如圖6-3所示</p><p><b>  圖6-3</b></p><p>  按下鍵盤(pán)上的“下”方向按鍵。</p><p>  查看任務(wù)是否向下移動(dòng),如圖5-4:</p><p><b>  圖6-4

80、</b></p><p>  箱子放置到指定位置時(shí)變色顯示功能測(cè)試</p><p>  將箱子放置到指定位置時(shí),箱子會(huì)變色的功能,具體步驟如下</p><p>  推箱子游戲已經(jīng)開(kāi)始,如圖6-5所示</p><p><b>  圖6-5</b></p><p>  推動(dòng)箱子到指定位置后

81、,顯示如圖5-6所示</p><p><b>  圖6-6</b></p><p>  支持地圖擴(kuò)展功能的演示</p><p>  推箱子游戲是否支持地圖擴(kuò)展功能,步驟如下:</p><p>  查看第一關(guān)地圖文件,其內(nèi)容如下:</p><p>  與游戲顯示的地圖對(duì)照</p>&l

82、t;p>  圖6-7 第一關(guān)地圖文件 圖6-8 修改后的地圖文件</p><p>  重新進(jìn)行第一關(guān)游戲,地圖顯示</p><p><b>  圖6-9</b></p><p>  特殊問(wèn)題及解決方法 </p><p><b>  1、 問(wèn)題1</b></p><

83、p><b>  問(wèn)題描述</b></p><p>  記錄所有走過(guò)的步數(shù)總是不成功</p><p><b>  解決方案</b></p><p><b>  設(shè)置變量sum </b></p><p><b>  解決結(jié)果</b></p>

84、<p>  可以記錄所有走過(guò)的步數(shù),當(dāng)游戲重新開(kāi)始的時(shí)候本關(guān)的步數(shù)清零。</p><p><b>  2、問(wèn)題2 </b></p><p><b>  問(wèn)題描述</b></p><p>  在初始化地圖函數(shù)時(shí),由于每加載地圖均要將目的地存儲(chǔ)于 POINT DE[]中,由于人物移動(dòng)過(guò)程中當(dāng)人物占領(lǐng)目的地時(shí),目的地

85、POINT DE[]存儲(chǔ)內(nèi)容也會(huì)隨之改變,事實(shí)上DE里面的值是不會(huì)變的</p><p><b>  解決方案</b></p><p>  對(duì)POINT DE[]的值只初始化一次,記在選關(guān)按鈕按下時(shí),或游戲結(jié)束時(shí)才初始化,當(dāng)人物移動(dòng)時(shí),當(dāng)加載目的地圖片時(shí),不再對(duì) POINT DE[]進(jìn)行賦值。</p><p><b>  解決結(jié)果<

86、;/b></p><p>  目的地的圖片正常顯示,成功判斷當(dāng)前關(guān)是否成功</p><p><b>  設(shè)計(jì)小結(jié)</b></p><p>  從工程實(shí)踐開(kāi)始前兩周,原計(jì)劃使用MFC開(kāi)發(fā)程序,因?yàn)檩^WIN32應(yīng)用程序熟悉,但是后來(lái)考慮到運(yùn)用WIN32應(yīng)用程序能使得開(kāi)發(fā)更為靈活,且文件不至于冗余。剛剛使用WIN32應(yīng)用程序開(kāi)發(fā)的時(shí)候,對(duì)整個(gè)開(kāi)

87、發(fā)框架和消息機(jī)制的不熟悉,走了很多彎路,花了不少時(shí)間實(shí)踐,從最初的需求分析設(shè)計(jì),概要設(shè)計(jì),我們小組都會(huì)集中實(shí)驗(yàn)室進(jìn)行詳細(xì)的探討,雖然在探討過(guò)程中不免會(huì)有不同意見(jiàn),但是都能很好的協(xié)商,調(diào)節(jié)過(guò)來(lái),本次實(shí)踐不僅在編程知識(shí)上有了更深的理解,也加深了我們對(duì)團(tuán)隊(duì)合作的重要性的認(rèn)識(shí)。</p><p>  雖然本款游戲與傳統(tǒng)上的推箱子游戲大同小異,但是我們盡了自己最大的努力去完善和修正它,小組成員都盡力扮演好自己的角色,對(duì)自己的

88、分工也是按時(shí)按量的完成。為了此次項(xiàng)目能按時(shí)按量的完成,我們?cè)诿鞔_自己的方向后,不斷地在百度,谷歌,圖書(shū)館尋求為我們的答案。本次實(shí)踐,我們的美工也是異常幸苦,為了滿(mǎn)足我們程序主題的要求,不斷地更新圖片,有時(shí)候也會(huì)連續(xù)制作圖片達(dá)3,4個(gè)小時(shí)。雖然這次的游戲沒(méi)有預(yù)想中的那么好,但是通過(guò)本次學(xué)習(xí),下個(gè)作品將會(huì)更加出彩。</p><p>  編程工作不是那么容易的,有時(shí)候?yàn)榱苏乙粋€(gè)小小的錯(cuò)誤,會(huì)耗上我們一整下午的時(shí)間,我們

89、需要一點(diǎn)一點(diǎn)的排除,不停地分析和排除可能出錯(cuò)的原因,所以編程是需要很大的勇氣和耐心。有人說(shuō)這是在浪費(fèi)我們的時(shí)間,其實(shí)事實(shí)上當(dāng)你自己獨(dú)立的解決完一個(gè)問(wèn)題后,你會(huì)有很大的收獲。可以說(shuō),結(jié)果固然重要,但在解決問(wèn)題的過(guò)程中,我們學(xué)會(huì)了如何分析和解決問(wèn)題不是更有意義嗎?!</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 王慧芳,畢建權(quán). 軟件工程<

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論