版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p> 課程名稱:程序設(shè)計實訓(xùn)(2)</p><p> 報告題目:連連看游戲的開發(fā)</p><p><b> 學(xué)生姓名: </b></p><p> 所在學(xué)院:信息科學(xué)與工程學(xué)院</p><p> 專業(yè)班
2、級:計科1002班</p><p><b> 學(xué)生學(xué)號:</b></p><p><b> 指導(dǎo)教師: </b></p><p> 2013年6月25日</p><p><b> 課程設(shè)計任務(wù)書</b></p><p><b> 摘
3、 要</b></p><p> 在計算機(jī)逐步滲入社會生活各個層面的今天,計算機(jī)已經(jīng)成為人們?nèi)粘I畈豢苫蛉钡囊徊糠?,越來越多的人使用計算機(jī)辦公、娛樂、購物等等。游戲行業(yè)發(fā)展一日千里,該行業(yè)極大的影響和改變了人們的生活和娛樂方式,游戲為消費者提供豐富多彩的虛擬空間,使消費者可以自由自在的享受虛擬世界的樂趣,實現(xiàn)自己在現(xiàn)實生活著那個可能永遠(yuǎn)不能實現(xiàn)的夢想,滿足了消費者的心理和精神需求。</p>
4、;<p> 連連看游戲是一款很流行的小游戲,有的是連水果圖片,有的是連麻將牌,有的是連各種小圖片的等等。各種圖片讓人看得眼花繚亂,這也可以鍛煉人的反應(yīng)能力和眼力,所以這款小游戲受到了越來越多人的喜愛,尤其是小孩子的喜愛。連連看游戲也是比較經(jīng)典的一款小游戲,實現(xiàn)它的方法很多,可以用很多不同算法設(shè)計和語言實現(xiàn),如C,C#,C++,VB,JAVA等。在本課程設(shè)計中我是利用C#語言編寫,開發(fā)平臺是Microsoft Visual
5、 Studio 2010,功能較為簡單,寓學(xué)于樂。</p><p> 程序的功能是通過找出游戲中兩個相同圖案的小方塊,然后分別點擊兩個小方塊將其消除;可通過倒計時的方式控制游戲時間,游戲時間到或者沒有匹配的圖案時則游戲結(jié)束,需要重新開局,每一局開始倒計時都重新開始;能夠響應(yīng)鼠標(biāo)事件。論文首先介紹了進(jìn)行該游戲課程設(shè)計的目的,然后是任務(wù)描述和設(shè)計的相關(guān)要求,最后是最重要的需求分析和設(shè)計方案。重點介紹了在游戲過程中各
6、種事件的處理,其中又以鼠標(biāo)事件的處理最為最要,鼠標(biāo)事件是利用鼠標(biāo)所發(fā)出的信息了解用戶的意圖,進(jìn)而做出相對應(yīng)的動作,消除需要消除的小方塊。</p><p> 關(guān)鍵詞:連連看游戲;算法設(shè)計;事件;C#;Microsoft Visual Studio 2010</p><p><b> 目 錄</b></p><p><b> 摘
7、 要I</b></p><p> 一、課程設(shè)計目的1</p><p> 二、任務(wù)描述和要求2</p><p> 2.1 問題描述2</p><p> 2.2 任務(wù)描述2</p><p> 2.3 設(shè)計要求3</p><p><b> 三、需求分析
8、4</b></p><p><b> 3.1功能分析4</b></p><p><b> 3.2功能需求4</b></p><p> 3.3 功能模塊5</p><p> 3.4系統(tǒng)需求分析總結(jié)6</p><p><b> 四、設(shè)計方案
9、7</b></p><p> 4.1 總體設(shè)計7</p><p> 4.1.1 系統(tǒng)基本功能7</p><p> 4.1.2 系統(tǒng)流程8</p><p> 4.1.3 主要功能模塊10</p><p> 4.2 詳細(xì)設(shè)計10</p><p> 4.2.1 規(guī)則
10、詳解10</p><p> 4.2.2部分程序代碼解析11</p><p> 4.2.3運行結(jié)果分析16</p><p><b> 五、總結(jié)20</b></p><p><b> 六、參考文獻(xiàn)21</b></p><p><b> 一、課程設(shè)計目
11、的</b></p><p> 《程序設(shè)計實訓(xùn)》課程是是計算機(jī)科學(xué)與技術(shù)專業(yè)重要的實踐性課程之一,其實踐性和應(yīng)用性都很強。本課程設(shè)計是對這門課程經(jīng)過一個學(xué)期的學(xué)習(xí)后進(jìn)行的一次全面而綜合的練習(xí)。C#程序設(shè)計的設(shè)計目的就是加深理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較系統(tǒng)地掌握程序設(shè)計及其在軟件開發(fā)的廣泛應(yīng)用,同時也是為后續(xù)各門計算機(jī)課程的學(xué)習(xí)和畢業(yè)設(shè)計打下基礎(chǔ)。本次課程設(shè)計的目的主要有:</p>
12、<p> (1)鞏固和加深學(xué)生對C#的基本知識和語法的理解與掌握;</p><p> ?。?)掌握C#語言編程和調(diào)試的基本技能;</p><p> ?。?)運用C#語言對程序進(jìn)行簡單的框架設(shè)計;</p><p> (4)讓學(xué)生掌握較為簡單的算法分析能力;</p><p> ?。?)提高與運用C#語言能解決實際問題的能力。<
13、/p><p> ?。?)更深入地理解和掌握該課程中的有關(guān)基本概念,程序設(shè)計思想和方法。</p><p> ?。?)對掌握知識的深度、運用理論去處理問題的能力、實驗?zāi)芰?、課程設(shè)計能力進(jìn)行考核。</p><p> ?。?)培養(yǎng)學(xué)生綜合運用所學(xué)知識獨立完成課題的能力。</p><p> ?。?)掌握程序設(shè)計說明文檔的能力與技巧;</p>
14、<p><b> 二、任務(wù)描述和要求</b></p><p> 本章主要內(nèi)容包括本課程設(shè)計的任務(wù)描述和設(shè)計要求兩大模塊。任務(wù)描述主要是介紹在課程設(shè)計的整個過程的任務(wù)流程和時間規(guī)劃等;設(shè)計要求是提出課程設(shè)計過程中要注意的一些細(xì)節(jié)問題。</p><p><b> 2.1 問題描述</b></p><p> 連
15、連看游戲,用戶需要找出游戲中相同的兩個方塊,用鼠標(biāo)分別點擊兩個相同的小方塊,如果它們之間的連接線不超過三條直線,就可以將著兩個小方塊消掉,當(dāng)游戲中沒有滿足條件的圖案時,還可以實現(xiàn)重新排列的功能,即點擊“重列”按鈕就可以重新排列本局游戲中剩余的圖案,但計時器還是會繼續(xù)計時,在游戲結(jié)束時能夠看到最后的得分。</p><p><b> 2.2 任務(wù)描述</b></p><p&
16、gt; 隨著人們工作壓力變得越來越大,現(xiàn)如今更多的人開始通過玩游戲來排解內(nèi)心的壓力,而各種各樣的游戲也排入市場,一些大型網(wǎng)絡(luò)游戲更是一些年輕用戶的最愛,所有連連看游戲面對市場的競爭壓力還是非常大的。</p><p> 分析連連看游戲的游戲規(guī)則,查找規(guī)則并對主要功能進(jìn)行模仿程序?qū)崿F(xiàn),對于實現(xiàn)過程中出現(xiàn)的bug進(jìn)行調(diào)試解決。</p><p> 經(jīng)過對連連看游戲的初步分析,游戲含有如下規(guī)則
17、:</p><p> 根據(jù)用戶執(zhí)行的鼠標(biāo)事件,做出相應(yīng)的消除操作。在檢驗兩個小方塊能否消掉的時候,要讓兩個小方塊同時滿足兩個條件才行,就是兩者配對并且連線成功。如果要配對并且連線成功又要分為三種情況,也就是檢測三種情況。這三種檢測分別檢測一條直路徑,這樣就會有三條路徑;如果這三條路徑上面都是空的小方塊,那么就剛好是三條直線把兩個小方塊連接起來了。要讓兩個小方塊連接起來,一條路徑最多不能超過三條直線,也就是最多只
18、能有兩個轉(zhuǎn)彎。</p><p><b> 具體任務(wù)如下:</b></p><p> ?。?)本課題為連連看游戲的開發(fā);</p><p> ?。?)需要為Windows操作系統(tǒng)的用戶設(shè)計完成一款連連看游戲,這是一個根據(jù)某種算法隨機(jī)排列具有不同圖案的小方塊,并形成一個友好的用戶界面,供用戶娛樂之用的小軟件;</p><p>
19、; ?。?)本游戲在難度設(shè)置上跟傳統(tǒng)的小游戲有點區(qū)別,不是分為初、中、高三個難度等級,而是一個已經(jīng)固定的難度,即每局游戲的圖案種類數(shù)為20種,每種圖案的重復(fù)數(shù)為4對;</p><p> ?。?)程序模塊清晰,具有較好的人機(jī)交互能力,核心代碼需要加上必要的注釋,以便用戶能夠很快讀懂本游戲的集體實現(xiàn)過程;</p><p> ?。?)設(shè)計過程中,前兩周,對整個游戲所實現(xiàn)的功能進(jìn)行詳細(xì)的設(shè)計以及對
20、存在的問題及解決辦法進(jìn)行最終確定;一周完成游戲的程序編寫,并優(yōu)化;最后一周,寫出設(shè)計本游戲的詳細(xì)文檔說明,并作課程設(shè)計匯報;</p><p> ?。?)連連看游戲課程設(shè)計實現(xiàn)流程圖如圖2.1所示:</p><p> 圖2.1 課程實現(xiàn)流程圖</p><p> 圖2.1描述了整個課程設(shè)計的實現(xiàn)流程。前期工作是制定規(guī)則和設(shè)計算法,這一階段主要任務(wù)是搜集相關(guān)資料,然后
21、根據(jù)搜集到的資料結(jié)合自己所學(xué)知識制定系統(tǒng)實現(xiàn)算法;中期工作是算法實現(xiàn)和調(diào)試系統(tǒng),這一階段主要任務(wù)是完成算法的實現(xiàn),然后進(jìn)行調(diào)試和優(yōu)化系統(tǒng);后期工作是對數(shù)據(jù)結(jié)果進(jìn)行分析,然后完成課程設(shè)計報告。</p><p><b> 2.3 設(shè)計要求</b></p><p> 按照指導(dǎo)老師對課程設(shè)計的要求,學(xué)生要自行完成各個環(huán)節(jié),并且實現(xiàn)且達(dá)到靈活運用的目的,要求能夠全面深入理解
22、和熟練掌握所學(xué)的內(nèi)容,能夠分析、設(shè)計和解答各類專業(yè)問題。</p><p> (1)系統(tǒng)需求分析,對系統(tǒng)中需要實現(xiàn)的功能進(jìn)行具體分析和設(shè)計;</p><p> ?。?)采用結(jié)構(gòu)化、模塊化程序設(shè)計思想設(shè)計;</p><p> ?。?)理解連連看游戲玩法的特點,并分析玩法的實現(xiàn)功能;</p><p> ?。?)設(shè)計是否消除相同小方塊的判斷算法;&
23、lt;/p><p> ?。?)游戲“暫停/重新開始”的實現(xiàn)方法;</p><p> ?。?)進(jìn)行概念設(shè)計和邏輯結(jié)構(gòu)設(shè)計,以便使系統(tǒng)實現(xiàn)進(jìn)展順利;</p><p> ?。?)進(jìn)行詳細(xì)的設(shè)計方案,包括總體設(shè)計和詳細(xì)設(shè)計,這包括程序設(shè)計代碼的分析和系統(tǒng)運行界面截圖的分析;</p><p> ?。?)要求人機(jī)交互性較強,界面較美觀;設(shè)計方案和執(zhí)行結(jié)果的分
24、析總結(jié)。</p><p><b> 三、需求分析</b></p><p> 需求分析的主要任務(wù)即詳細(xì)的找出程序所需要的各種功能實現(xiàn),是對系統(tǒng)功能進(jìn)一步分析和抽象,以確定系統(tǒng)應(yīng)當(dāng)做什么的問題,從而完成系統(tǒng)的邏輯設(shè)計。本課程設(shè)計是連連看游戲的實現(xiàn),首先是要實現(xiàn)連連看游戲的基本功能,根據(jù)連連看游戲的玩法,設(shè)計程序,實現(xiàn)程序功能。本系統(tǒng)需求分析分為四個部分:功能分析、功能
25、需求、功能模塊和系統(tǒng)需求分析報告。</p><p><b> 3.1功能分析</b></p><p> 每次用戶選擇兩個相同的小方塊,如果小方塊滿足一定條件(這兩個小方塊之間存在轉(zhuǎn)彎少于3的路徑),則兩個小方塊可以消掉,給定任意具有相同圖案的兩個小方塊,用戶需要尋找這兩個小方塊之間在轉(zhuǎn)彎最少的情況下,如果這個最優(yōu)路徑的轉(zhuǎn)彎數(shù)目小于3,則這兩個小方塊可以消掉。所以,
26、主要需要解決的問題就是怎么樣得出相同小方塊之間的最優(yōu)路徑,這個最優(yōu)路徑首先需要保證轉(zhuǎn)彎數(shù)目最少。</p><p> 游戲開始時,系統(tǒng)會在游戲區(qū)域中隨機(jī)布下20*4個不同圖案的小方塊。第一次使用鼠標(biāo)點擊游戲界面中的小方塊,該小方塊此時為"被選中"狀態(tài),再次用鼠標(biāo)點擊其他小方塊,若該小方塊與被選中的小方塊圖案相同,且把第一個小方塊到第二個小方塊連起來,連線的路徑中間的直線不超過 3 根(最多兩次
27、轉(zhuǎn)彎),則消掉這一對小方塊,否則第一個小方塊恢復(fù)成未被選中狀態(tài),而第二個小方塊變成“被選中”狀態(tài)。每次消除一對小方塊會增加一定的時間。</p><p> 勝利條件:將游戲區(qū)域上的小方塊全部消除掉且時間未消耗完。</p><p> 失敗條件:時間消耗完,或者剩下的小方塊沒有路徑能夠匹配(即界面上的小方塊仍未全部消掉)。</p><p><b> 3.2
28、功能需求</b></p><p> (1)游戲界面大致分為兩大區(qū),左邊為游戲操作區(qū),右邊是設(shè)置區(qū);</p><p> ?。?)本游戲功能較為簡單,只具有連連看游戲的基本功能(計時器、積分器、暫停/重新開始、重列),默認(rèn)的圖案種類數(shù)是20種,重復(fù)數(shù)每種圖案為4對;</p><p> ?。?)游戲操作區(qū)是系統(tǒng)自動排列的默認(rèn)的20*4個小方塊,用戶可以點擊小
29、方塊來消除具有相同圖案的小方塊;</p><p> ?。?)設(shè)置區(qū)中顯示當(dāng)前游戲的種類數(shù)、重復(fù)數(shù)、“開始游戲”按鈕、“重列”按鈕、“暫停/重新開始”按鈕和得分情況;</p><p> (5)在游戲操作區(qū)的下方顯示有“剩余時間”的進(jìn)度條,當(dāng)進(jìn)度條的時間耗完時,則游戲結(jié)束;</p><p> ?。?)游戲中用到的部分圖案如下所示:</p><p&g
30、t; 1 2 3 4 5 6 7 8 9 10 11 12</p><p> 13 14 15 16 17 18 19 20 21 22 23 24 </p><p> 25 26 27 28 29 30
31、31 32 33 34 35 36 </p><p><b> 3.3 功能模塊</b></p><p> 本游戲主要細(xì)分為以下幾大模塊:</p><p><b> ?。?)游戲主界面</b></p><p> 以Microsoft Visual Studio 2
32、010為開發(fā)平臺設(shè)計主界面,主要控件有1個主窗體Form、1個groupbox、1個progressbar、4個button、7個label。</p><p> ?。?)隨機(jī)排列小方塊</p><p><b> ?。?)鼠標(biāo)事件</b></p><p> (4)小方塊消除判斷</p><p><b> ?。?
33、)游戲難度設(shè)置</b></p><p> 本游戲沒有用戶自定義游戲難度選擇,而是使用默認(rèn)的圖案種類數(shù)是20種,每種圖案的重復(fù)數(shù)是4對,所以游戲的靈活性較差。</p><p><b> (6)游戲重列</b></p><p> 對本局游戲中剩下的小方塊重新排列,計時器不會暫停。此模塊的主要作用就是在用戶自身不能找到能夠消掉的小方
34、塊的情況下,通過重列剩下的小方塊來產(chǎn)生新的路徑,使游戲能夠繼續(xù)玩下去。</p><p> ?。?)暫停/重新開始</p><p> 點擊“暫?!卑粹o能夠使當(dāng)前正在運行的游戲暫時停止,主要是使讓時間停止,不再倒計時;游戲暫停時鼠標(biāo)不能對游戲操作區(qū)域進(jìn)行操作,此時“暫停”按鈕變成“重新開始”按鈕,用戶只要點擊“重新開始”按鈕即可繼續(xù)游戲操作。</p><p> ?。?
35、)游戲勝利(游戲結(jié)束,需要重新開始游戲)</p><p> ?。?)游戲失敗(游戲結(jié)束,需要重新開始游戲)</p><p> 3.4系統(tǒng)需求分析總結(jié)</p><p> 本系統(tǒng)的結(jié)構(gòu)基本合理,系統(tǒng)功能也基本能夠達(dá)到連連看游戲的要求,采用了最基本的最短路徑優(yōu)先的算法,使系統(tǒng)地運行效率達(dá)到最高。本系統(tǒng)的輸入邊界是用戶進(jìn)行的鼠標(biāo)事件操作和對游戲的復(fù)雜程度進(jìn)行設(shè)置;輸出邊
36、界是游戲結(jié)束,游戲勝利或者游戲失敗。通過對連連看游戲規(guī)則以及相關(guān)算法的分析,本系統(tǒng)總的數(shù)據(jù)量較小,規(guī)模不是很大,適合于在普通微機(jī)或小型機(jī)上運行。</p><p><b> 四、設(shè)計方案</b></p><p> 設(shè)計方案是對一個系統(tǒng)進(jìn)行詳細(xì)而具體的設(shè)計,本系統(tǒng)的設(shè)計方案主要分為總體設(shè)計和詳細(xì)設(shè)計兩部分??傮w設(shè)計是對整個系統(tǒng)結(jié)構(gòu)化的設(shè)計,包括系統(tǒng)的大致框架和各個函數(shù)
37、以及類的說明;詳細(xì)設(shè)計是對各個類和函數(shù)進(jìn)行定義和具體實施,以及各種圖例的詳解。</p><p><b> 4.1 總體設(shè)計</b></p><p> 本課程設(shè)計采用的是單機(jī)模式,當(dāng)在規(guī)定的時間內(nèi)消除完全部的小方塊則游戲過關(guān),如果在規(guī)定的時間內(nèi)沒能消除完所有的小方塊則游戲結(jié)束,需要重新開始新游戲。游戲規(guī)則是模仿普通的連連看游戲,主要是鼠標(biāo)兩次點擊的小方塊能否消去的問
38、題。前提是點擊兩個具有相同的圖案的小方塊,若點擊的是同一個小方塊或者兩個不同的圖案的小方塊,則不進(jìn)行處理;在兩個相同圖案的小方塊用三根以內(nèi)(包括三根)的直線能連在一起,就可以消掉;否則,不進(jìn)行處理。</p><p> 游戲過程,如果用戶在規(guī)定的時間內(nèi)消掉所有的小方塊則提示游戲勝利,會彈出一個“游戲勝利!”的對話框;如果在規(guī)定時間內(nèi)小方塊沒有消完則提示時間到游戲失敗,會彈出一個“游戲失??!”的對話框??紤]到本游戲
39、是單機(jī)小游戲,所以充分考慮到它的娛樂性,并沒有很復(fù)雜的功能。</p><p> 系統(tǒng)的總體設(shè)計是對整個系統(tǒng)的結(jié)構(gòu)化設(shè)計,包括系統(tǒng)基本功能的設(shè)計、系統(tǒng)流程的設(shè)計和各個功能模塊的設(shè)計等。</p><p> 4.1.1 系統(tǒng)基本功能</p><p> 本系統(tǒng)與我們常玩的連連看游戲相比較為簡單,只具有連連看游戲的基本功能,邏輯設(shè)計方面也只有簡單的“開始游戲”、“重列”
40、、圖案“種類數(shù)”和“重復(fù)數(shù)”的設(shè)定、剩余時間和暫停/重新開始。</p><p> 開始游戲:初始化游戲區(qū)域,隨機(jī)排列小方塊。</p><p> 重列:對正在進(jìn)行的游戲中剩余的小方塊重新排列。</p><p> 種類數(shù):本游戲固定圖案種類是20種。</p><p> 重復(fù)數(shù):每種圖案的重復(fù)次數(shù)是4次,也就是4對。</p>
41、<p> 剩余時間:計時器,通過顯示時間進(jìn)度的方式對游戲進(jìn)行倒計時。</p><p> 暫停/重新開始:暫停正在運行的游戲,游戲暫停后也可以重新開始(繼續(xù)本局游戲)。</p><p> 系統(tǒng)基本功能如圖4.1所示</p><p> 圖4.1 系統(tǒng)基本功能圖</p><p> 圖4-1是連連看游戲的系統(tǒng)基本功能圖,從圖中可以
42、看出系統(tǒng)主要分為六大功能,即開始游戲、重列、種類數(shù)、重復(fù)數(shù)、剩余時間和暫停/重新開始的設(shè)置。</p><p> 4.1.2 系統(tǒng)流程</p><p> 系統(tǒng)流程是對系統(tǒng)進(jìn)行大概分析后得出的系統(tǒng)各功能的流動情況以及各個操作之間的關(guān)系,上一步操作都與下一步操作有著緊密的聯(lián)系,即下一步操作都是由上一步操作所決定的。系統(tǒng)流程主要是對系統(tǒng)流程圖的分析,系統(tǒng)流程圖清晰的地反映出了系統(tǒng)的運行情況和走
43、向。</p><p> (1)鼠標(biāo)事件具體流程圖如圖4.2所示</p><p> 圖4.2 鼠標(biāo)事件具體流程圖</p><p> 圖4.2是鼠標(biāo)事件的具體流程圖,在連連看游戲中,鼠標(biāo)事件是很重要的一部分,因為基本都是考鼠標(biāo)去操作的,所以鼠標(biāo)事件的控制就非常重要了;上圖就是鼠標(biāo)在游戲過程中的具體判斷過程,主要是兩個相同小方塊之間路徑的判斷,分為一條直線(沒有轉(zhuǎn)彎
44、)、兩條直線(一個轉(zhuǎn)彎)、三條直線(兩個轉(zhuǎn)彎)。</p><p> (2)系統(tǒng)詳細(xì)運行流程如圖4.3所示</p><p> 圖4.3 運行流程圖</p><p> 圖4.3是游戲詳細(xì)的運行流程圖,圖中清晰地描述了系統(tǒng)的執(zhí)行過程,即根據(jù)不同的事件,游戲狀態(tài)的轉(zhuǎn)換。過程為:游戲開始,等待事件,發(fā)出鼠標(biāo)事件,根據(jù)用戶發(fā)出的鼠標(biāo)命令,然后進(jìn)行各種判斷,系統(tǒng)分別作出不同
45、的反應(yīng)。</p><p> 4.1.3 主要功能模塊</p><p> private void Form1_MouseDown(object sender, MouseEventArgs e) //最重要的鼠標(biāo)事件</p><p> private void ProcessCorner(Point p1,Point p2) //此方法做處理畫線和消除&l
46、t;/p><p> private void button1_Click_1(object sender, EventArgs e) //開始游戲按鈕</p><p> private void button2_Click(object sender, EventArgs e) //重列按鈕</p><p> private void button3_Clic
47、k(object sender, EventArgs e) //暫停/重新開始按鈕</p><p> private void pbtimer_Tick(object sender, EventArgs e) //計時器操作,判斷游戲是否失敗</p><p> public bool IsDirectLink(int x1, int y1, int x2, int y2) //判
48、斷兩個小方塊是否為直連關(guān)系,即判斷兩個小方塊之間是否能用一條之間連接(沒有轉(zhuǎn)彎)</p><p> public bool IndirectLink(int x1, int y1, int x2, int y2) //處理直連以外的情況,即一個轉(zhuǎn)彎和兩個轉(zhuǎn)彎的情況</p><p><b> 4.2 詳細(xì)設(shè)計</b></p><p> 總
49、體設(shè)計是對整個系統(tǒng)的結(jié)構(gòu)化和模塊化設(shè)計,包括各功能模塊的設(shè)計和各個功能函數(shù)的說明。詳細(xì)設(shè)計則是對各個類和功能函數(shù)進(jìn)行具體的定義和實施。下面是對系統(tǒng)中幾個較為重要的函數(shù)進(jìn)行描述。</p><p> 在總體設(shè)計中提到過要想消掉兩個小方塊,可以分為三種情況,下面就是三種情況的詳細(xì)解釋:</p><p> 4.2.1 規(guī)則詳解</p><p> 1、兩個相同的小方塊相
50、鄰,則可以直接消掉。</p><p> 2、若不相鄰的先在第一個小方塊的同一行中找一個空方塊;1)找到后看第二個小方塊橫向到這個空方塊所在的列是否有小方塊;2)沒有的話再看第一個小方塊到與它同行的那個空方塊之間是否有小方塊;3)如果還是沒有的話,再從與第一個小方塊同行的那個空方塊豎向到與第二個小方塊的同行看是否有其他的小方塊。沒有的話路經(jīng)就是通了,則可以將兩個小方塊消掉。 </p><p&g
51、t; 3、若上述2失敗后,再在第一個小方塊的同列找一個空方塊;1)找到后看第二個小方塊豎向到這個空方塊所在的行是否有小方塊;2)沒有的話,再看第一個小方塊到與它同列的那個空方塊之間是否有小方塊;3)如果還是沒有的話,再從與第一個小方塊同列的那個空方塊橫向到與第二個小方塊同列看是否有其他的小方塊。沒有的話路經(jīng)就是通了,則可以將兩個小方塊消掉。</p><p> 如果以上三步都失敗,說明這兩個按鈕不可以消掉。&l
52、t;/p><p> 兩個小方塊能夠相連并消掉的所有情況如下所示:</p><p> (1) (2) (3)</p><p> ?。?) (5) (6)</p><p>
53、(7) -</p><p> (1)兩個小方塊相鄰,可以直接消掉;</p><p> ?。?)兩個小方塊在同一行上面且不相鄰,但中間沒有其他方塊阻擋;</p><p> ?。?)兩個小方塊在同一行上,但中間有其他圖案的小方塊阻隔;</p><p> ?。?)兩個小方塊在同一列,但中間有其他圖案的小方塊阻隔;</p
54、><p> ?。?)兩個小方塊既不在同一行也不在同一列,用三條直線連接(因為第一個小方塊的右邊可能有其他小方塊阻隔);</p><p> ?。?)兩個小方塊既不在同一行也不在同一列,用兩條直線連接(第一個小方塊的某一方正好可以連接到第二個小方塊);</p><p> ?。?)兩個小方塊既不在同一行也不在同一列,用三條直線連接(系統(tǒng)自動檢測,連線從第一個小方塊的空閑的一面
55、引出)</p><p> 4.2.2部分程序代碼解析</p><p> private int picnum = 20; //本局中圖片的數(shù)量</p><p> private int multipic = 4;//一張圖片重復(fù)出來的次數(shù),一定為偶數(shù)</p><p> //鼠標(biāo)事件處理,主要是判斷轉(zhuǎn)彎數(shù)目和位置,并做相應(yīng)的消除操作&l
56、t;/p><p> private void Form1_MouseDown(object sender, MouseEventArgs e)</p><p> { int curx = e.X / 31;</p><p> int cury = e.Y/ 34;</p><p> if (curx > 18 || cur
57、y > 10)</p><p><b> return;</b></p><p> if (gamestop == true)</p><p><b> return;</b></p><p> if (gmap[curx, cury] != 0)</p><p&g
58、t; { Pen pen = new Pen(new SolidBrush(this.BackColor));</p><p> g_g.DrawRectangle(pen, new Rectangle(curx * 31,cury * 34, 31, 34));</p><p><b> two++;</b></p><p> s
59、witch (two)</p><p> { case 1:</p><p> fpoint = new Point(curx, cury);break;</p><p><b> case 2:</b></p><p> if (AI.IsLink(fpoint.X, fpoint.Y, curx, cur
60、y))</p><p> { two = 0;</p><p> //獲得拐點數(shù)目和位置,做畫線處理</p><p> ProcessCorner(fpoint,new Point(curx,cury));</p><p> if (CheckWin(ref gmap))</p><p> { sta
61、rttimer = false;</p><p> MessageBox.Show("恭喜過關(guān)!");</p><p> pbtimer.Stop();</p><p> bStart = false;</p><p><b> }</b></p><p><b&
62、gt; }</b></p><p><b> else</b></p><p> { if (pbvalue == 0) break;</p><p><b> two = 1;</b></p><p> fpoint = new Point(curx, cury);&l
63、t;/p><p><b> }</b></p><p><b> break;</b></p><p> default: break;</p><p><b> }</b></p><p><b> }</b></p&
64、gt;<p><b> }</b></p><p> //此方法做處理畫線和消除,直連時加10分,一個轉(zhuǎn)彎加20分,兩個轉(zhuǎn)彎加40分</p><p> private void ProcessCorner(Point p1,Point p2)</p><p> { Point[] corner = new Point[
65、3];</p><p> corner = AI.GetPoints();</p><p> Pen pen = new Pen(new SolidBrush(Color.Red), 5);//線畫筆</p><p> Pen bkpen = new Pen(new SolidBrush(this.BackColor), 5);//擦去畫筆</p>
66、<p> pbvalue += 4;</p><p> switch (corner[2].X) //轉(zhuǎn)彎數(shù)</p><p> { case 1: </p><p> score += 20; //一個轉(zhuǎn)彎加20分;</p><p> g_g.DrawLine(pen, new Point(p1.X*31+
67、15,p1.Y*34+17), new Point(corner[0].X*31+15,corner[0].Y*34+17));</p><p> g_g.DrawLine(pen, new Point(p2.X * 31+15, p2.Y * 34+17), new Point(corner[0].X * 31+15, corner[0].Y * 34+17));</p><p>
68、Thread.Sleep(100);</p><p> EraseBlock(g_g, p1, p2);</p><p> g_g.DrawLine(bkpen, new Point(p1.X * 31 + 15, p1.Y * 34 + 17), new Point(corner[0].X * 31 + 15, corner[0].Y * 34 + 17));</p>
69、<p> g_g.DrawLine(bkpen, new Point(p2.X * 31 + 15, p2.Y * 34 + 17), new Point(corner[0].X * 31 + 15, corner[0].Y * 34 + 17));</p><p><b> break;</b></p><p><b> case 2: &
70、lt;/b></p><p> score += 40; //兩個轉(zhuǎn)彎加40分</p><p> Point[] ps ={ new Point(p1.X*31+15,p1.Y*34+17),new Point( corner[1].X*31+15,corner[1].Y*34+17),new Point(corner[0].X*31+15,corner[0].Y*34+17),
71、new Point(p2.X*31+15,p2.Y*34+17)};</p><p> g_g.DrawLines(pen, ps);</p><p> Thread.Sleep(100);</p><p> EraseBlock(g_g, p1, p2);</p><p> g_g.DrawLines(bkpen,ps);</
72、p><p><b> break;</b></p><p><b> case 0:</b></p><p> score += 10;//直連加10分</p><p> g_g.DrawLine(pen, new Point(p1.X * 31 + 15, p1.Y * 34 + 17), n
73、ew Point(p2.X * 31 + 15, p2.Y * 34 + 17));</p><p> Thread.Sleep(100);</p><p> EraseBlock(g_g, p1, p2);</p><p> g_g.DrawLine(bkpen, new Point(p1.X * 31 + 15, p1.Y * 34 + 17), new
74、Point(p2.X * 31 + 15, p2.Y * 34 + 17));</p><p><b> break;</b></p><p> default: break;</p><p><b> }</b></p><p> label5.Text = score.ToString(
75、);</p><p><b> }</b></p><p> //開始游戲按鈕,初始化游戲區(qū)域、計時器開始計時、分?jǐn)?shù)歸零并重新開始累積分?jǐn)?shù)</p><p> private void button1_Click_1(object sender, EventArgs e)</p><p> { int m
76、= 0;</p><p> gamestop = false;</p><p> label5.Text = m.ToString();</p><p> if (!starttimer)</p><p> { progressBar1.Value = PBMAX;</p><p> pbtimer.In
77、terval = 500; //時間初始值為500</p><p> pbtimer.Start(); //計時器開始計時</p><p> starttimer = true;</p><p><b> }</b></p><p><b> //處理分?jǐn)?shù)</b></p>&l
78、t;p> score = 0; //初始游戲時分?jǐn)?shù)歸零</p><p> picnum = 20; //每次開局固定的圖案數(shù)</p><p> multipic = 4; //每種圖案重復(fù)的次數(shù)</p><p> IniteBmp(picnum);</p><p> pbvalue = 500; //初始化時間值</p&
79、gt;<p> bStart = true; </p><p> this.Invalidate();</p><p><b> }</b></p><p><b> //重列按鈕</b></p><p> private void button2_Click(object
80、sender, EventArgs e)</p><p> { FreshMap(ref gmap); //調(diào)用重新排列函數(shù),僅對游戲中剩余的小方塊進(jìn)行重列</p><p> this.Invalidate();</p><p><b> }</b></p><p> // 時間判斷,即對游戲是否失敗進(jìn)行判斷
81、,時間耗完則游戲結(jié)束</p><p> private void pbtimer_Tick(object sender, EventArgs e)</p><p> { pbvalue = pbvalue - reducestep;</p><p> if (pbvalue > 100)</p><p> pbvalue
82、= 100;</p><p> if (pbvalue == 0 && starttimer)</p><p> { pbtimer.Stop(); //計時器停止</p><p> starttimer = false;</p><p> MessageBox.Show("游戲失敗!");&l
83、t;/p><p> gamestop = true;</p><p><b> return;</b></p><p><b> }</b></p><p><b> else</b></p><p> progressBar1.Value = p
84、bvalue; //給時間進(jìn)度條賦值</p><p><b> }</b></p><p> //暫停按鈕,主要是時間暫停,并且鼠標(biāo)不能在游戲區(qū)域操作</p><p> private void button3_Click(object sender, EventArgs e)</p><p> { this
85、.button3.Visible = false;</p><p> gamestop = true;</p><p> pbtimer.Stop();</p><p> this.button4.Visible = true;</p><p><b> }</b></p><p> /
86、/判斷兩個小方塊是否為直連關(guān)系,即判斷兩個小方塊之間是否能用一條之間連接(沒有轉(zhuǎn)彎)</p><p> public bool IsDirectLink(int x1, int y1, int x2, int y2)</p><p> { if (x1 == x2 && y1 == y2)</p><p> { return fal
87、se; }</p><p> if (x1 == x2)</p><p> { int bigger = y1 > y2 ? y1 : y2;</p><p> int smaller = y1 > y2 ? y2 : y1;</p><p> int miny = smaller+ 1;</p>&l
88、t;p> while (map[x1, miny] == BLANK)</p><p> { miny++;</p><p> if (miny >= N)</p><p><b> break;</b></p><p><b> }</b></p><
89、p> if (miny == bigger)</p><p> return true;</p><p><b> else</b></p><p> return false;</p><p><b> }</b></p><p> if (y1 == y
90、2)</p><p> { int bigger = x1 > x2 ? x1 : x2;</p><p> int smaller = x1 > x2 ? x2 : x1;</p><p> int minx = smaller + 1;</p><p> while (map[minx, y1] == BLANK)
91、</p><p> { minx++;</p><p> if (minx >= M)</p><p><b> break;</b></p><p><b> }</b></p><p> if (minx == bigger)</p>&
92、lt;p> return true;</p><p><b> else</b></p><p> return false;</p><p><b> }</b></p><p> return false;</p><p><b> }<
93、/b></p><p> //處理直連以外的情況,即一個轉(zhuǎn)彎和兩個轉(zhuǎn)彎的情況</p><p> public bool IndirectLink(int x1, int y1, int x2, int y2)</p><p> { int pos = 0;</p><p> Point[] ar1 = new Point[2
94、09];</p><p> int ar1Len = 0;</p><p> Point[] ar2 = new Point[209];</p><p> int ar2Len = 0;</p><p> pos = y1 - 1;</p><p> while (0 <= pos &&
95、 pos < N && map[x1,pos] == BLANK)</p><p> { ar1Len = FindEmpty(x1, pos, ref ar1);</p><p> ar2Len = FindEmpty(x2, y2, ref ar2);</p><p> if (IsShare(ref ar1, ar1Len, r
96、ef ar2, ar2Len))</p><p> { co = 2;</p><p> corner[1] = new Point(x1, pos);</p><p> return true;</p><p><b> }</b></p><p><b> pos--;
97、</b></p><p><b> }</b></p><p> pos = y1 + 1;</p><p> while (0 <= pos && pos < N && map[x1,pos] == BLANK)</p><p> { ar1Len =
98、 FindEmpty(x1, pos, ref ar1);</p><p> ar2Len = FindEmpty(x2, y2, ref ar2);</p><p> if (IsShare(ref ar1, ar1Len, ref ar2, ar2Len))</p><p> { co = 2;</p><p> corner
99、[1] = new Point(x1, pos);</p><p> return true;</p><p><b> }</b></p><p><b> pos++;</b></p><p><b> }</b></p><p> //如
100、果兩點是左右且非直連關(guān)系</p><p> pos = x1 - 1;</p><p> while (0 <= pos && pos < M && map[pos,y1] == BLANK)</p><p> { ar1Len = FindEmpty(pos, y1, ref ar1);</p>
101、<p> ar2Len = FindEmpty(x2, y2, ref ar2);</p><p> if (IsShare(ref ar1, ar1Len, ref ar2, ar2Len))</p><p> { co = 2;</p><p> corner[1] = new Point(pos, y1);</p><
102、p> return true;</p><p><b> }</b></p><p><b> pos--;</b></p><p><b> }</b></p><p> pos = x1 + 1;</p><p> while (0
103、 <= pos && pos < M && map[pos,y1] == BLANK)</p><p> { ar1Len = FindEmpty(pos, y1, ref ar1);</p><p> ar2Len = FindEmpty(x2, y2, ref ar2);</p><p> if (IsSha
104、re(ref ar1, ar1Len, ref ar2, ar2Len))</p><p> { co = 2;</p><p> corner[1] = new Point(pos, y1);</p><p> return true;</p><p><b> }</b></p><p
105、><b> pos++;</b></p><p><b> }</b></p><p> //如果非上下非左右,即構(gòu)成矩形的關(guān)系</p><p> return false;</p><p><b> }</b></p><p> 4.
106、2.3運行結(jié)果分析</p><p> 系統(tǒng)界面分析這一部分主要是系統(tǒng)的運行與維護(hù)等,在這里展出了系統(tǒng)的部分運行效果圖,并對這些界面進(jìn)行了分析。</p><p> (1)游戲主界面如圖4.4所示</p><p> 圖4.4 游戲主界面</p><p> 圖4.4是游戲主界面,圖案種類數(shù)是20,每種圖案的最大重復(fù)數(shù)是4,在沒有點擊“開始游
107、戲”按鈕時,游戲圖案排列不會呈現(xiàn)出來,剩余時間的進(jìn)度條也不會倒計時。</p><p> ?。?)游戲運行中(一)如圖4.5所示</p><p> 圖4.5 游戲運行中(一)</p><p> 圖4.5是游戲運行中(一)的狀態(tài),用戶可以根據(jù)連連看游戲的相關(guān)規(guī)則進(jìn)行相應(yīng)的鼠標(biāo)事件,使其能夠消掉,同時積分器累計積分,上圖中紅圈處為“暫?!卑粹o,可以點擊此按鈕來暫停游戲
108、。</p><p> (3)游戲運行中(二)如圖4.6所示</p><p> 圖4.6游戲運行中(二)</p><p> 圖4.6是游戲運行中(二)的狀態(tài),上圖紅圈處顯示“重新開始”,此時游戲是在“暫?!睜顟B(tài),用戶可以點擊“重新開始”按鈕,游戲可以繼續(xù)進(jìn)行。</p><p> ?。?)游戲過關(guān)如圖4.7所示</p><
109、;p><b> 圖4.7 游戲過關(guān)</b></p><p> 圖4.7是游戲過關(guān)后的界面,游戲過關(guān)后會彈出一個“恭喜過關(guān)!”的對話框,同時可以看出的最后的得分情況。用戶可以點擊確定后,然后繼續(xù)點擊“開始游戲”,這時系統(tǒng)又會重列游戲區(qū)域,積分器歸零。</p><p> ?。?)游戲失敗如圖4.8所示</p><p><b>
110、 圖4.8 游戲失敗</b></p><p> 圖4.8是游戲失敗時的界面,當(dāng)時間耗完時或者游戲區(qū)域中沒有能夠匹配消掉的圖案時,系統(tǒng)將提示“游戲失?。 ?,即游戲失敗。</p><p><b> 五、總結(jié)</b></p><p> 首先感謝老師給我們一次實訓(xùn)的機(jī)會。通過這次課程設(shè)計,讓我充分體會到了理論與實踐相結(jié)合的重要性。通過
111、我們所學(xué)過的知識,老師給我們詳細(xì)講解并帶領(lǐng)我們做這個連連看游戲,在這個過程中我們學(xué)到了很多書本上學(xué)不到的東西,我在寫程序的時候也遇到了很多問題,不過在自己的努力和老師的指導(dǎo)下完成了任務(wù)。在這次課程設(shè)計中,我不斷的上網(wǎng)查資料以及翻閱相關(guān)書籍,通過不斷的摸索、測試、發(fā)現(xiàn)問題、解決問題,在老師的幫助下這些問題都一一得到了解決,使得程序能夠正常運行。</p><p> 在此游戲的設(shè)計過程中,遇到了很多問題,有些問題比較
112、簡單但就是不知道錯在哪里,有些大問題知道錯在哪里但就是不知道怎么辦,后來經(jīng)過自己的不斷修改和調(diào)試,這些問題都得到了解決。經(jīng)過這次課程設(shè)計,我認(rèn)識到應(yīng)該注意的細(xì)節(jié)問題,雖然是很小的問題,但可以提高自己編程的能力,而且還可以培養(yǎng)自己編程的嚴(yán)謹(jǐn)性,同時還可以為以后的編程積累經(jīng)驗。編寫完這個連連看游戲,我發(fā)現(xiàn)自己有很多不足的地方,感觸最深的就是我真的要扎扎實實的打基礎(chǔ)。并且我感覺到只要肯下功夫?qū)W習(xí),我也可以做出很好的東西,深深明白,只有自己的東
113、西才是最珍貴的。</p><p> 總之,通過這次課程設(shè)計,我學(xué)到了很多,也收獲了很多,這包括學(xué)習(xí)上的和生活中的。盡管可能這個系統(tǒng)中還存在一些問題,但我覺得還是很高興,因為是自己的最重要。</p><p><b> 六、參考文獻(xiàn)</b></p><p> [1] 周存杰.C#網(wǎng)絡(luò)核心編程[M],北京:清華大學(xué)出版社,2002.11<
114、/p><p> [2] 梁立新.C#核心技術(shù)應(yīng)用開發(fā)[M],北京:電子工業(yè)出版社,2010.9</p><p> [3] 王曉東.計算機(jī)算法設(shè)計與分析(第3版)[M],北京:電子工業(yè)出版社,2007</p><p> [4] 劉瑞新.C#網(wǎng)絡(luò)編程及應(yīng)用[M],北京:機(jī)械工業(yè)出版社,2004</p><p> [5] (美)沃森,(美)內(nèi)格
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java連連看課程設(shè)計報告
- labview連連看課程設(shè)計報告
- java連連看課程設(shè)計報告
- 連連看課程設(shè)計
- 連連看課程設(shè)計
- java連連看課程設(shè)計
- java連連看課程設(shè)計
- java課程設(shè)計—連連看
- 連連看c語言課程設(shè)計報告
- 課程設(shè)計報告----java實現(xiàn)游戲連連看
- jav課程設(shè)計報告書——連連看
- java課程設(shè)計--連連看游戲設(shè)計
- android課程設(shè)計連連看小游戲
- java課程設(shè)計--連連看游戲的開發(fā)
- java課程設(shè)計說明書---連連看
- 連連看游戲開題報告
- 連連看
- 連連看.docx
- 連連看項目
- 連連看解釋
評論
0/150
提交評論