已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
畢業(yè) 論文 掃雷游戲的設(shè)計(jì)與開(kāi)發(fā) 論文作者姓名: 申請(qǐng)學(xué)位專(zhuān)業(yè): 申請(qǐng)學(xué)位類(lèi)別: 指導(dǎo)教師姓名(職稱(chēng)): 論文提交日期: 掃雷游戲的設(shè)計(jì)與開(kāi)發(fā) 摘 要 本論文研究的是以 Visual Basic 6.0 為開(kāi)發(fā)環(huán)境,設(shè)計(jì)并開(kāi)發(fā)一款掃雷游戲,其功能類(lèi)似于 Windows 操作系統(tǒng)自帶的掃雷游戲。論文首先介紹了制作游戲的整體思路及整個(gè)游戲設(shè)計(jì)的流程規(guī)劃,然后介紹了雷區(qū)的布置及地雷隨機(jī)產(chǎn)生的實(shí)現(xiàn)方法;重點(diǎn)介紹了在游戲過(guò)程中各事件的處理,其中又以鼠標(biāo)事件和清除未靠近地雷區(qū)方 塊這兩方面最為最要,鼠標(biāo)事件是利用鼠標(biāo)所發(fā)出的信息了解使用者的意圖,進(jìn)而做出相對(duì)應(yīng)的動(dòng)作,而清除未靠近地雷區(qū)方塊由于引進(jìn)了“遞歸”這個(gè)概念而使其簡(jiǎn)單化。 本次設(shè)計(jì)只是完成了掃雷游戲的基本功能,在細(xì)節(jié)方面仍有待以后完善。 關(guān)鍵詞 : 掃雷; Visual Basic 6.0;事件;遞歸 The design and development of mine clearance game Abstract What my thesis research for is basic on the develop environment of Visual Basic 6.0 , design and develop a mine clearance game,its function is similar to the mine clearance games of the Windows Operating System .The thesis has introduced the layout of mined areas and the method of how to create the mines at random.Its mainly through the use of vairies of components in Visual Basic 6.0 and the combination of some simple calculations ;the thesis lays emphasis on introducing the processing of each event in the game .Among these events ,the mouse event and the event of clearance of the area which isnt close to the mine field are much more important.The theory of mouse event is that the intention of user is learned by the information sent out by the mouse and then the program runs according to the information .The other event is simplified by the introduction of the concept of recursion. This design just completed the basic function of mine clearance game.The details still need to be perfect. Key words: Mine clearance, Visual Basic 6.0, Affairs, Recursion 目 錄 論文總頁(yè)數(shù): 18 頁(yè) 1 引言 . 1 1.1 課題背景及意義 .1 1.2 開(kāi)發(fā)工具的選用及介紹 .1 2 游戲的總體分析與設(shè)計(jì) . 3 2.1 設(shè)計(jì)構(gòu)想 .3 2.2 流程規(guī)劃 .4 2.3 畫(huà)面規(guī)劃 .5 3 游戲的詳細(xì)設(shè)計(jì) . 6 3.1 游戲初始化 .6 3.2 雷區(qū)的布置 .9 3.3 游戲中主要模塊的介紹與使用 .10 3.3.1 鼠標(biāo)事件 .10 3.3.2 地雷及雷區(qū)表面探測(cè)情況 .12 3.3.3 清除未靠近地雷的方塊 .12 3.3.4 游戲難度的選擇 .14 3.4 游戲的判斷 .14 3.4.1 游戲成功完成 .14 3.4.2 游戲失敗 .14 4 游戲測(cè)試結(jié)果 . 15 結(jié) 論 . 15 參考文獻(xiàn) . 16 致 謝 . 17 聲 明 . 18 第 1 頁(yè) 共 18 頁(yè) 1 引言 1.1 課題背景及意義 在計(jì)算機(jī)逐步滲入社會(huì)生活各個(gè)層面的今天,計(jì) 算機(jī)已經(jīng)成為人們?nèi)粘I?的一部分,越來(lái)越多的人使用計(jì)算機(jī)辦公、娛樂(lè)等等。 掃雷游戲是 Windows 操作系統(tǒng)自帶的一款小游戲,在過(guò)去的幾年里,Windows 操作系統(tǒng)歷經(jīng)數(shù)次換代更新,變得越來(lái)越龐大、復(fù)雜,功能也越來(lái)越強(qiáng)大,但是這款小游戲依然保持原來(lái)的容貌,可見(jiàn)這款小游戲受到越來(lái)越多人的喜愛(ài)。本次的畢業(yè)設(shè)計(jì)我將利用 Visual Basic6.0 作為開(kāi)發(fā)工具,開(kāi)發(fā)一款類(lèi)似的“掃雷游戲”。 通過(guò)研究 Windows 操作系統(tǒng)自 帶的掃雷游戲,我們可以發(fā)現(xiàn)在這個(gè)游戲中主要有以下兩個(gè)關(guān)鍵的地方: 第一個(gè)是初始化問(wèn)題,包括隨機(jī)產(chǎn)生本局游戲中雷的總數(shù),雷的分布對(duì)于每一個(gè)小區(qū)域如何獲取周?chē)貐^(qū)分布的雷數(shù)等等。 第二就是對(duì)鼠標(biāo)事件的處理問(wèn)題,既在游戲過(guò)程中對(duì)鼠標(biāo)事件應(yīng)如何做出反應(yīng)。 經(jīng)過(guò)四年的大學(xué)學(xué)習(xí),我對(duì)理論知識(shí)已經(jīng)有了一定的了解與認(rèn)知,本次的畢業(yè)設(shè)計(jì)便是將書(shū)本上所學(xué)的理論知識(shí)與實(shí)際相結(jié)合,同時(shí)也是對(duì)所學(xué)知識(shí)的一種檢查,希望通過(guò)本次的畢業(yè)設(shè)計(jì)使自己在程序的開(kāi)發(fā)和設(shè)計(jì)上有新的認(rèn)識(shí)并能有所提高。本次畢業(yè)設(shè)計(jì)既鍛煉了我們的實(shí)際動(dòng)手能力,又在老師的 指導(dǎo)下進(jìn)行了一次模擬實(shí)際產(chǎn)品的開(kāi)發(fā),對(duì)于我們以后工作能力的培養(yǎng)具有重要意義。 1.2 開(kāi)發(fā)工具的選用及介紹 Visual Basic( VB)是一種由微軟公司開(kāi)發(fā)的包含協(xié)助開(kāi)發(fā)環(huán)境的事件驅(qū)動(dòng)編程語(yǔ)言。從任何標(biāo)準(zhǔn)來(lái)說(shuō), VB 都是世界上使用人數(shù)最多的語(yǔ)言 不僅是盛贊 VB 的開(kāi)發(fā)者還是抱怨 VB 的開(kāi)發(fā)者的數(shù)量。它源自于 BASIC 編程語(yǔ)言。 VB 擁有圖形用戶(hù)界面( GUI)和快速應(yīng)用程序開(kāi)發(fā)( RAD)系統(tǒng),可以輕易的使用 DAO、RDO、 ADO 連接數(shù)據(jù)庫(kù),或者輕松的創(chuàng)建 ActiveX 控件。程序員可以輕松的使用VB提供的組件快速建立一 個(gè)應(yīng)用程序。 1991 年,微軟公司推出了 Visual Basic 1.0 版。這在當(dāng)時(shí)引起了很大的轟動(dòng)。這個(gè)連接編程語(yǔ)言和用戶(hù)界面的進(jìn)步被稱(chēng)為 Tripod(有些時(shí)候叫做 Ruby),最初的設(shè)計(jì)是由阿蘭 庫(kù)珀( Alan Cooper)完成的。許多專(zhuān)家把 VB的出現(xiàn)當(dāng)做是軟件開(kāi)發(fā)史上的一個(gè)具有劃時(shí)代意義的事件。其實(shí),以我們現(xiàn)在的目光來(lái)看,VB1.0 的功能實(shí)在是太弱了;(不過(guò)最近 VB6.0, VB.NET 的功能相當(dāng)大!)。但在當(dāng)時(shí),它是第一個(gè) “ 可視 ” 的編程軟件。這使得程序員欣喜之極,都嘗試在 VB的平臺(tái)上進(jìn)行軟件創(chuàng)作。微 軟也不失時(shí)機(jī)地在四年內(nèi)接連推出 VB2.0, VB3.0, 第 2 頁(yè) 共 18 頁(yè) 4.0 三個(gè)版本。并且從 VB3 開(kāi)始,微軟將 ACCESS 的數(shù)據(jù)庫(kù)驅(qū)動(dòng)集成到了 VB中,這使得 VB的數(shù)據(jù)庫(kù)編程能力大大提高。從 VB4 開(kāi)始, VB也引入了面向?qū)ο蟮某绦蛟O(shè)計(jì)思想。 VB 功能強(qiáng)大,學(xué)習(xí)簡(jiǎn)單。而且, VB 還引入了 “ 控件 ” 的概念,使得大量已經(jīng)編好的 VB 程序可以被我們直接拿來(lái)使用。 VB1.0 的 DOS 版本 VB1.0于 1991 年發(fā)布。這個(gè)連接編程語(yǔ)言和用戶(hù)界面的進(jìn)步被稱(chēng)為 Tripod(有些時(shí)候叫做 Ruby),最初的設(shè)計(jì)是由阿蘭 庫(kù)珀( Alan Cooper)完成的 。 VB 2005 的 “ 顯著 ” 優(yōu)點(diǎn)是,可以直接編寫(xiě)出 XP 風(fēng)格的按鈕,以及其他的控件。但是其編寫(xiě)的小程序占用近 10MB 的內(nèi)存。通過(guò)幾年的發(fā)展,它已成為一種專(zhuān)業(yè)化的開(kāi)發(fā)語(yǔ)言和環(huán)境。用戶(hù)可用 Visual Basic 快速創(chuàng)建 Windows 程序,現(xiàn)在還可以編寫(xiě)企業(yè)水平的客戶(hù)端 /服務(wù)器程序及強(qiáng)大的數(shù)據(jù)庫(kù)應(yīng)用程序。 VB 會(huì)吸引更多的贊譽(yù)和批評(píng),也會(huì)繼續(xù)為廣大的用戶(hù)和程序員使用。它非常適合用來(lái)開(kāi)發(fā)擁有友好界面的程序(比如針對(duì)終端的數(shù)據(jù)),但是不適合開(kāi)發(fā)其它程序(比如聯(lián)合計(jì)算程序)。 一個(gè)典型的 VB 進(jìn)程 VB 的中心思想就是要便于程序 員使用,無(wú)論是新手或者專(zhuān)家。 VB 使用了可以簡(jiǎn)單建立應(yīng)用程序的 GUI 系統(tǒng),但是又可以開(kāi)發(fā)相當(dāng)復(fù)雜的程序。 VB 的程序是一種基于窗體的可視化組件安排的聯(lián)合,并且增加代碼來(lái)指定組建的屬性和方法。因?yàn)槟J(rèn)的屬性和方法已經(jīng)有一部分定義在了組件內(nèi),所以程序員不用寫(xiě)多少代碼就可以完成一個(gè)簡(jiǎn)單的程序。過(guò)去的版本里面 VB 程序的性能問(wèn)題一直被放在了桌面上,但是隨著計(jì)算機(jī)速度的飛速增加,關(guān)于性能的爭(zhēng)論已經(jīng)越來(lái)越少。 窗體控件的增加和改變可以用拖放技術(shù)實(shí)現(xiàn)。一個(gè)排列滿控件的工具箱用來(lái)顯示可用控件(比如文本框或者按鈕 。每個(gè)控件都有 自己的屬性和事件。默認(rèn)的屬性值會(huì)在控件創(chuàng)建的時(shí)候提供,但是程序員也可以進(jìn)行更改。很多的屬性值可以在運(yùn)行時(shí)候隨著用戶(hù)的動(dòng)作和修改進(jìn)行改動(dòng),這樣就形成了一個(gè)動(dòng)態(tài)的程序。舉個(gè)例子來(lái)說(shuō):窗體的大小改變事件中加入了可以改變控件位置的代碼,在運(yùn)行時(shí)候每當(dāng)用戶(hù)更改窗口大小,控件也會(huì)隨之改變位置。在文本框中的文字改變事件中加入相應(yīng)的代碼,程序就能夠在文字輸入的時(shí)候自動(dòng)翻譯或者阻止某些字符的輸入。 VB 的程序可以包含一個(gè)或多個(gè)窗體,或者是一個(gè)主窗體和多個(gè)子窗體,類(lèi)似于操作系統(tǒng)的樣子。有很少功能的對(duì)話框窗口(比如沒(méi)有最大化和最小 化按鈕的窗體)可以用來(lái)提供彈出功能。 VB 的組件既可以擁有用戶(hù)界面,也可以沒(méi)有。這樣一來(lái)服務(wù)器端程序就可以處理增加的模塊。 VB 使用參數(shù)計(jì)算的方法來(lái)進(jìn)行垃圾收集,這個(gè)方法中包含有大量的對(duì)象,提供基本的面向?qū)ο笾С?。因?yàn)樵絹?lái)越多組建的出現(xiàn),程序員可以選用自己需要的擴(kuò)展庫(kù)。和有些語(yǔ)言不一樣, VB 對(duì)大小寫(xiě)不敏感,但是能自動(dòng)轉(zhuǎn)換關(guān)鍵詞到 第 3 頁(yè) 共 18 頁(yè) 標(biāo)準(zhǔn)的大小寫(xiě)狀態(tài),以及強(qiáng)制使得符號(hào)表入口的實(shí)體的變量名稱(chēng)遵循書(shū)寫(xiě)規(guī)則。默認(rèn)情況下字符串的比較是對(duì)大小寫(xiě)敏感的,但是可以關(guān)閉這個(gè)功能。 VB使得大量的外界控件有了自己的生存空間。大量 的第三方控件針對(duì) VB 提供。 VB也提供了建立、使用和重用這些控件的方法,但是由于語(yǔ)言問(wèn)題,從一個(gè)應(yīng)用程序創(chuàng)建另外一個(gè)并不簡(jiǎn)單。 在討論 Visual Basic 時(shí),經(jīng)??梢月?tīng)到以下這些術(shù)語(yǔ),因此對(duì)這些術(shù)語(yǔ)的基本理解十分有幫助。 控件 簡(jiǎn)單的說(shuō),控件就是構(gòu)成或者說(shuō)建造 Visual Basic 應(yīng)用程序的圖形化工具,包括窗體、按鈕、復(fù)選框、列表框、數(shù)據(jù)控件、表格控件和圖片控件等等 .。 事件 由用戶(hù)或操作系統(tǒng)引發(fā)的動(dòng)作。事件的示例有擊鍵、單擊鼠標(biāo)(Click)、雙擊鼠標(biāo) (DblClick)、一段時(shí)間的限制,或從 端口接收數(shù)據(jù)。 方法 嵌入在對(duì)象定義中的程序代碼,它定義對(duì)象怎樣處理信息并響應(yīng)某事件。例如,數(shù)據(jù)庫(kù)對(duì)象有打開(kāi)紀(jì)錄集并從一個(gè)記錄移動(dòng)到另一個(gè)記錄的方法程序的基本元素,它含有定義其特征的屬性,定義其任務(wù)和識(shí)別它可以響應(yīng)的事件的方法。控件和窗體是 Visual Basic 中所有對(duì)象的示例。 對(duì)象 一個(gè)控件、窗體等都可被看作一個(gè)對(duì)象。 過(guò)程 為完成某些特定的任務(wù)而編寫(xiě)的代碼段,過(guò)程通常用于響應(yīng)特定的事件,也可以當(dāng)作應(yīng)用程序的用戶(hù)自定義函數(shù)來(lái)使用。 屬性 屬性是組成用戶(hù)界面的各對(duì)象的性質(zhì)的具體描述。例如上述 “ 對(duì)象 ” 中所提到的尺寸、位置、顏色、寬度、高度等等都稱(chēng)為控件的 屬性。屬性決定對(duì)象的外觀,有時(shí)也決定對(duì)象的行為。對(duì)象的屬性絕大部分是 VB 中已經(jīng)事先定義好的,但也有的屬性是需要在應(yīng)用 過(guò)程中才去定義的。屬性即可為對(duì)象提供數(shù)據(jù),也能從對(duì)象取回信息。 隨著 Intemet 的迅猛發(fā)展, Microsoft 的 ActiveX 技術(shù)出現(xiàn)了,并被不失時(shí)機(jī)地加入到 Visual Basic 5 0版本中 (1997 年 )。在 1998 年, Microsoft 推出了 Visual Basic 6 0 版本,這一版本使 VB 得到了很大的擴(kuò)充和增強(qiáng)。它還 引入了使用部件編程的概念,實(shí)際上這是對(duì)面向?qū)ο缶幊趟枷氲臄U(kuò)展。迄今為止,Visual Basic 已經(jīng)發(fā)展成為快速應(yīng)用程序開(kāi)發(fā) (RAD, Rapid Application Development)工具的代表。 2 游戲的總體分析與設(shè)計(jì) 2.1 設(shè)計(jì)構(gòu)想 相信 大多數(shù)使用 Windows 操作系統(tǒng)的使用者,對(duì)這款游戲都不陌生。這款游戲不止操作簡(jiǎn)單,規(guī)則也不難,再加上游戲速度的控制機(jī)制得宜,讓整個(gè)游戲 第 4 頁(yè) 共 18 頁(yè) 在操作過(guò)程中充滿了快樂(lè)與緊張的氣氛。除了游樂(lè)當(dāng)中能帶給使用者快樂(lè)之外,游戲的設(shè)計(jì)內(nèi)容無(wú)形中也不斷訓(xùn)練使用者的邏輯思考能力,對(duì)于依靠高 度腦力工作的現(xiàn)代人,都可以通過(guò)這個(gè)游戲,不時(shí)的檢驗(yàn)一下自己,所以我們不難發(fā)現(xiàn),在各種可攜帶的電子產(chǎn)品上都有這款游戲的蹤影。 在設(shè)計(jì)之前,我們先來(lái)了解這款游戲的規(guī)則。 在不掀開(kāi)任何藏有地雷的方塊情況下,以最快的速度找出所有的地雷。如果在掀開(kāi)方塊的過(guò)程中,不小心翻開(kāi)(踩到)藏有地雷的方塊,則宣告失?。ㄓ螒蚪Y(jié)束),惟有將所有不含地雷的方塊掀開(kāi),游戲才算成功。 游戲的操作方面主要以鼠標(biāo)為主,當(dāng)鼠標(biāo)指針對(duì)準(zhǔn)未翻開(kāi)的方塊按下左鍵時(shí)即表示翻開(kāi)方塊,當(dāng)鼠標(biāo)指針對(duì)準(zhǔn)未翻開(kāi)的方塊按下右鍵時(shí)即表示標(biāo)示或疑示地雷,反復(fù)按下右鍵則方 塊會(huì)以未標(biāo)示標(biāo)示疑似三者關(guān)系不斷循環(huán)。游戲者可以通過(guò)地雷區(qū)內(nèi)的數(shù)字提示了解以數(shù)字為中心的其周邊八個(gè)方格內(nèi)所含的地雷數(shù),假若翻開(kāi)的方塊顯示數(shù)字“ 3”,則表示以其為中心的周邊方塊內(nèi)藏有 3 個(gè)地雷。 當(dāng)按下的方塊不是地雷,且周邊八個(gè)方塊也都沒(méi)有地雷時(shí),方塊會(huì)以被翻開(kāi)方塊的八個(gè)方向?qū)⒖瞻追綁K翻開(kāi)。 2.2 流程規(guī)劃 流程規(guī)劃大致上可以分為三個(gè)部分,分別為:畫(huà)面初始、游戲者按下第一個(gè)方塊和為非地雷方塊時(shí)展開(kāi)。 畫(huà)面初始時(shí),以游戲者最后一次設(shè)定的地雷區(qū)大小為范圍畫(huà)出地雷區(qū),但此時(shí)并未產(chǎn)生地雷。當(dāng)游戲者按下第一個(gè)方塊時(shí) 產(chǎn)生地雷資料并啟動(dòng)定時(shí)器,為何在游戲者按下第一個(gè)方塊才產(chǎn)生地雷資料呢?其主要的用意在于不要讓游戲者第一次就踩到地雷,這樣在某種程度上可以提高游戲者游玩的氣氛。接著就是如何判斷按下的方塊是非地雷時(shí)的處理,這也是整個(gè)游戲的技術(shù)核心,我們可以通過(guò)遞歸的觀念來(lái)檢查周邊的方塊是否含有地雷及是否繼續(xù)往外翻開(kāi)。 流程規(guī)劃如圖 1 所示: 第 5 頁(yè) 共 18 頁(yè) 圖 1 整體流程規(guī)劃圖 2.3 畫(huà)面規(guī)劃 畫(huà)面規(guī)劃如圖 2所示: 開(kāi)始 依照使用者初始設(shè)定 等待按鍵 左 鍵鍵 右鍵 第一次按下方塊 顯示方塊 1 布置地圖 2 啟動(dòng)計(jì)時(shí)器 按下方塊是否為地圖 顯示分?jǐn)?shù) 是否再 玩 結(jié) 束 延按下方塊周?chē)归_(kāi)非地雷方塊 計(jì)時(shí)器 時(shí)間到 否 否 是 是 否 否 是 是 否 第 6 頁(yè) 共 18 頁(yè) 圖 2 規(guī)劃樣圖 說(shuō)明如下: :游戲窗口( Form) 。為了避免因改變窗口大小而造成畫(huà)面呈現(xiàn)不美觀,在這里將 BorderStyle 屬性設(shè)定為 3(雙線固定對(duì)話框),即無(wú)法以窗口邊緣進(jìn)行窗口大小調(diào)整。 :地雷數(shù)顯示區(qū)( PictureBox)。 :游戲狀態(tài) (Image)。 :游戲時(shí)間顯示區(qū) (PictureBox)。 :計(jì)數(shù)及狀態(tài)區(qū) (PictureBox)。 :地圖區(qū)圖樣 (Image)。 :地雷區(qū) (PictureBox)。 :存儲(chǔ)圖片的組件,包括游戲狀態(tài)圖片、地雷區(qū)圖片、地 雷數(shù)及秒數(shù)數(shù)字圖片 (Imagelist)。 :秒數(shù)控制 (Timer)。 3 游戲的詳細(xì)設(shè)計(jì) 3.1 游戲初始化 當(dāng)玩家開(kāi)始游戲時(shí),游戲畫(huà)面如圖 3 所示: 第 7 頁(yè) 共 18 頁(yè) 圖 3 游戲初始畫(huà)面 我們可以清楚的看到,游戲界面主要分為兩個(gè)主要部分: 1. 計(jì)數(shù)及狀態(tài)區(qū) ;2.地雷區(qū)。 首先我利用 PictureBox 組件, PictureBox 為容器類(lèi)型的組件,因此可以加入其他組件在其內(nèi)。在游戲中我利用了 PictureBox 組件的兩個(gè)特性,分別為容器特性及立體框線,具體如下: (1)容器特性:只要容器本身顯示的行為改變,在容器內(nèi)的組件也會(huì)跟 著改變。當(dāng)游戲初始時(shí),地雷區(qū)的顯示組件會(huì)循環(huán)執(zhí)行,逐一布置在畫(huà)面上,但由于執(zhí)行循環(huán)時(shí)多個(gè) Image 組件要顯示圖形,造成分時(shí)系統(tǒng)執(zhí)行頻率顯示上會(huì)出現(xiàn)不流暢的情形,若在循環(huán)執(zhí)行前,先將容器本身的 Visable 屬性設(shè)為 False,在循環(huán)執(zhí)行完成后再將 Visable 屬性設(shè)為 Ture,則顯示就會(huì)變得流暢許多。 (2)立體 框線:通過(guò)組件本身立體框線的屬性設(shè)定,可以為游戲畫(huà)面的顯示上營(yíng)造出層次感。 然后再利用 ImageList 組件來(lái)存儲(chǔ)游戲中將要使用的圖片,我們可以將組件布置于窗體后編輯組件屬性,如圖 4所示: 圖 4 通過(guò) InsertPicture 和 RemovePicture 按鈕即可編輯組件所存放的圖片。 計(jì)數(shù)及狀態(tài)區(qū) 地雷區(qū) 第 8 頁(yè) 共 18 頁(yè) 利用 ImageList 集合對(duì)象的 Picture 方法,即可將 ImageList 組件內(nèi)的圖片指定給圖形顯示組件,語(yǔ)法如下: Set 圖形組件 . Picture=ImageList. ImageList(圖片索引 ). Picture 因?yàn)橐粋€(gè) ImageList 組件內(nèi)必須存儲(chǔ)大小相同的圖片,所以在游戲中顯示的圖片共分為三個(gè)部分: 1.數(shù)字計(jì)數(shù)圖形; 2.游戲狀態(tài)圖形; 3.地雷區(qū)表示圖形。 所以我們使用了三個(gè) ImageList 組件來(lái) 存儲(chǔ)不同大小的圖片。 接著便是對(duì)地雷區(qū)的初始化,這里我們利用 Load 及 UnLoad 指令,動(dòng)態(tài)新增 及刪除組件。在游戲的地雷區(qū),我們依照游戲者自定義的地圖類(lèi)型,來(lái)布置未探測(cè)地雷方塊。假如設(shè)定的地圖大小為 20 30 時(shí),我們可以通過(guò)雙循環(huán)For Next 及 Load 指令在程序執(zhí)行階段動(dòng)態(tài)加載表示方塊的組件,程序片段如下 : 加載表示地圖資料的圖片 For y = 0 To 20 地雷區(qū)高 For x = 0 To 30 地雷區(qū)寬 Load 表示方塊組件( index) 設(shè)定組件位置 Next x Next y 經(jīng)過(guò)雙循環(huán)的運(yùn)算,程序就會(huì)產(chǎn)生 20 30=600 個(gè)組件,試想如果在程序設(shè)計(jì)階段,就把 600 個(gè)組件布置在窗體上,那將是多么沒(méi)有效率的事情,況且組件數(shù)量的多少,還要取決于游戲玩家設(shè)定的地雷區(qū)大小,所以利用 Load 指令對(duì)于大量加載同一組件的動(dòng)作將有莫大的幫助。 加載組件后必須將組件做適當(dāng)?shù)牟贾?,我們可以通過(guò) Image 組件的 Move 屬性,將組件布置于預(yù)定的位置, Move 函數(shù)的原型如下: 組件 .Move X 坐標(biāo), Y 坐標(biāo) , 組件寬度 , 組件高度 (其中括號(hào)內(nèi)表示可以省略) 再配合雙循環(huán)的變量值,可 以控制組件布置于窗體的方向及方式,例如以下程序片段: For y = 0 To 20 地雷區(qū)高 For x = 0 To 30 地雷區(qū)寬 Load 表示方塊組件( index) 設(shè)定組件位置 組件( index) .Move x *組件寬度, y *組件高度 Next x 第 9 頁(yè) 共 18 頁(yè) Next y 組件將呈現(xiàn)先由左至右,再由上至下布置。 若將內(nèi)循環(huán)改為 y 值,同樣的 Move 指令,組件的布置方向?qū)⒂缮隙略儆勺笾劣?。布置方向的不同,?huì)關(guān)聯(lián)到組件內(nèi)含的索引值不同,相對(duì)在程序執(zhí)行階段存取組件時(shí), 所定義的組件索引值就必須考慮組件不止的方向,這樣才不會(huì)造成組件存取的錯(cuò)誤。以由左至右再由上而下的布置方式為例,我們可以利用以下公式,求得組件索引值:組件索引值 =( X 坐標(biāo) +Y 坐標(biāo) *數(shù)組寬度) 這樣,游戲界面的初始化工作就基本完成了,下面就是地雷的隨機(jī)產(chǎn)生。 3.2 雷區(qū)的布置 當(dāng)游戲界面初始化完成后,這時(shí)在地雷區(qū)中并未產(chǎn)生地雷,只有當(dāng)玩家在地雷區(qū)中第一次點(diǎn)下左鍵后,才會(huì)在地雷區(qū)中隨機(jī)的布置當(dāng)前游戲難度下應(yīng)該產(chǎn)生的地雷總數(shù),其主要用意在于不讓玩家第一次就踩到地雷,這樣 在某種程度上可以提高玩家游戲的氣憤。具體實(shí)現(xiàn)如下所示: 判斷地雷區(qū)是否處于可動(dòng)作狀態(tài) If isDie = False And isFinal = False Then xxx = index Mod MAP_X 標(biāo)示動(dòng)作圖片的坐標(biāo) yyy = index MAP_X 判斷為左鍵且該方塊為未探測(cè)狀態(tài) If Button = 1 And mapFaceArr(xxx, yyy) = 1 Then 判斷游戲是否等待啟動(dòng) If isStart = False Then cMINE_NUM = MINE_NUM isStart = True Timer1.Enabled = True 布置地雷 Do While cMINE_NUM 0 rX = Rnd() * (MAP_X - 1) rY = Rnd() * (MAP_Y - 1) 判斷數(shù)組中 (rX,rY)為非地雷及 非點(diǎn)選的方塊坐標(biāo)時(shí) 第 10 頁(yè) 共 18 頁(yè) If mapArr(rX, rY) = 0 And xx = 0 And yy 9 And _ Not (xx = rX And yy = rY) Then mapArr(xx, yy) = mapArr(xx, yy) + 1 End If End If Next yy Next xx End If Loop End If 3.3 游戲 中 主要 模塊的介紹與使用 3.3.1 鼠標(biāo)事件 在游戲過(guò)程中,我們利用鼠標(biāo)所發(fā)出的信息了解游戲者的意圖,進(jìn)而作出相對(duì)應(yīng)的動(dòng)作。 在 MouseDown 與 MouseUp 事件中,可以捕捉鼠標(biāo)所按下或放開(kāi)的按鍵為何、鼠標(biāo)光標(biāo)在該組件上的坐標(biāo)及是否同時(shí)按下輔助鍵等。函數(shù)原型如下: 組件名稱(chēng) _MouseDown(index As Integer, _Button As Integer, _Shift As Integer, _ x As Single, _y As Single) 組件名稱(chēng) _MouseUp(index As Integer, _Button As Integer, _Shift As Integer, _ x As Single, _y As Single) 在參數(shù)列中, Button 參數(shù)值表示鼠標(biāo)上的按狃數(shù)值。其意義如下: 1:左鍵 2:右鍵 倘若同時(shí)按下不止一個(gè)按鍵時(shí),則傳回?cái)?shù)值為按鍵數(shù)值相加,例如同時(shí)按下左鍵及右鍵,則 Button 值為 1+2=3 第 11 頁(yè) 共 18 頁(yè) 在本游戲中,我們利用右鍵的 MouseDown 事件來(lái)標(biāo)示“已標(biāo)示”方塊,利用左鍵的 MouseDown 事件,來(lái)標(biāo)示游戲者準(zhǔn)備按下的方塊,再利用左鍵的 MouseUp事件來(lái)確定翻開(kāi)的方塊。這樣的用意在于,假如游戲者發(fā)現(xiàn)按下的方塊是錯(cuò)誤的,此時(shí)只要不松開(kāi)左鍵,同時(shí)按下右鍵,該方塊就會(huì)被標(biāo)示為“已標(biāo)示”方塊,若再松開(kāi)左鍵,則該方塊因?yàn)橐殉蔀椤耙褬?biāo)示”方塊,所以就無(wú)法翻開(kāi)。 在窗口的軟件中,鼠標(biāo)的應(yīng)用是不可或缺的,但鼠標(biāo)固然好用,如果程序設(shè)計(jì)不當(dāng),也可能造成使用者的不便。通常鼠標(biāo)在軟件的應(yīng)用上經(jīng)常使用 MouseUp事件來(lái)作為確定使用者的操作意圖,而只 把 MouseDown 事件當(dāng)做標(biāo)示的用途(用意就如同前面所提),只是為給使用者一個(gè)反悔的機(jī)會(huì)。 游戲的操作方面主要以鼠標(biāo)為主,當(dāng)鼠標(biāo)指針對(duì)準(zhǔn)未翻開(kāi)的方塊按下左鍵時(shí)即表示翻開(kāi)方塊 : If Button = 1 Then 鼠標(biāo)左鍵 If mapFaceArr(xxx, yyy) = 1 Then Call setMineImage(index, 10) Set iState.Picture = ilSmile.ListImages(3).Picture End If 當(dāng)鼠標(biāo)指針對(duì)準(zhǔn)未翻開(kāi)的方塊按下右鍵時(shí)即表示標(biāo)示或疑示地雷,反復(fù)按下右鍵則方塊會(huì)以“未標(biāo)示”“標(biāo)示”“疑似”三者關(guān)系不斷循環(huán): If Button = 2 Then 鼠標(biāo)右鍵 If mapFaceArr(xxx, yyy) = 1 Then 未探測(cè) mapFaceArr(xxx, yyy) = 2 MINE_NUM_LABEL = MINE_NUM_LABEL + 1 Call setMineImage(index, 13) Call setNowMines ElseIf mapFaceArr(xxx, yyy) = 2 Then 標(biāo)示 mapFaceArr(xxx, yyy) = 3 MINE_NUM_LABEL = MINE_NUM_LABEL - 1 Call setMineImage(index, 14) Call setNowMines ElseIf mapFaceArr(xxx, yyy) = 3 Then 疑似 mapFaceArr(xxx, yyy) = 1 Call setMineImage(index, 9) 第 12 頁(yè) 共 18 頁(yè) End If 3.3.2 地雷及雷區(qū)表面探測(cè)情 況 在 游戲設(shè)計(jì)上,我利用了兩個(gè)二維數(shù)組分別記錄地雷的分布情況及雷區(qū)表面探測(cè)情形,如圖 5 和圖 6 所示: 圖 5 標(biāo)示地雷分布情況 圖 6 標(biāo)示地雷探測(cè)情況 因?yàn)閮蓚€(gè)數(shù)組維數(shù)皆為 2,所以我們通過(guò)雙循環(huán)做數(shù)據(jù)的對(duì)比工作。另外,當(dāng)游戲玩家按下非地雷的方塊時(shí),程序必須自動(dòng)將周邊非地雷的方塊翻開(kāi),這個(gè)動(dòng)作我們也可以通過(guò)雙循環(huán)的方式檢查以按下的方塊為中心與周邊的 8 個(gè)方塊所形成的 3*3 的二維數(shù)組,鼠標(biāo)指針?biāo)讣词谴戆聪碌姆綁K,利用雙循環(huán) 作數(shù)據(jù)的對(duì)比,不但速度快,而且在設(shè)計(jì)階段,程序的架構(gòu)也比較清楚。程序設(shè)計(jì)時(shí)雙循環(huán)常常搭配 二維數(shù)組使用。 3.3.3 清除未靠近地雷的方塊 這里 先引入一個(gè)“遞歸”的概念,“遞歸” (Recursion)簡(jiǎn)單的說(shuō),就是一個(gè)程序能被自己所定義的語(yǔ)句調(diào)用。遞歸在程序設(shè)計(jì)上是一種重要的數(shù)據(jù)結(jié)構(gòu)形態(tài),通過(guò)遞歸程序的編寫(xiě),在程序代碼上會(huì)變得相當(dāng)簡(jiǎn)潔,不過(guò)如果設(shè)計(jì)不當(dāng), 第 13 頁(yè) 共 18 頁(yè) 會(huì)造成無(wú)窮循環(huán)或堆迭溢滿的情形,所以遞歸的程序中心必須含有 if then 或Select Case 等設(shè)計(jì),以終止遞歸執(zhí)行。 在游戲過(guò)程中,當(dāng)游戲者按下非地雷方塊時(shí),方塊會(huì)沿四周八個(gè)方向向外翻開(kāi)非地雷的方塊。 程序的執(zhí)行方面必須判斷:以按下方塊為中心 ,檢查周?chē)藗€(gè)方塊是否為非地雷方塊,若其中有一個(gè)方塊是非地雷方塊時(shí),則又以其為中心,向外檢查周?chē)藗€(gè)方塊是否為非地雷方塊,如此反復(fù)的執(zhí)行即構(gòu)成遞歸的使用條件。 前面已經(jīng)提到,遞歸必須設(shè)計(jì)終止的條件判斷,在本游戲的遞歸架構(gòu)中,當(dāng)判斷方塊的內(nèi)容為數(shù)字時(shí)(即在非地雷方塊周?chē)?,即立即停止遞歸程序。 遞歸其實(shí)也不是萬(wàn)能的,以本游戲做測(cè)試,當(dāng)?shù)乩讌^(qū)范圍越大,且地雷數(shù)目不多時(shí)(一翻開(kāi)非地雷方塊,幾乎全部方塊都會(huì)翻開(kāi)),執(zhí)行遞歸就會(huì)變的非常緩慢,甚至造成堆迭溢滿(不足)的情形,所以在游戲設(shè)計(jì)上必須考慮地雷區(qū)的大小,以免造 成執(zhí)行時(shí)錯(cuò)誤中斷的情況發(fā)生。 代碼部分如下所示: Private Sub doClear(ByVal x As Integer, _ ByVal y As Integer, _ ByVal index As Integer) MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1 For xx = x - 1 To x + 1 For yy = y - 1 To y + 1 If xx = 0 And xx = 0 And yy = 0 And _ mapArr(xx, yy) = 8 Then mapFaceArr(xx, yy) = 0 Select Case mapArr(xx, yy) Case 0 Call setMineImage(yy * MAP_X + xx), 10) Call doClear(xx, yy, (yy * MAP_X + xx) Case 1 To 8 MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1 第 14 頁(yè) 共 18 頁(yè) Call setMineImage(yy * MAP_X + xx), mapArr(xx, yy) End Select End If End If End If Next yy Next xx End Sub 3.3.4 游戲難度的選擇 這里我 設(shè)置了“初級(jí)”,“中級(jí)”,“高級(jí)”以及“自定義”四個(gè)不同的難度級(jí)別,“初級(jí)”,“中級(jí)”,“高級(jí)”中的雷區(qū)大小和地雷總數(shù)是已經(jīng)設(shè)計(jì)好了的,如果玩家想要自己設(shè)置這些參數(shù),可單擊“游戲”“自定義”,然后在“設(shè)置”中輸入行數(shù),列數(shù)及地雷數(shù),在這里我對(duì)行數(shù)及列 數(shù)做出了一個(gè)限定,及行數(shù)和列數(shù)的最大值分別為 24 和 30,當(dāng)在設(shè)置地雷數(shù)的時(shí)候,如果地雷數(shù)大于或等于行數(shù)和列數(shù)的乘積,或者地雷數(shù)小于零,地雷數(shù)都將自動(dòng)的轉(zhuǎn)換為:地雷數(shù) =(行數(shù) -1)(列數(shù) -1)。 3.4 游戲的判斷 3.4.1 游戲成功完成 當(dāng)在規(guī)定的時(shí)間內(nèi)將所有的雷都正確的標(biāo)示出來(lái),游戲就會(huì)有一個(gè)彈出框提示你在多長(zhǎng)時(shí)間內(nèi)完成當(dāng)前難度下的游戲。 還有一種情況便是當(dāng)只剩下地雷未探測(cè)的時(shí)候,及雷區(qū)方塊總數(shù) -已清除的方塊數(shù) =地雷總數(shù)的話,游戲也將成功完成。 3.4.2 游戲失敗 當(dāng)鼠標(biāo)左鍵按下的方塊為地雷方塊事,地雷 將會(huì)被引爆,游戲立即結(jié)束。 當(dāng)在設(shè)定時(shí)間內(nèi)未探測(cè)完所有的地雷,地雷也將會(huì)引爆,對(duì)于這第二種行為,我們可以通過(guò) Timer 組件來(lái)加以控制。利用 Timer 組件在固定時(shí)間即會(huì)觸發(fā)時(shí)間的特性,在事件觸發(fā)時(shí)便將計(jì)數(shù)值加一,直到判斷計(jì)數(shù)值超過(guò)限定值時(shí),即地雷引爆。具體代碼如下所示: 定時(shí)器 Private Sub Timer1_Timer() TIME_COUNTER = TIME_COUNTER + 1 時(shí)間計(jì)數(shù)顯示 第 15 頁(yè) 共 18 頁(yè) Call setNowTimer 設(shè)定狀態(tài)圖示 If TIME_COUNTER = 999 Then isDie = True Timer1.Enabled = False mapFaceArr(xxx, yyy) = 0 Call showMine 設(shè)定狀態(tài)圖示 Call setStateImage MsgBox 您探測(cè)地雷的時(shí)間已超過(guò),地雷已引爆。 , , 超時(shí) End If End Sub 4 游戲測(cè)試結(jié)果 在程序代碼基本完成后,經(jīng)過(guò) 不斷的調(diào)試與修改,最后測(cè)試本次所設(shè)計(jì)的 掃雷游戲能夠正常運(yùn)行,在基本功能與畫(huà)面上與 Windows 自帶的掃雷游戲沒(méi)有太大差別,沒(méi)有出現(xiàn)明顯的錯(cuò)誤和漏洞,但是在一些細(xì)節(jié)方面仍然需要完善,比如在游戲中可以加入一些聲音的提示,在游戲完成和失敗的時(shí)候可以彈出一些小的Flash 動(dòng)畫(huà),還有就是可以加入一個(gè)掃雷英雄榜等等??偟膩?lái)說(shuō)本次設(shè)計(jì)在功能上已經(jīng)基本達(dá)到要求,其他細(xì)節(jié)方面有待以后完善。 結(jié) 論 畢業(yè)設(shè)計(jì)是本科學(xué)習(xí)階段一次非常難得的理論與實(shí)際相結(jié)合的機(jī)會(huì),通過(guò)這次比較完整的一個(gè)程序的設(shè)計(jì),我擺脫了單純的理論知識(shí)學(xué)習(xí)狀 態(tài),和實(shí)際設(shè)計(jì)的結(jié)合鍛煉了我的綜合運(yùn)用所學(xué)的專(zhuān)業(yè)基礎(chǔ)知識(shí),解決實(shí)際問(wèn)題的能力,同時(shí)也提高我查閱文獻(xiàn)資料
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 修補(bǔ)街道施工方案(3篇)
- 打卡活動(dòng)折紙方案策劃(3篇)
- 公司糕點(diǎn)活動(dòng)策劃方案(3篇)
- 體操特色活動(dòng)方案策劃(3篇)
- 涼亭庭院施工方案(3篇)
- 2025年金融服務(wù)產(chǎn)品銷(xiāo)售與服務(wù)規(guī)范
- 中學(xué)學(xué)生社團(tuán)活動(dòng)經(jīng)費(fèi)保障制度
- 2025年中職應(yīng)急管理(應(yīng)急處置基礎(chǔ))試題及答案
- 2025年大學(xué)心理學(xué)(咨詢(xún)心理學(xué))試題及答案
- 2025年大學(xué)大四(物流工程與管理)物流園區(qū)規(guī)劃設(shè)計(jì)綜合試題及答案
- 小學(xué)五年級(jí)上冊(cè)英語(yǔ)(外研一起)期末模擬測(cè)試卷(一)
- 2022浪潮信創(chuàng)服務(wù)器CS5260H2技術(shù)白皮書(shū)
- 2020年天津市中考滿分作文《細(xì)品落雨花開(kāi)》2
- 泵站維修采購(gòu)合同模板
- 針織學(xué)全套課件
- 冷渣機(jī)漏渣及冒灰原因分析及處理方案 106p
- 2023年巡檢員崗位考試真題模擬匯編(共113題)
- 七下長(zhǎng)江全能學(xué)案
- LZDD-18N 食品安全綜合檢測(cè)儀使用說(shuō)明書(shū)20140530
- 1.罌粟堿-經(jīng)典擴(kuò)血管藥物
- JJG 1162-2019醫(yī)用電子體溫計(jì)
評(píng)論
0/150
提交評(píng)論