版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 掃 雷 游 戲</b></p><p><b> 課程設計報告</b></p><p> 學 院:信息科學與工程學院</p><p> 專業(yè)名稱:計算機科學與技術</p><p> 課程名稱:程序設計實訓</p><p> 設計題目:掃雷
2、游戲</p><p> 學生姓名:</p><p> 指導教師:</p><p> 時 間:2012年12月</p><p><b> 摘 要 </b></p><p> 隨著時代的發(fā)展,電腦進入了普通老百姓的生活,越來越多的人使用電腦辦公、娛樂、上網,游戲行業(yè)發(fā)展一日千里,該行業(yè)極大的
3、影響和改變了人們的生活和娛樂方式,游戲為消費者提供豐富多彩的虛擬空間,使消費者可以自由自在的享受虛擬世界的樂趣,實現自己在現實生活著那個可能永遠不能實現的夢想,滿足了消費者的心理和精神需求。</p><p> 掃雷游戲是Windows操作系統(tǒng)自帶的一款小游戲, 本系統(tǒng)要是模仿WINDOWS系統(tǒng)的掃雷,對于實現過程中出現的bug進行調試解決。我這里用的是C#編寫了與它功能相似的掃雷游戲。</p>&
4、lt;p> 程序的功能是隨機生成地雷數,通過鼠標操作玩游戲,不接受鍵盤,按任意鍵結束程序。單擊屏幕上的笑臉可以重新開始游戲。當鼠標左鍵單擊到地雷時提示游戲失敗。報告首先介紹了進行該游戲課程設計的目的,然后是任務描述和設計的相關要求,最后是最重要的需求分析和設計方案。重點介紹了在游戲過程中各事件的處理,其中又以鼠標事件和清除未靠近地雷區(qū)方塊這兩方面最為最要,鼠標事件是利用鼠標所發(fā)出的信息了解用戶的意圖,進而做出相對應的動作。清除未
5、靠近地雷區(qū)的方塊較為復雜。</p><p> 關鍵詞:掃雷游戲;算法設計;事件;c#</p><p><b> 目 錄</b></p><p><b> 摘 要2</b></p><p> 第一章 課程設計目的與要求1</p><p><b> 1.1
6、目的1</b></p><p><b> 1.2要求1</b></p><p> 第二章 需求分析2</p><p><b> 3.1功能描述2</b></p><p><b> 3.2功能需求2</b></p><p>
7、 3.3 功能模塊3</p><p> 第三章 設計方案4</p><p><b> 3.1總體設計4</b></p><p><b> 3.2詳細設計5</b></p><p><b> 總 結11</b></p><p><b
8、> 參考文獻12</b></p><p> 第一章 課程設計目的與要求</p><p><b> 1.1目的</b></p><p> 本課程設計是計算機科學與技術專業(yè)重要的實踐性環(huán)節(jié)之一,是對本課程學習后進行的一次全面而綜合的練習。本次課程設計的目的主要有:</p><p> 1.鞏固和加
9、深學生對C#的基本知識的理解與掌握。</p><p> 2.掌握C#語言編程和調試的基本技能</p><p> 3.運用C#語言對程序的簡單設計</p><p> 4.掌握程序設計說明文檔的能力與技巧</p><p> 5.讓學生掌握較為簡單的算法分析能力</p><p><b> 1.2要求<
10、;/b></p><p> ?。?)需要為Windows操作系統(tǒng)的用戶設計完成一款掃雷游戲,這是一個根據某種算法自動布雷,有用戶掃雷的小軟件;</p><p> (2)本游戲由每個學生單獨完成,完成時間大概7周時間,開發(fā)成本低,易于完成;</p><p> (3)設計過程中,前兩周,對整個游戲所實現的功能進行詳細的設計以及對存在的問題及解決辦法進行最終確定
11、;3-5周完成游戲的程序編寫,并優(yōu)化;最后兩周,寫出設計本游戲的詳細文檔說明,并作課程設計匯報。</p><p><b> 第二章 需求分析</b></p><p> 需求分析的主要任務即詳細的找出程序所需要的各種功能實現,是對系統(tǒng)功能進一步分析和抽象,以確定系統(tǒng)應當做什么的問題,從而完成系統(tǒng)的邏輯設計。本程序為掃雷游戲的實現,首先是要實現掃雷游戲的基本功能,根據
12、掃雷游戲的玩法,設計程序,實現程序功能。本系統(tǒng)需求分析分為四個部分:功能描述、功能需求、功能模塊和系統(tǒng)需求分析報告。</p><p><b> 3.1功能描述</b></p><p> 按功能將游戲區(qū)域分成兩個區(qū)域:雷區(qū)和提示區(qū)。提示區(qū)包括計雷器、計時器和一個笑臉的按鍵操作。游戲過程中,當用戶用鼠標點擊相應的方塊,程序就會作出相應的鼠標事件,而鼠標事件的處理都是由
13、掃雷程序實現的。</p><p> 游戲開始時,系統(tǒng)會在雷區(qū)的某些小方塊中隨機布下若干個地雷。安放地雷的方塊稱為雷方塊,其他的稱為非雷方塊。布完雷后,系統(tǒng)會在其他非雷方塊中填充一些數字。某一個具體數字表示與其緊鄰的8個方塊中有多少個雷。用戶可以根據這些數字判斷是否可以打開某些方塊,并把認為有地雷的方塊標識地圖。如果某個數字方塊周圍的地雷全都標記完,可以單擊鼠標左鍵,將其周圍剩下的方塊挖開。</p>
14、<p> 如果數字周圍地雷沒有全部標記,在同時單擊鼠標左右鍵時,其他隱藏或未標記的方塊將被按下一次。當用戶將所有地雷挖出后,其余的非雷方塊區(qū)域都已打開,此時游戲勝利。在游戲過程中,一旦錯誤地打開了雷方塊則游戲失敗,游戲結束;當用戶標識的地雷數超過程序設定,雖然打開了全部其余方塊,游戲仍然不會結束。</p><p><b> 3.2功能需求</b></p><
15、;p> ?。?)提示區(qū)左側顯示總雷數,并減去被標明有雷區(qū)域的數目;</p><p> ?。?)提示區(qū)中間位置顯示笑臉按鈕用于開局和顯示鼠標動作的結果;</p><p> ?。?)提示區(qū)右側顯示掃雷所用的時間;</p><p> ?。?)單擊鼠標左鍵于未知區(qū)域,如果未知區(qū)域有雷,游戲結束,顯示所有的地雷;如果沒有雷,則顯示周圍雷數,如果周圍沒雷,則再查看周圍八個
16、區(qū)域是否有雷直到有雷為止,并顯示周圍雷的數目; </p><p> (5)單擊鼠標右鍵于未知區(qū)域,則顯示小紅旗,將其標識有雷。在該位置再次單擊右鍵則取消;</p><p> ?。?)如果該數字方塊周圍地雷已經完全標識出,雙擊該數字所在方塊,將快速翻開所有周圍不是地雷的方塊,并顯示,直到有雷為止;</p><p> ?。?)將雷全部掃完后,會出現一個提示框,顯示游戲
17、勝利</p><p><b> 3.3 功能模塊</b></p><p><b> (1)游戲界面</b></p><p><b> ?。?)布雷</b></p><p><b> ?。?)鼠標事件</b></p><p>&l
18、t;b> ?。?)地雷判斷</b></p><p> (5)游戲勝利(結束)</p><p> ?。?)游戲失敗(結束)</p><p><b> 第三章 設計方案</b></p><p><b> 3.1總體設計</b></p><p> 3.1.
19、1 功能設計</p><p> 實現功能包括:布局格子,布雷,判斷游戲完成或失敗,鼠標事件(左鍵單擊、右鍵單擊)</p><p> 3.1.2 游戲流程設計</p><p> 游戲詳細運行流程如圖3-3-1所示</p><p><b> 圖3-3-1流程圖</b></p><p><
20、b> 3.2詳細設計</b></p><p> 3.2.1 界面設計</p><p> 1.初始界面如圖3-2-1所示</p><p> 圖3-2-1 初始界面</p><p> 2.游戲中如圖3-2-2</p><p> 圖3-2-2 游戲圖</p><p>
21、 3.游戲失敗如圖:3-2-3</p><p> 圖3-2-3 失敗圖</p><p> 4.游戲勝利如圖:3-2-4</p><p> 圖3-2-4 勝利圖</p><p> 3.2.2功能代碼</p><p><b> 1、給游戲布雷</b></p><p>
22、; private void LayMines()</p><p><b> {</b></p><p><b> int x, y;</b></p><p> Random s = new Random();</p><p><b> //取隨機數</b></
23、p><p> for (int i = 0; i < MineNum;)</p><p><b> {</b></p><p><b> //取隨機數</b></p><p> x = s.Next(XNum);</p><p> y = s.Next(YNum)
24、;</p><p> if (Convert.ToInt16(Mines[x, y].Tag) != 1)</p><p><b> {</b></p><p> //==1時,代表這個位置是地雷</p><p> Mines[x, y].Tag = 1; //修改屬性為雷</p><p>
25、; //Mines[x, y].Text = "u";</p><p><b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p&
26、gt;<p> 2、獲取某個小方塊區(qū)域相鄰8個區(qū)域的雷個數</p><p> private int GetAroundNum(int row, int col)</p><p><b> {</b></p><p><b> int i, j;</b></p><p> i
27、nt around = 0;</p><p> int minRow = (row == 0) ? 0 : row - 1;</p><p> int maxRow = row + 2;</p><p> int minCol = (col == 0) ? 0 : col - 1;</p><p> int maxCol = col
28、+ 2;</p><p> for (i = minRow; i < maxRow; i++)</p><p><b> {</b></p><p> for (j = minCol; j < maxCol; j++)</p><p><b> {</b></p>
29、<p> if (!IsInMineArea(i, j)) //判斷是否在掃雷區(qū)域</p><p><b> continue;</b></p><p> if (Convert.ToInt16(Mines[i, j].Tag) == 1) around++;</p><p><b> }</b><
30、/p><p><b> }</b></p><p> return around;</p><p><b> }</b></p><p> 3、判斷是否在掃雷區(qū)域</p><p> private bool IsInMineArea(int row, int col)&
31、lt;/p><p><b> {</b></p><p> return (row >= 0 && row < XNum && col >= 0 && col < YNum);</p><p><b> }</b></p><p&
32、gt; ///雷方塊拓展(對于周圍無雷的空白區(qū)域)</p><p> private void ExpandMines(int row, int col)</p><p><b> {</b></p><p><b> int i, j;</b></p><p> int minRow =
33、 (row == 0) ? 0 : row - 1;</p><p> int maxRow = row + 2;</p><p> int minCol = (col == 0) ? 0 : col - 1;</p><p> int maxCol = col + 2;</p><p> int around = GetAround
34、Num(row, col);</p><p> //對周圍一個雷都沒有的空白區(qū)域拓展</p><p> if (around == 0)</p><p><b> {</b></p><p> Mines[row, col].Enabled = false;</p><p> for (
35、i = minRow; i < maxRow; i++)</p><p><b> {</b></p><p> for (j = minCol; j < maxCol; j++)</p><p><b> {</b></p><p> //對于周圍可以拓展的區(qū)域進行的規(guī)拓展
36、</p><p> if (!IsInMineArea(i, j)) continue;</p><p> if (!(i == row && j == col) && Mines[i, j].Enabled)</p><p> //&& Convert.ToInt16(Mines[i,j].Tag)!= 1&
37、lt;/p><p><b> {</b></p><p> ExpandMines(i, j);</p><p><b> }</b></p><p> Mines[i, j].Enabled = false; //周圍無雷的區(qū)域按鈕無效</p><p> if (Ge
38、tAroundNum(i, j) != 0) //周圍無雷**********6--28</p><p> Mines[i, j].Text = GetAroundNum(i, j).ToString();</p><p><b> }</b></p><p><b> }</b></p><p&
39、gt;<b> }</b></p><p><b> }</b></p><p><b> 4、勝利判斷并處理</b></p><p> private bool Victory() // 檢測是否勝利</p><p><b> {</b><
40、;/p><p> for (int i = 0; i < XNum; i++)</p><p> for (int j = 0; j < YNum; j++)</p><p><b> {</b></p><p> //沒翻開且未標示,則未成功</p><p> if (Mine
41、s[i, j].Enabled && Turn[i, j] != 1) return false;</p><p> //不是雷卻誤標示為雷,則也未成功</p><p> if (Convert.ToInt16(Mines[i, j].Tag) != 1 && Turn[i, j] == 1) return false;</p><p
42、><b> }</b></p><p> return true;</p><p><b> }</b></p><p><b> 5、鼠標事件</b></p><p> private void bt_MouseUp(object sender, MouseE
43、ventArgs e) //這里處理事件方法</p><p><b> {</b></p><p> String btName;</p><p> Button bClick = (Button) sender; //將被擊的按鈕賦給定義的bClick變量</p><p> btName = bClick.Na
44、me; //獲取按鈕的Name</p><p> int n = Convert.ToInt16(btName.Substring(5));</p><p> int x = n%XNum;</p><p> int y = n/XNum;</p><p> //通過按鈕Name屬性來判斷是哪個Button被點擊,并執(zhí)行相應的操作&l
45、t;/p><p> switch (e.Button)</p><p><b> {</b></p><p> case MouseButtons.Left:</p><p> if (Convert.ToInt16(Mines[x, y].Tag) != 1) //不是雷</p><p>&
46、lt;b> {</b></p><p> Mines[x, y].BackgroundImage = null;</p><p> Mines[x, y].Text = GetAroundNum(x, y).ToString();</p><p> Mines[x, y].Enabled = false;</p><p&
47、gt; ExpandMines(x, y); //完成無雷拓展</p><p> if (Victory())</p><p><b> {</b></p><p> // 判斷是否勝利,是則將地圖中所有雷標識出來</p><p><b> show();</b></p>&
48、lt;p> MessageBox.Show("勝利!!!", "結束");</p><p> timer1.Enabled = false; //停止計時</p><p><b> }</b></p><p><b> }</b></p><p>
49、;<b> else //觸雷</b></p><p><b> {</b></p><p> Mines[x, y].BackgroundImage = Image.FromFile("mine1.bmp");</p><p> MessageBox.Show("失敗!!!"
50、;, "結束");</p><p> timer1.Enabled = false; //停止計時</p><p> show(); //將地圖中所有雷標識出來</p><p><b> }</b></p><p><b> break;</b></p>&
51、lt;p> case MouseButtons.Right:</p><p> Mines[x, y].BackgroundImage = Image.FromFile("flag.bmp");</p><p> if (Turn[x, y] == 1) //表示這個位置插上紅旗</p><p><b> {</b&
52、gt;</p><p> Turn[x, y] = 0; //取消紅旗,表示這個位置沒有翻開</p><p> RestMine++;</p><p> Mines[x, y].BackgroundImage = null;</p><p><b> }</b></p><p><b
53、> else</b></p><p><b> {</b></p><p> Turn[x, y] = 1; //表示這個位置插上紅旗</p><p> RestMine--;</p><p><b> }</b></p><p> lblMin
54、e.Text = RestMine.ToString();</p><p> if (Victory())</p><p><b> {</b></p><p> MessageBox.Show("勝利!!!", "結束");</p><p> timer1.Enabled
55、 = false; //停止計時</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b&
56、gt; 總 結</b></p><p> 從高中的時候就開始玩掃雷了,但一直不知道是怎么做出來的,這次借著這次課程設計自己做了一個掃雷,說實話心里很開心,有成就感,這個掃雷程序主要是用C# 做成的,在期間遇到了許多問題,如怎么給頁面布局,怎么接收鼠標事件,怎么布雷,怎么判斷是否有雷,其中通過問同學,老師,和自己查找資料一一解決,發(fā)現要做一個程序,首先得在自己的腦海里面有個大概的思路,怎么去做,所以
57、得先寫一個需求分析,使自己大概知道往哪個方向去做,要做些什么東西,再去查詢相應的資料,來解決具體的問題,其次就是一些概率的設計和邏輯結構了,通過合理的方法設計去最優(yōu)的程序。在做這個過程中使我復習了C#一些控件的使用,其及具體的算法,</p><p> 在整個過程中,深深的感謝隊友的共同協作,與老師的指導及在網絡上提供各種解決各類的問題答案的朋友們,正是因為有了這種集約的知識技能,鼓勵與提醒,才能遇到問題后進行很
58、好的解決。這才是真正意義上的團隊精神吧。還有源于客觀方面的感受,那就是知識的欠缺,與開發(fā)工具的掌握不熟練。這是整個開發(fā)過程中的瓶頸。但也正是因為這份瓶頸,而使得我們在完成后,有了跨越式的提升與收獲。較重要的是實踐操作經驗的積累,這是平常無可替代的。</p><p> 總的來說,是感謝,感謝此次課程設計,及此次課程設計所涉及到的老師、同學、朋友以及網絡上不認識的人及知識。感謝你們。參考文獻</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論