掃雷小程序設計_第1頁
掃雷小程序設計_第2頁
掃雷小程序設計_第3頁
掃雷小程序設計_第4頁
掃雷小程序設計_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目 錄第1章問題描述與分析11.1問題描述11.2問題分析1第2章算法設計與流程圖22.1算法設計22.2流程圖32.2.1總體流程圖32.2.2面板的選擇的流程圖42.2.3難度的選擇的流程圖52.2.4游戲主界面的流程圖6第3章編碼與測試83.1程序編碼83.1.1主函數程序代碼83.1.2面板選擇的類聲明及主要代碼83.1.3難度選擇的類聲明及主要代碼103.1.4游戲主界面的類聲明及主要代碼123.2測試結果153.2.1界面一:面板選擇的相關測試153.2.2界面二:難度選擇的相關測試163.2.3界面三:主界面的相關測試17第4章總結與分析24參考文獻25附 錄1.必選題題目262

2、.流程圖263.程序代碼274.測試結果28第1章 問題描述與分析1.1 問題描述掃地雷是一個廣泛游戲,掃地雷的游戲規(guī)則:掃雷就是要把所有非地雷的格子揭開即勝利;踩到地雷格子就算失敗。當鼠標點擊到棋盤范圍外時,視為無效,無響應。游戲主區(qū)域由很多個方格組成?;疽鬄椋?. 用程序設計分析思想對選題進行分析設計2. 用 C 語言對選題進行代碼實現測試要求為:1. 進行系統功能性測試,驗證基本功能實現情況。2. 進行邊界測試及特殊數據用例測試,驗證功能模塊的邏輯分支流程。1.2 問題分析仔細分析課題的要求并粗略分析可以得到大致得到:1. 選擇棋盤的大小(6*6, 9*9, 11*11)2. 選擇游

3、戲的難度(簡單10%的雷,一般20%的雷,困難30%的雷) 3. 繪制一個掃雷的面板。4. 根據鼠標點擊位置確定所點格子位置。5. 判斷格子是否是地雷,若為地雷則游戲結束。若非地雷顯示周圍8個格子所含地雷總數。6. 若所有非地雷的格子揭開,則勝利,否則一直循環(huán)進行2、3步。第2章 算法設計與流程圖2.2.1 算法設計掃雷游戲的設計可以從三方面進行考慮:1. 面板的選擇(BoardChoice)2. 難度的選擇(LevelChoice)3. 游戲主界面(Game)這三方面即為游戲進行的過程,大致可以畫出如圖2-1的模塊圖:圖2-1 掃雷游戲設計的模塊圖(1) 面板的選擇在該模塊中,需要決定面板的

4、大小,即每行每列有多少個格子。在設計時,個人決定使用6*6,9*9和11*11的格子面板。設計中,個人決定設置3個按鈕分別作為3種面板的選擇。在具體實現時,需要從兩方面進行考慮,即:位置確定和數據傳入。位置確定即為確定點擊位置是否有效,確定點擊位置與按鈕的關系。數據傳入即為確定按鈕后,將相應的6或9或11載入行列統計變量ROWANDCOLUMN中。(2) 難度的選擇在該模塊中,需要決定面板種雷的個數,面板中應包含多少的地雷。在設計時,個人決定使用10%,20%和30%的總格子數作為雷的總個數。設計中,個人決定設置3個按鈕分別作為3種面板的選擇。在具體實現時,需要從兩方面進行考慮,即:位置確定和

5、數據傳入。位置確定即為確定點擊位置是否有效,確定點擊位置與按鈕的關系。數據傳入即為確定按鈕后,將相應的雷數載入變量MINENUM中。(3) 游戲主界面游戲主界面的設計可以包含圖形的繪制模塊,鼠標區(qū)域的獲取模塊,數據的生成模塊。各部分包含的內容如下:a) 圖形的繪制 基礎線條的繪制 單個地雷的繪制 非雷區(qū)域的數字輸出 游戲結束后所有雷和數字的結果輸出b) 鼠標區(qū)域的獲取 有效性判斷 獲取鼠標區(qū)域將坐標轉換為可以使用的相應的數組數據c) 數據的生成 初始化數據 隨機位置設置雷 非雷區(qū)域計算相應數值2.2 流程圖2.2.1 總體流程圖函數的主流程圖如圖2-2。在該流程圖中,介紹了游戲的三個界面的切換

