掃雷小程序設(shè)計.doc_第1頁
掃雷小程序設(shè)計.doc_第2頁
掃雷小程序設(shè)計.doc_第3頁
掃雷小程序設(shè)計.doc_第4頁
掃雷小程序設(shè)計.doc_第5頁
免費預(yù)覽已結(jié)束,剩余29頁可下載查看

下載本文檔

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

文檔簡介

_目 錄第1章問題描述與分析11.1問題描述11.2問題分析1第2章算法設(shè)計與流程圖22.1算法設(shè)計22.2流程圖32.2.1總體流程圖32.2.2面板的選擇的流程圖42.2.3難度的選擇的流程圖52.2.4游戲主界面的流程圖6第3章編碼與測試83.1程序編碼83.1.1主函數(shù)程序代碼83.1.2面板選擇的類聲明及主要代碼83.1.3難度選擇的類聲明及主要代碼103.1.4游戲主界面的類聲明及主要代碼123.2測試結(jié)果153.2.1界面一:面板選擇的相關(guān)測試153.2.2界面二:難度選擇的相關(guān)測試163.2.3界面三:主界面的相關(guān)測試17第4章總結(jié)與分析24參考文獻25附 錄1.必選題題目262.流程圖263.程序代碼274.測試結(jié)果28精品資料第1章 問題描述與分析1.1 問題描述掃地雷是一個廣泛游戲,掃地雷的游戲規(guī)則:掃雷就是要把所有非地雷的格子揭開即勝利;踩到地雷格子就算失敗。當(dāng)鼠標(biāo)點擊到棋盤范圍外時,視為無效,無響應(yīng)。游戲主區(qū)域由很多個方格組成?;疽鬄椋?. 用程序設(shè)計分析思想對選題進行分析設(shè)計2. 用 C 語言對選題進行代碼實現(xiàn)測試要求為:1. 進行系統(tǒng)功能性測試,驗證基本功能實現(xiàn)情況。2. 進行邊界測試及特殊數(shù)據(jù)用例測試,驗證功能模塊的邏輯分支流程。1.2 問題分析仔細分析課題的要求并粗略分析可以得到大致得到:1. 選擇棋盤的大小(6*6, 9*9, 11*11)2. 選擇游戲的難度(簡單10%的雷,一般20%的雷,困難30%的雷) 3. 繪制一個掃雷的面板。4. 根據(jù)鼠標(biāo)點擊位置確定所點格子位置。5. 判斷格子是否是地雷,若為地雷則游戲結(jié)束。若非地雷顯示周圍8個格子所含地雷總數(shù)。6. 若所有非地雷的格子揭開,則勝利,否則一直循環(huán)進行2、3步。第2章 算法設(shè)計與流程圖2.2.1 算法設(shè)計掃雷游戲的設(shè)計可以從三方面進行考慮:1. 面板的選擇(BoardChoice)2. 難度的選擇(LevelChoice)3. 游戲主界面(Game)這三方面即為游戲進行的過程,大致可以畫出如圖2-1的模塊圖:圖2-1 掃雷游戲設(shè)計的模塊圖(1) 面板的選擇在該模塊中,需要決定面板的大小,即每行每列有多少個格子。在設(shè)計時,個人決定使用6*6,9*9和11*11的格子面板。設(shè)計中,個人決定設(shè)置3個按鈕分別作為3種面板的選擇。在具體實現(xiàn)時,需要從兩方面進行考慮,即:位置確定和數(shù)據(jù)傳入。位置確定即為確定點擊位置是否有效,確定點擊位置與按鈕的關(guān)系。數(shù)據(jù)傳入即為確定按鈕后,將相應(yīng)的6或9或11載入行列統(tǒng)計變量ROWANDCOLUMN中。(2) 難度的選擇在該模塊中,需要決定面板種雷的個數(shù),面板中應(yīng)包含多少的地雷。在設(shè)計時,個人決定使用10%,20%和30%的總格子數(shù)作為雷的總個數(shù)。設(shè)計中,個人決定設(shè)置3個按鈕分別作為3種面板的選擇。在具體實現(xiàn)時,需要從兩方面進行考慮,即:位置確定和數(shù)據(jù)傳入。位置確定即為確定點擊位置是否有效,確定點擊位置與按鈕的關(guān)系。數(shù)據(jù)傳入即為確定按鈕后,將相應(yīng)的雷數(shù)載入變量MINENUM中。(3) 游戲主界面游戲主界面的設(shè)計可以包含圖形的繪制模塊,鼠標(biāo)區(qū)域的獲取模塊,數(shù)據(jù)的生成模塊。各部分包含的內(nèi)容如下:a) 圖形的繪制 基礎(chǔ)線條的繪制 單個地雷的繪制 非雷區(qū)域的數(shù)字輸出 游戲結(jié)束后所有雷和數(shù)字的結(jié)果輸出b) 鼠標(biāo)區(qū)域的獲取 有效性判斷 獲取鼠標(biāo)區(qū)域?qū)⒆鴺?biāo)轉(zhuǎn)換為可以使用的相應(yīng)的數(shù)組數(shù)據(jù)c) 數(shù)據(jù)的生成 初始化數(shù)據(jù) 隨機位置設(shè)置雷 非雷區(qū)域計算相應(yīng)數(shù)值2.2 流程圖2.2.1 總體流程圖函數(shù)的主流程圖如圖2-2。在該流程圖中,介紹了游戲的三個界面的切換情況,三者為依次展示的狀態(tài),完成前一步驟后方可進入下一界面。圖2-2 程序的總流程圖2.2.2 面板的選擇的流程圖面板的選擇流程圖如圖2-3。在該流程圖中,介紹了面板大小選擇的流程,主要的部分為界面的繪制過程,鼠標(biāo)點擊區(qū)域的判斷,以及相應(yīng)數(shù)值的賦值。該過程是掃雷游戲的第一個界面。該流程的目的是為了傳入相應(yīng)的參數(shù),使得在游戲主界面時,能夠初始化相應(yīng)數(shù)組以及繪制對應(yīng)的界面。圖2-3 面板選擇的流程圖2.2.3 難度的選擇的流程圖難度的選擇流程圖如圖2-4。在該流程圖中,介紹了游戲難度的選擇流程,主要的部分為界面的繪制過程,鼠標(biāo)點擊區(qū)域的判斷,以及相應(yīng)數(shù)值的賦值。該過程是掃雷游戲的第二個界面。過程類似于面板選擇的流程。該流程的目的是為了傳入相應(yīng)的參數(shù),使得在游戲主界面時,能夠初始化相應(yīng)數(shù)組以及繪制對應(yīng)的界面。圖2-4 難度選擇的流程圖2.2.4 游戲主界面的流程圖游戲主界面的流程圖如圖2-5。在該流程圖中,主要的操作為繪制相應(yīng)的主界面面板,即多個格子。獲取鼠標(biāo)點擊的位置,而后進行儲存數(shù)據(jù)的判斷,雷區(qū)與非雷區(qū)的判斷,游戲是否結(jié)束的判斷等等操作,相應(yīng)的過程如下所示。圖2-5 游戲主界面的流程圖第3章 編碼與測試3.3.1 程序編碼程序的編碼部分可以分為四各模塊,即:主函數(shù)的程序部分,面板大小選擇部分,難度選擇部分,游戲主界面部分,每個部分內(nèi)均可以分類編寫,互不干擾,以下為代碼的主要部分,詳細代碼由于篇幅的限制,可以在附錄中查閱。3.1.1 主函數(shù)程序代碼#include#includeBoardChoice.h#includeLevelChoice.h#includeGame.hint ROWANDCOLUMN;/行列數(shù)int MINENUM;/ 雷數(shù)int CHESSSIZE;/ 格子大小int main()BoardChoice b1;/ 面板一b1.main();LevelChoice b2;/ 面板二b2.main();Game b3;/ 面板三b3.main();return 0;3.1.2 面板選擇的類聲明及主要代碼1. BoardChoice類的聲明class BoardChoicepublic:void main();/ 面板控制private:void DrawBoard();/ 主界面繪制void ChoiceClick();/鼠標(biāo)輸入;2. 主要代碼/ 主界面繪制void BoardChoice:DrawBoard()setcaption(掃雷游戲);setbkcolor(WHITE);setcolor(BLACK);setfont(25, 0, 宋體, 0);outtextxy(150, 30, 面板選擇);rectangle(100, 80, 300, 130);rectangle(100, 180, 300, 230);rectangle(100, 280, 300, 330);outtextxy(169, 93, 6 * 6);outtextxy(169, 193, 9 * 9);outtextxy(156, 293, 11 * 11);/ 鼠標(biāo)輸入void BoardChoice:ChoiceClick()while (true)mouse_msg m;m = getmouse();if (m.is_down() & m.x 100 & m.x 80 & m.y 180 & m.y 280 & m.y 100 & m.x 80 & m.y 180 & m.y 280 & m.y = 0 & y - 1 = 0 & statusx - 1y - 1 = -1) num+;if (x - 1 = 0 & statusx - 1y = -1) num+;if (x - 1 = 0 & y + 1= 0 & statusxy - 1 = -1) num+;if (y + 1ROWANDCOLUMN&statusxy + 1 = -1) num+;if (x + 1= 0 & statusx + 1y - 1 = -1) num+;if (x + 1ROWANDCOLUMN&statusx + 1y = -1) num+;if (x + 1ROWANDCOLUMN&y + 1ROWANDCOLUMN&statusx + 1y + 1 = -1) num+;return num;/ 設(shè)置非雷區(qū)的周邊雷統(tǒng)計值void Game:SetMineNum()for (int i = 0; i ROWANDCOLUMN; i+)for (int j = 0; j ROWANDCOLUMN; j+)if (statusij != -1)statusij = CalculateMineNum(i, j);3.2 測試結(jié)果本次課程設(shè)計中要求需要進行系統(tǒng)功能性測試,并且驗證基本功能實現(xiàn)情況。同時需要進行邊界測試及特殊數(shù)據(jù)用例測試,驗證功能模塊的邏輯分支流程。針對這些要求,我做了以下的測試。3.2.1 界面一:面板選擇的相關(guān)測試針對面板一需要進行的測試為鼠標(biāo)的相關(guān)測試。面板一可以劃分為以下四個區(qū)域:空白的無效區(qū)域,按鈕一6*6區(qū)域,按鈕二9*9區(qū)域,按鈕三11*11區(qū)域。首先測試的是空白的無效區(qū)域,運行程序后,經(jīng)過多次的鼠標(biāo)點擊空白的無效區(qū)域,可以從實際使用中發(fā)現(xiàn),并沒有任何效果。而后測試三個按鈕區(qū)域。在調(diào)試過程中,可以發(fā)現(xiàn)三個區(qū)域判斷無誤,并且從變量區(qū)中,可以看到?jīng)Q定面板大小的變量ROWANDCOLUMN傳值正確,說明界面一的功能無誤。圖3.1即為面板選擇界面的圖示。圖3-1 面板選擇界面的運行圖3.2.2 界面二:難度選擇的相關(guān)測試針對面板二同樣需要測試鼠標(biāo)的相關(guān)點擊。具體區(qū)域可以劃分以下四個:空白的無效區(qū)域,按鈕一6*6區(qū)域,按鈕二9*9區(qū)域,按鈕三11*11區(qū)域。首先測試的是空白的無效區(qū)域,運行程序后,經(jīng)過多次的鼠標(biāo)點擊空白的無效區(qū)域,在調(diào)試過程中可以發(fā)現(xiàn),鼠標(biāo)位置的傳入正確,數(shù)值參數(shù)無誤。而后測試三個按鈕區(qū)域。在調(diào)試過程中,同樣可以發(fā)現(xiàn)三個區(qū)域判斷無誤,并且從變量區(qū)中,可以看到?jīng)Q定雷數(shù)的百分比根據(jù)10%,20%,30%的比例設(shè)置正確,決定雷數(shù)的變量MINENUM計算值正確,說明界面二的功能和數(shù)值無誤。圖3-2即為難度選擇界面的圖示。圖3-2 難度選擇界面的運行圖3.2.3 界面三:主界面的相關(guān)測試在界面三中具體需要測試的內(nèi)容有:(1) 面板的繪制是否與預(yù)期相符。(2) 雷的布置是否正確以及非雷區(qū)域的周邊雷數(shù)計算是否正確。(3) 鼠標(biāo)點擊的相關(guān)測試。(4) 游戲是否結(jié)束的判斷及游戲結(jié)束后的真實界面公示。首先需要測試面板的繪制是否與預(yù)期相符,這需要查看數(shù)值的傳入對于面板的大小的影響,因而通過多次使用界面一和界面二來初步觀察界面的格子數(shù)字是否與預(yù)期相符。圖3-3至圖3-5為不同選擇下面板的格子數(shù)與格子大小的變化。圖3-3 界面為6*6的運行初始主界面圖圖3-4 界面為9*9的運行初始主界面圖圖3-5 界面為11*11的運行初始主界面圖其次雷的布置以及非雷區(qū)域的周邊雷數(shù)計算是否正確。以下為6*6以及適中難度下的測試。在調(diào)試過程中,圖3-6為觀察變量區(qū)域status的初始狀態(tài),初始狀態(tài)時各變量均為0,與預(yù)期相符。圖3-7為設(shè)置雷以及非雷區(qū)域的計算結(jié)果,各變量經(jīng)過檢驗,均與預(yù)期吻合,測試結(jié)果正確。圖3-6 面板6*6適中難度的初始雷區(qū)數(shù)組圖圖3-7 面板6*6適中難度的布雷后數(shù)組變量變化圖鼠標(biāo)點擊的相關(guān)測試中需要確認的有:未點擊的位置進行點擊是否會正確顯示雷或數(shù)字;無效區(qū)域點擊是否會產(chǎn)生未知效果。在實際檢測中,在點擊空白空格后能夠正常顯示數(shù)字,若點擊范圍為雷區(qū),則正確顯示雷。在點擊無效區(qū)域時,棋盤沒有任何其他效果。在調(diào)試中,數(shù)值的傳入傳出與預(yù)期均相符。鼠標(biāo)點擊的結(jié)果,如圖3-8所示。圖3-8 界面為6*6簡單模式的游戲過程圖游戲是否結(jié)束的判斷及面板公示測試過程中,需要從兩方面考慮即:鼠標(biāo)點擊至雷區(qū),游戲失敗結(jié)束,并且打印失敗的信息;所有非雷區(qū)都被點開,游戲勝利,打印獲勝信息。因此從這兩方面單獨對編寫的程序進行測試。圖3-9為6*6面板大小簡單難度下的游戲失敗時的測試結(jié)果,該結(jié)果是用于測試點擊至雷區(qū)后是否游戲真正結(jié)束。在失敗后,正確打印了失敗的提示字符,并且此時鼠標(biāo)點擊任意位置均無效。圖3-10為游戲失敗后的棋盤公示畫面。圖3.11和圖3-12為6*6面板大小簡單難度下的游戲勝利的測試結(jié)果。圖3-11是在游戲過程中顯示各數(shù)字區(qū)域的畫面,圖3.12為游戲勝利之后提示的游戲勝利的畫面。圖3-13為游戲勝利后的棋盤公示畫面。以上測試說明游戲結(jié)束的判斷及面板公示正確。圖3-9 界面為6*6簡單模式的游戲失敗圖圖3-10 界面為6*6簡單模式的游戲結(jié)果公示圖圖3-11 界面為6*6簡單模式的游戲過程圖圖3-12 界面為6*6簡單模式的游戲勝利圖圖3-13 界面為6*6簡單模式的游戲結(jié)果公示圖第4章 總結(jié)與分析4.在本次實驗過程中,遇到的最大的問題是掃雷界面的制作以及對雷區(qū)和非雷區(qū)的布置和計算,即圖形的繪制以及實際數(shù)據(jù)的生成及匹配。在處理圖形問題的時候我選擇了使用Easy Graphics Engine的圖形庫,利用里面的函數(shù)來繪制圖形,具體操作時使用rectangle函數(shù)畫矩形,利用line函數(shù)繪制相關(guān)格子的線條,并使用鼠標(biāo)的相關(guān)函數(shù),來獲取鼠標(biāo)點擊的坐標(biāo)點,從而且確定范圍的有效性。在處理數(shù)據(jù)以及相關(guān)問題時,我的解決方案是,利用兩組二維數(shù)組來表示所有的格子。第一組二維數(shù)組status用于存放與雷相關(guān)的數(shù)據(jù),若為雷區(qū),則對應(yīng)數(shù)組的位置為-1,其余位置利用自定義的相關(guān)函數(shù)計算并存放周圍8個區(qū)域所存放的雷的個數(shù)。第二個二維數(shù)組openStatus用于存放鼠標(biāo)是否點擊的信息,若點擊則置1,未點擊則為0。該數(shù)組的作用是,若點擊前位置已被點擊一次,則不展示數(shù)組數(shù)據(jù),且點擊無效;若點擊前未曾點擊,則展示數(shù)組數(shù)據(jù),并將openStatus的相應(yīng)位置置1表示為已點擊。通過上述的幾個構(gòu)思之后,我解決了掃雷小程序設(shè)計的大部分問題,在后續(xù)的實現(xiàn)中也更好的解決了相關(guān)的問題,完成了項目設(shè)計的目標(biāo)。此次實驗中,我收獲了很多。從程序設(shè)計方面來說,首先需要需求分析,再進行總體的規(guī)劃,而后是局部的設(shè)計,最終再到代碼實現(xiàn),逐層遞進的方式,能夠?qū)栴}解決的較為簡便。同時我也學(xué)到了模塊化的思想,在具體完成設(shè)計的過程中,首先將各個界面相互獨立,使用對應(yīng)的類進行封裝,并分開編寫圖形界面與數(shù)據(jù)的實現(xiàn)。模塊化的思想能將功能局部分解,簡單實現(xiàn)。最后還懂得了獨立測試程序的方式,在測試程序時,需要考慮全面,不僅需要進行正確的測試,更要考慮到各種極端的情況,減少一些不易察覺的錯誤。參考文獻1. EGE圖形庫主站Easy Graphics Engine. , 2018.2. EGE 文檔與源代碼. /ege-open-source, 2018.3. EGE(Easy Graphics Engine)15.04. /manual, 2018.4. Easy Graphics Engine基礎(chǔ)教程. /category/lesson, 2018.5. 譚浩強. C+程序設(shè)計(第3版). 北京:清華大學(xué)出版社, 2015.6. 嚴蔚敏, 李冬梅, 吳偉民. 數(shù)據(jù)結(jié)構(gòu)(C語言版第2版). 北京:人民郵電出版社, 2015.7. 王紅梅, 胡明, 王濤. 數(shù)據(jù)結(jié)構(gòu)(C+版). 北京:清華大學(xué)出版社, 2011.8. 嚴蔚敏, 陳文博. 數(shù)據(jù)結(jié)構(gòu)及應(yīng)用算法教程(修訂版), 北京:清華大學(xué)出版社, 2011.9. 嚴蔚敏, 陳文博. 數(shù)據(jù)結(jié)構(gòu)及應(yīng)用算法教程(修訂版), 北京:清華大學(xué)出版社, 2011.10. Decoder. C/C+程序設(shè)計. 北京:中國鐵道出版社, 2002.11. 譚浩強. C+面向?qū)ο蟪绦蛟O(shè)計(第2版). 北京:清華大學(xué)出版社, 2014.附 錄1. 必選題題目使用折半插入排序的方法對10個數(shù)進行排序,按照要求畫流程圖,給出代碼及結(jié)果截圖。2. 流程圖圖附-1 排序算法流程圖3. 程序代碼#includeusing namespace std;void BInsertSort(int *arr,int length)for (int i = 1; i length; i+)int temp = arri;/ 需要插入的值存放入tempint low = 0;int high = i - 1;while (low = high)int mid =

溫馨提示

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

評論

0/150

提交評論