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