6、情況,三者為依次展示的狀態(tài),完成前一步驟后方可進入下一界面。圖2-2 程序的總流程圖2.2.2 面板的選擇的流程圖面板的選擇流程圖如圖2-3。在該流程圖中,介紹了面板大小選擇的流程,主要的部分為界面的繪制過程,鼠標點擊區(qū)域的判斷,以及相應數值的賦值。該過程是掃雷游戲的第一個界面。該流程的目的是為了傳入相應的參數,使得在游戲主界面時,能夠初始化相應數組以及繪制對應的界面。圖2-3 面板選擇的流程圖2.2.3 難度的選擇的流程圖難度的選擇流程圖如圖2-4。在該流程圖中,介紹了游戲難度的選擇流程,主要的部分為界面的繪制過程,鼠標點擊區(qū)域的判斷,以及相應數值的賦值。該過程是掃雷游戲的第二個界面。過程類

7、似于面板選擇的流程。該流程的目的是為了傳入相應的參數,使得在游戲主界面時,能夠初始化相應數組以及繪制對應的界面。圖2-4 難度選擇的流程圖2.2.4 游戲主界面的流程圖游戲主界面的流程圖如圖2-5。在該流程圖中,主要的操作為繪制相應的主界面面板,即多個格子。獲取鼠標點擊的位置,而后進行儲存數據的判斷,雷區(qū)與非雷區(qū)的判斷,游戲是否結束的判斷等等操作,相應的過程如下所示。圖2-5 游戲主界面的流程圖第3章 編碼與測試3.3.1 程序編碼程序的編碼部分可以分為四各模塊,即:主函數的程序部分,面板大小選擇部分,難度選擇部分,游戲主界面部分,每個部分內均可以分類編寫,互不干擾,以下為代碼的主要部分,詳細

8、代碼由于篇幅的限制,可以在附錄中查閱。3.1.1 主函數程序代碼#include#includeBoardChoice.h#includeLevelChoice.h#includeGame.hint ROWANDCOLUMN;/行列數int MINENUM;/ 雷數int CHESSSIZE;/ 格子大小int main()BoardChoice b1;/ 面板一b1.main();LevelChoice b2;/ 面板二b2.main();Game b3;/ 面板三b3.main();return 0;3.1.2 面板選擇的類聲明及主要代碼1. BoardChoice類的聲明class Bo

9、ardChoicepublic:void main();/ 面板控制private:void DrawBoard();/ 主界面繪制void ChoiceClick();/鼠標輸入;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(

10、100, 280, 300, 330);outtextxy(169, 93, 6 * 6);outtextxy(169, 193, 9 * 9);outtextxy(156, 293, 11 * 11);/ 鼠標輸入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 & statu

11、sx - 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 + 1

12、y + 1 = -1) num+;return num;/ 設置非雷區(qū)的周邊雷統計值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 測試結果本次課程設計中要求需要進行系統功能性測試,并且驗證基本功能實現情況。同時需要進行邊界測試及特殊數據用例測試,驗證功能模塊的邏輯分支流程。針對這些要求,我做了以下的測試。3.2.1 界面一:面板選擇的相關測試針對

13、面板一需要進行的測試為鼠標的相關測試。面板一可以劃分為以下四個區(qū)域:空白的無效區(qū)域,按鈕一6*6區(qū)域,按鈕二9*9區(qū)域,按鈕三11*11區(qū)域。首先測試的是空白的無效區(qū)域,運行程序后,經過多次的鼠標點擊空白的無效區(qū)域,可以從實際使用中發(fā)現,并沒有任何效果。而后測試三個按鈕區(qū)域。在調試過程中,可以發(fā)現三個區(qū)域判斷無誤,并且從變量區(qū)中,可以看到決定面板大小的變量ROWANDCOLUMN傳值正確,說明界面一的功能無誤。圖3.1即為面板選擇界面的圖示。圖3-1 面板選擇界面的運行圖3.2.2 界面二:難度選擇的相關測試針對面板二同樣需要測試鼠標的相關點擊。具體區(qū)域可以劃分以下四個:空白的無效區(qū)域,按鈕一

14、6*6區(qū)域,按鈕二9*9區(qū)域,按鈕三11*11區(qū)域。首先測試的是空白的無效區(qū)域,運行程序后,經過多次的鼠標點擊空白的無效區(qū)域,在調試過程中可以發(fā)現,鼠標位置的傳入正確,數值參數無誤。而后測試三個按鈕區(qū)域。在調試過程中,同樣可以發(fā)現三個區(qū)域判斷無誤,并且從變量區(qū)中,可以看到決定雷數的百分比根據10%,20%,30%的比例設置正確,決定雷數的變量MINENUM計算值正確,說明界面二的功能和數值無誤。圖3-2即為難度選擇界面的圖示。圖3-2 難度選擇界面的運行圖3.2.3 界面三:主界面的相關測試在界面三中具體需要測試的內容有:(1) 面板的繪制是否與預期相符。(2) 雷的布置是否正確以及非雷區(qū)域的

15、周邊雷數計算是否正確。(3) 鼠標點擊的相關測試。(4) 游戲是否結束的判斷及游戲結束后的真實界面公示。首先需要測試面板的繪制是否與預期相符,這需要查看數值的傳入對于面板的大小的影響,因而通過多次使用界面一和界面二來初步觀察界面的格子數字是否與預期相符。圖3-3至圖3-5為不同選擇下面板的格子數與格子大小的變化。圖3-3 界面為6*6的運行初始主界面圖圖3-4 界面為9*9的運行初始主界面圖圖3-5 界面為11*11的運行初始主界面圖其次雷的布置以及非雷區(qū)域的周邊雷數計算是否正確。以下為6*6以及適中難度下的測試。在調試過程中,圖3-6為觀察變量區(qū)域status的初始狀態(tài),初始狀態(tài)時各變量均為

16、0,與預期相符。圖3-7為設置雷以及非雷區(qū)域的計算結果,各變量經過檢驗,均與預期吻合,測試結果正確。圖3-6 面板6*6適中難度的初始雷區(qū)數組圖圖3-7 面板6*6適中難度的布雷后數組變量變化圖鼠標點擊的相關測試中需要確認的有:未點擊的位置進行點擊是否會正確顯示雷或數字;無效區(qū)域點擊是否會產生未知效果。在實際檢測中,在點擊空白空格后能夠正常顯示數字,若點擊范圍為雷區(qū),則正確顯示雷。在點擊無效區(qū)域時,棋盤沒有任何其他效果。在調試中,數值的傳入傳出與預期均相符。鼠標點擊的結果,如圖3-8所示。圖3-8 界面為6*6簡單模式的游戲過程圖游戲是否結束的判斷及面板公示測試過程中,需要從兩方面考慮即:鼠標

17、點擊至雷區(qū),游戲失敗結束,并且打印失敗的信息;所有非雷區(qū)都被點開,游戲勝利,打印獲勝信息。因此從這兩方面單獨對編寫的程序進行測試。圖3-9為6*6面板大小簡單難度下的游戲失敗時的測試結果,該結果是用于測試點擊至雷區(qū)后是否游戲真正結束。在失敗后,正確打印了失敗的提示字符,并且此時鼠標點擊任意位置均無效。圖3-10為游戲失敗后的棋盤公示畫面。圖3.11和圖3-12為6*6面板大小簡單難度下的游戲勝利的測試結果。圖3-11是在游戲過程中顯示各數字區(qū)域的畫面,圖3.12為游戲勝利之后提示的游戲勝利的畫面。圖3-13為游戲勝利后的棋盤公示畫面。以上測試說明游戲結束的判斷及面板公示正確。圖3-9 界面為6

18、*6簡單模式的游戲失敗圖圖3-10 界面為6*6簡單模式的游戲結果公示圖圖3-11 界面為6*6簡單模式的游戲過程圖圖3-12 界面為6*6簡單模式的游戲勝利圖圖3-13 界面為6*6簡單模式的游戲結果公示圖第4章 總結與分析4.在本次實驗過程中,遇到的最大的問題是掃雷界面的制作以及對雷區(qū)和非雷區(qū)的布置和計算,即圖形的繪制以及實際數據的生成及匹配。在處理圖形問題的時候我選擇了使用Easy Graphics Engine的圖形庫,利用里面的函數來繪制圖形,具體操作時使用rectangle函數畫矩形,利用line函數繪制相關格子的線條,并使用鼠標的相關函數,來獲取鼠標點擊的坐標點,從而且確定范圍的

19、有效性。在處理數據以及相關問題時,我的解決方案是,利用兩組二維數組來表示所有的格子。第一組二維數組status用于存放與雷相關的數據,若為雷區(qū),則對應數組的位置為-1,其余位置利用自定義的相關函數計算并存放周圍8個區(qū)域所存放的雷的個數。第二個二維數組openStatus用于存放鼠標是否點擊的信息,若點擊則置1,未點擊則為0。該數組的作用是,若點擊前位置已被點擊一次,則不展示數組數據,且點擊無效;若點擊前未曾點擊,則展示數組數據,并將openStatus的相應位置置1表示為已點擊。通過上述的幾個構思之后,我解決了掃雷小程序設計的大部分問題,在后續(xù)的實現中也更好的解決了相關的問題,完成了項目設計的

20、目標。此次實驗中,我收獲了很多。從程序設計方面來說,首先需要需求分析,再進行總體的規(guī)劃,而后是局部的設計,最終再到代碼實現,逐層遞進的方式,能夠將問題解決的較為簡便。同時我也學到了模塊化的思想,在具體完成設計的過程中,首先將各個界面相互獨立,使用對應的類進行封裝,并分開編寫圖形界面與數據的實現。模塊化的思想能將功能局部分解,簡單實現。最后還懂得了獨立測試程序的方式,在測試程序時,需要考慮全面,不僅需要進行正確的測試,更要考慮到各種極端的情況,減少一些不易察覺的錯誤。參考文獻1. EGE圖形庫主站Easy Graphics Engine. , 2018.2.

21、EGE 文檔與源代碼. /ege-open-source, 2018.3. EGE(Easy Graphics Engine)15.04. /manual, 2018.4. Easy Graphics Engine基礎教程. /category/lesson, 2018.5. 譚浩強. C+程序設計(第3版). 北京:清華大學出版社, 2015.6. 嚴蔚敏, 李冬梅, 吳偉民. 數據結構(C語言版第2版). 北京:人民郵電出版社, 2015.7. 王紅梅, 胡明, 王濤. 數據結構(C+版). 北京:清華大學

22、出版社, 2011.8. 嚴蔚敏, 陳文博. 數據結構及應用算法教程(修訂版), 北京:清華大學出版社, 2011.9. 嚴蔚敏, 陳文博. 數據結構及應用算法教程(修訂版), 北京:清華大學出版社, 2011.10. Decoder. C/C+程序設計. 北京:中國鐵道出版社, 2002.11. 譚浩強. C+面向對象程序設計(第2版). 北京:清華大學出版社, 2014.附 錄1. 必選題題目使用折半插入排序的方法對10個數進行排序,按照要求畫流程圖,給出代碼及結果截圖。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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論