基于嵌入式的貪食蛇的設(shè)計(jì)和實(shí)現(xiàn)_第1頁(yè)
基于嵌入式的貪食蛇的設(shè)計(jì)和實(shí)現(xiàn)_第2頁(yè)
基于嵌入式的貪食蛇的設(shè)計(jì)和實(shí)現(xiàn)_第3頁(yè)
基于嵌入式的貪食蛇的設(shè)計(jì)和實(shí)現(xiàn)_第4頁(yè)
基于嵌入式的貪食蛇的設(shè)計(jì)和實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩16頁(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)介

1、嵌入式大作業(yè)貪食蛇的設(shè)計(jì)和實(shí)現(xiàn)作 者 姓 名: 學(xué)科、專(zhuān)業(yè) : 學(xué) 號(hào) : 指 導(dǎo) 教 師: 完 成 日 期: 大連大學(xué)Dalian University37摘 要 WinCE 是微軟公司嵌入式、移動(dòng)計(jì)算平臺(tái)的基礎(chǔ) 它是一個(gè)開(kāi)放的、 可升級(jí)的 32 位嵌入式操作系統(tǒng) 是基于掌上型 電腦類(lèi)的電子設(shè)備操作系統(tǒng) 。本文基于此,嘗試設(shè)計(jì)了基于嵌入式winCE開(kāi)發(fā)的一款貪吃蛇游戲,主要目的是通過(guò)開(kāi)發(fā)嵌入式貪吃蛇游戲,掌握嵌入式開(kāi)發(fā)的整個(gè)過(guò)程,同時(shí)介紹基于winCE嵌入式開(kāi)發(fā)的詳細(xì)設(shè)計(jì)步驟,向初學(xué)者介紹開(kāi)發(fā)基于winCE方面嵌入式程序的整個(gè)框架流程。本論文軟件方面采用的是EVC+4.0開(kāi)發(fā)平臺(tái)設(shè)計(jì)程序,P

2、B5.0進(jìn)行系統(tǒng)定制,硬件方面采用的是PXA270-S實(shí)驗(yàn)開(kāi)發(fā)箱。整個(gè)設(shè)計(jì)流程將在本論文主體部分進(jìn)行詳細(xì)的敘述。從定制自己所需的winCE系統(tǒng)、運(yùn)用MFC基于對(duì)話(huà)框的C+語(yǔ)言編寫(xiě)貪吃蛇游戲源代碼到最終下載程序到實(shí)驗(yàn)開(kāi)發(fā)板的整個(gè)過(guò)程都做了很詳細(xì)的介紹。關(guān)鍵詞:winCE5.0、EVC+4.0、PB5.0 、嵌入式系統(tǒng)、貪吃蛇游戲目 錄摘 要2引 言11系統(tǒng)概要設(shè)計(jì)21.1系統(tǒng)的整體結(jié)構(gòu)21.1.1 系統(tǒng)的定制21.1.2 程序的編寫(xiě)21.2系統(tǒng)的硬件構(gòu)建41.3系統(tǒng)的軟件組成52.系統(tǒng)的詳細(xì)設(shè)計(jì)62.1 定制winCE內(nèi)核62.1.1 winCE內(nèi)核定制原理以說(shuō)明62.1.2 winCE內(nèi)核定制

3、72.2 貪吃蛇游戲詳細(xì)設(shè)計(jì)開(kāi)發(fā)82.2.1 貪吃蛇游戲的可行性分析82.2.2 貪吃蛇游戲的需求分析82.2.3 貪吃蛇游戲的總體功能圖102.2.4 貪吃蛇游戲的實(shí)現(xiàn)的功能模塊102.2.5 貪吃蛇游戲的主要功能設(shè)計(jì)思路112.2.6 貪吃蛇游戲界面的實(shí)現(xiàn)162.2.7 貪吃蛇游戲主要代碼說(shuō)明173.系統(tǒng)整合及測(cè)試263.1 系統(tǒng)整合263.2 系統(tǒng)整體測(cè)試273.2.1 系統(tǒng)規(guī)則測(cè)試273.2.2 按鍵功能測(cè)試283.2.3 分?jǐn)?shù)和關(guān)卡測(cè)試32結(jié)論34引 言隨著計(jì)算機(jī)技術(shù)的快速發(fā)展,嵌入式技術(shù)也相應(yīng)的取得了突破性的進(jìn)展,嵌入式設(shè)備正日益滲透到人們的日常生活中,默默地為我們提供連接和服務(wù),

4、嵌入式設(shè)備往往是一個(gè)資源有限的系統(tǒng),它們追求的是在有限的價(jià)格上滿(mǎn)足一定的功能性要求。通常它們采用那些功能并不強(qiáng)大的CPU,這也是開(kāi)發(fā)者不得不盡可能地壓縮嵌入式系統(tǒng)性能的原因。最初的嵌入式設(shè)備是單一用途的,它們擁有各自獨(dú)特的顯示方式和用戶(hù)界面,而今天它們變成了類(lèi)似PC系統(tǒng)。它們可以運(yùn)行很多相同的應(yīng)用程序。針對(duì)嵌入式資源的限制,如何將對(duì)資源有很大依賴(lài)性的大規(guī)模的計(jì)算,成功的移植到嵌入式系統(tǒng)中,并能使其達(dá)到類(lèi)似與在PC 上計(jì)算的效果。針對(duì)此問(wèn)題,必須對(duì)原適用于PC上的游戲引擎做出修改,才能使其在嵌入式系統(tǒng)中成功的運(yùn)行。因此需要在特定的環(huán)境下開(kāi)發(fā)相應(yīng)的游戲,這樣才能在以后下載到相應(yīng)的板子上進(jìn)行效果演示

5、。目前嵌入式行業(yè)在中國(guó)得到了有效發(fā)展,但是規(guī)模相應(yīng)的還與國(guó)際上有很大的差距,因此,為了能夠讓大家對(duì)基于嵌入式wince開(kāi)發(fā)游戲得到有效的理解,本論文以貪吃蛇游戲?yàn)樵敿?xì)的例子,完整的闡述了嵌入式游戲的開(kāi)發(fā)流程,以及演示結(jié)果,還有中間特別要注重的難點(diǎn)疑點(diǎn)的解析。本文對(duì)具體的開(kāi)發(fā)流程都做了很詳細(xì)的闡述,從編碼到仿真,然后在定制系統(tǒng)內(nèi)核,最后進(jìn)行應(yīng)用程序的下載,完成貪吃蛇游戲的具體效果演示,論文的后續(xù)都做了相當(dāng)詳細(xì)的解釋。1系統(tǒng)概要設(shè)計(jì)1.1系統(tǒng)的整體結(jié)構(gòu)1.1.1 系統(tǒng)的定制首先所需winCE系統(tǒng)內(nèi)核的定制,通過(guò)PlatformBuilders5.0來(lái)定制自己所需要的系統(tǒng)內(nèi)核,根據(jù)自己程序設(shè)計(jì)時(shí)所用

6、到的win32程序的接口,以及用到的庫(kù)函數(shù),類(lèi)庫(kù),各種所需要的驅(qū)動(dòng),例如USB驅(qū)動(dòng),屏幕顯示驅(qū)動(dòng),鼠標(biāo)驅(qū)動(dòng),鍵盤(pán)驅(qū)動(dòng)等,來(lái)定制自己所需要的系統(tǒng)內(nèi)核,系統(tǒng)不必過(guò)于繁瑣,達(dá)到自己所需要的功能即可,因?yàn)槲覀兯鶑?qiáng)調(diào)的是嵌入式,嵌入式是以方便為前提的,定制的系統(tǒng)是以簡(jiǎn)潔方便為目的的,具體的定制細(xì)節(jié)我們?cè)诘谒恼聦?huì)詳細(xì)介紹。1.1.2 程序的編寫(xiě)程序的名稱(chēng)是貪吃蛇游戲,采用的是VC+語(yǔ)言,MFC微軟基礎(chǔ)類(lèi)庫(kù)環(huán)境的單文檔窗體。程序的大體思想是:采用一個(gè)二維數(shù)組(這里我們采用的是24*24的整形數(shù)組)作為貪吃蛇游戲的背景地圖,數(shù)組的每個(gè)值代表地圖上每個(gè)小矩形,而每個(gè)小矩形連續(xù)組成貪吃蛇的蛇身,在程序初始化窗體

7、時(shí)候調(diào)用這個(gè)函數(shù),刷新出程序的背景地圖;程序貪吃蛇的蛇身用一個(gè)Cpoint 類(lèi)的一位連續(xù)數(shù)組,Cpoint類(lèi)是一個(gè)結(jié)構(gòu)體類(lèi)型,結(jié)構(gòu)體類(lèi)型里包含著兩個(gè)整形參數(shù)x和y 代表的是屏幕窗體上的某一個(gè)對(duì)應(yīng)的點(diǎn)的坐標(biāo),我們?cè)诘弥c(diǎn)的坐標(biāo)的同時(shí),就明確了對(duì)應(yīng)二維數(shù)組地圖上的某個(gè)矩形區(qū)域的坐標(biāo)值,這樣用Cpoint類(lèi)的一位數(shù)組我們可以存放蛇身的每個(gè)節(jié)點(diǎn)的坐標(biāo),于此同時(shí),我們?cè)诔绦騭nake類(lèi)里面設(shè)定蛇頭和蛇尾的坐標(biāo)變量、蛇身長(zhǎng)度的坐標(biāo)變量,這樣在程序調(diào)用Timer()系統(tǒng)函數(shù)定時(shí)刷新時(shí),每次刷新只需要改變蛇頭和蛇尾的坐標(biāo)即可,每次刷新時(shí),根據(jù)舍身前進(jìn)方向判斷下一個(gè)頭節(jié)點(diǎn)的坐標(biāo)值,然后添加到Cpoint類(lèi)定義的

8、蛇身節(jié)點(diǎn),而蛇尾節(jié)點(diǎn)坐標(biāo)值是前一個(gè)狀態(tài)的倒數(shù)第二個(gè)節(jié)點(diǎn),然后調(diào)用庫(kù)函數(shù)FillSolildRect()函數(shù)刷新頭節(jié)點(diǎn)為蛇的自身顏色,而尾節(jié)點(diǎn)是地圖背景顏色,這樣我們?cè)谕庥^(guān)看起來(lái)就是蛇身前進(jìn)的效果。那么,我們?cè)趺磁袛嗌哳^前進(jìn)的方向呢?這個(gè)問(wèn)題的解決方式是,在定義snake類(lèi)的同時(shí),定義了一個(gè)私有變量Direction為蛇動(dòng)態(tài)前進(jìn)的方向,而每次Timer()刷新時(shí),動(dòng)態(tài)的根據(jù)鍵盤(pán)響應(yīng)函數(shù)來(lái)判斷前進(jìn)方向,并同時(shí)給Direction賦值,這樣每次刷新的同時(shí)Direction為四個(gè)方向(上、下、左、右)其中的一個(gè)方向,蛇頭前進(jìn)的方向在此時(shí)已經(jīng)確定,這樣就動(dòng)態(tài)的根據(jù)輸入的鍵盤(pán)值來(lái)改變蛇的前進(jìn)方向,我們就可

9、以控制蛇的移動(dòng)啦!最后,在蛇動(dòng)態(tài)效果顯示出來(lái)的同時(shí),我們也應(yīng)該考慮到蛇的生命周期問(wèn)題,就是蛇在什么情況下會(huì)死亡,在什么情況下會(huì)得分,在什么情況下會(huì)自身長(zhǎng)度增加等一系列相關(guān)問(wèn)題。這里我們首先考慮到一個(gè)十分重要的問(wèn)題,就是蛇遇到食物(這里我們用一個(gè)藍(lán)色的小矩形表示蛇的食物蘋(píng)果)同時(shí),將食物吃掉并且動(dòng)態(tài)自身增加一節(jié),這里我們是這樣實(shí)現(xiàn)的:首先實(shí)現(xiàn)的是食物的隨機(jī)出現(xiàn),在某個(gè)食物被吃掉的同時(shí),我們要立即產(chǎn)生出下一個(gè)食物的坐標(biāo),我們用到的是一個(gè)隨機(jī)函數(shù)產(chǎn)生出下一個(gè)食物的坐標(biāo),但是這個(gè)坐標(biāo)必須僅僅在023之間,因?yàn)槲覀兊貓D采用的是一個(gè)24維的二維數(shù)組表示的,地圖每個(gè)橫坐標(biāo)縱坐標(biāo)的范圍是023,但是,這里注意

10、一個(gè)特別重要的問(wèn)題,就是每次隨機(jī)產(chǎn)生的食物坐標(biāo)不能出現(xiàn)在當(dāng)前蛇身上,我們必須加一個(gè)判斷,如果產(chǎn)生的坐標(biāo)在蛇身上,必須重新生成,一直到產(chǎn)生一個(gè)在地圖上并且不在蛇身上的食物坐標(biāo)為止;當(dāng)蛇頭坐標(biāo)的下一個(gè)前進(jìn)方向的坐標(biāo)和食物坐標(biāo)相等時(shí),我們?cè)谶@里是將食物坐標(biāo)改變成當(dāng)前蛇頭坐標(biāo),并且蛇尾坐標(biāo)不變,蛇身長(zhǎng)度增加一個(gè)單位,這樣就動(dòng)態(tài)的現(xiàn)實(shí)出來(lái)蛇吃食物自身增加一個(gè)的效果。生命周期的問(wèn)題:在我們解決上述功能的同時(shí),我們不得不考慮一個(gè)問(wèn)題,那就是蛇的生命周期問(wèn)題,就是蛇在身?xiàng)l件下會(huì)死亡,死亡的結(jié)果會(huì)是怎么樣,我們?cè)谶@里做了一個(gè)判斷,就是蛇遇到地圖周?chē)膲陀龅阶约旱纳眢w蛇會(huì)死亡,生命周期結(jié)束,于此同時(shí)記錄下當(dāng)前玩

11、家所得的分?jǐn)?shù),比較分?jǐn)?shù)來(lái)判斷玩家的能力程度,那么我們?cè)趺磁袛嗌哳^撞墻和蛇頭撞到自身呢?繼承上一個(gè)問(wèn)題的解決方式,蛇身用到的是Cpoint類(lèi)的一個(gè)一維數(shù)組表示,地圖用到的是一個(gè)二維數(shù)組表示,當(dāng)蛇頭節(jié)點(diǎn)的左邊和二維數(shù)組邊界值相等時(shí),或者蛇頭坐標(biāo)變?yōu)樯咦陨淼淖鴺?biāo)時(shí),蛇死亡,生命周期結(jié)束,關(guān)閉定時(shí)器函數(shù)Timer(),初始化游戲界面,記錄當(dāng)前分?jǐn)?shù),重新等待游戲開(kāi)始。到此為止,貪吃蛇游戲的大概思路就解決了。1.2系統(tǒng)的硬件構(gòu)建 硬件環(huán)境分析:系統(tǒng)硬件平臺(tái)采用的是PXA270-S實(shí)驗(yàn)開(kāi)發(fā)板,開(kāi)發(fā)板提供了多種CPU內(nèi)核共大家使用,具體的內(nèi)核信息詳細(xì)如下:X86:支持的處理器包括486、586、Geode、P

12、entium I/II/III/IV。ARM:支持的處理器包括ARM720T、ARM920T、ARM1020T、StrongARM、Xscale。SHx:支持的處理器包括SH-3、SH-3 DSP、SH-4。MIPS:支持的處理器包括MIPS II/32(帶浮點(diǎn)運(yùn)算)、MIPS II/3(不帶浮點(diǎn)運(yùn)算)、MIPS16、MIPS IV/64(帶浮點(diǎn)運(yùn)算)、MIPS IV/6(不帶浮點(diǎn)運(yùn)算)。軟件環(huán)境分析:PC機(jī)操作系統(tǒng)Win2000或以上,EVC4.0開(kāi)發(fā)環(huán)境,WinCE500標(biāo)準(zhǔn)SDK,PXA270-S平臺(tái)SDK。1.3系統(tǒng)的軟件組成PC機(jī)操作系統(tǒng)Win2000或以上,EVC4.0開(kāi)發(fā)環(huán)境,W

13、inCE500標(biāo)準(zhǔn)SDK,PXA270-S平臺(tái)SDK。2.系統(tǒng)的詳細(xì)設(shè)計(jì)2.1 定制winCE內(nèi)核2.1.1 winCE內(nèi)核定制原理以說(shuō)明 定制winCE內(nèi)核之前,我們首先要做的準(zhǔn)備工作詳見(jiàn)下:首先是安裝PB工具,我們這里之前已經(jīng)提及,所以就不再過(guò)多敘述。在實(shí)際操作中,我們主要有如下的注意事項(xiàng): (1)推薦安裝在分區(qū)根目錄下。并且分區(qū)需要保持足夠大的硬盤(pán)空間,一般需要5G以上,PB和運(yùn)行在PC的WinCE環(huán)境需要安裝在一個(gè)分區(qū)內(nèi)。安裝時(shí)間通常較長(zhǎng),網(wǎng)絡(luò)安裝的版本同時(shí)依賴(lài)網(wǎng)絡(luò)的速度。 以下是微軟推薦的最小配置,低于該配置PB工具將不能正常安裝或使用;處理器:至少266MHz Pentium II

14、以上;推薦使用500MHz Pentium III以上CPU;操作系統(tǒng):Windows 2000 SP2以上;Windows XP;內(nèi)存要求:至少128M;使用模擬器時(shí)候至少192M(不包括操作系統(tǒng)本身占用的內(nèi)存)硬盤(pán):典型安裝時(shí),選擇一種處理器需至少1.7G空間;若要包含Platform Builder的完整工具組在內(nèi)需要至少12G的硬盤(pán)空間。光驅(qū):可以使用與桌面系統(tǒng)相兼容的CD-ROM或DVD-ROM等。 (2)在安裝過(guò)程中,會(huì)提示選擇處理器體系結(jié)構(gòu),務(wù)必選中ARMV4I和XSCALE兩項(xiàng),否則無(wú)法支持PXA270處理器。 (3)如果PC上使用的操作系統(tǒng)為Windows XP SP2,可能

15、出現(xiàn)嚴(yán)重安裝問(wèn)題,最好不要采用Windows XP SP2,或者在微軟網(wǎng)站上搜索相關(guān)的指導(dǎo)文檔。安裝過(guò)程中請(qǐng)關(guān)閉系統(tǒng)防火墻。然后需要建立系統(tǒng)最基本的配置。打開(kāi)PB 5.0,首先導(dǎo)入我們提供的BSP包。導(dǎo)入BSP的過(guò)程很簡(jiǎn)單,只需要安裝光盤(pán)中提供的up270classic_BSP文件就可以實(shí)現(xiàn),可以由指導(dǎo)教師提前完成。安裝完,會(huì)發(fā)現(xiàn)在系統(tǒng)的WINCE500Platform路徑下出現(xiàn)“Up_PXA270cl”文件夾,這個(gè)就是安裝好的BSP了。之后建立UP-TECH S2410/P270 DVP的WinCE工程,都需要建立在這個(gè)BSP的基礎(chǔ)上。(類(lèi)似地,你也可以自己構(gòu)建系統(tǒng)自帶的Mainstone

16、II的工程,但是它不能運(yùn)行在UP-TECH S2410/P270 DVP實(shí)驗(yàn)箱上)。2.1.2 winCE內(nèi)核定制我們?cè)诰幾gwinCE內(nèi)核鏡像前,需要添加特性目錄(Catalog)的一些組件來(lái)定制內(nèi)核,我們?cè)诒鞠到y(tǒng)需要添加以下的組件:(1)添加鼠標(biāo)鍵盤(pán)控制驅(qū)動(dòng); (2)添加USB主控制器驅(qū)動(dòng);(3)添加USB從控制器驅(qū)動(dòng)(建立與PC機(jī)的Activesyn。連接需要此特性);(4)添加串口驅(qū)動(dòng); (5)添加觸摸屏驅(qū)動(dòng);(6)添加IE6.0瀏覽器驅(qū)動(dòng);(7)添加撥號(hào)網(wǎng)絡(luò)組件驅(qū)動(dòng);(8)添加Fat文件系統(tǒng);. (9)加入對(duì)HIVE注冊(cè)表的支持;(10)加入對(duì)Mediaplayer播放器;(11)加入

17、對(duì)本地存儲(chǔ)器中的mp3和wMA文件播放的支持。除了上述所需的添加組件外,我們還需要一些另外的組件。2.2 貪吃蛇游戲詳細(xì)設(shè)計(jì)開(kāi)發(fā)2.2.1 貪吃蛇游戲的可行性分析 通過(guò)查找相關(guān)文檔和技術(shù)支持,了解了EVC環(huán)境下的開(kāi)發(fā)過(guò)程,熟悉了VC+語(yǔ)言的開(kāi)發(fā)技巧,通過(guò)以下幾個(gè)方面,進(jìn)行可行性分析:1. 參考貪吃蛇游戲用戶(hù)描述文檔、軟件工程等書(shū),確定自己能夠在自己能力范圍內(nèi)開(kāi)發(fā)出這個(gè)貪吃蛇游戲項(xiàng)目。2. 功能要求:在進(jìn)行整個(gè)項(xiàng)目開(kāi)發(fā)之前,必須要做的就是確定貪吃蛇游戲的主要功能,必須明確貪吃蛇游戲的功能,因?yàn)橐M(jìn)行游戲功能可行性分析,經(jīng)過(guò)自己的查閱相關(guān)資料,確定了貪吃蛇游戲的具體功能,詳見(jiàn)后續(xù)部分詳細(xì)設(shè)計(jì)。3.

18、 性能需求:必須保證自己開(kāi)發(fā)的貪吃蛇游戲能夠整體盡可能做到高效快速,不占用大量的使用資源,因?yàn)槲易龅氖且粋€(gè)嵌入式的游戲開(kāi)發(fā)項(xiàng)目,必須要考慮資源使用情況,要求盡可能少用資源,在有限的資源范圍內(nèi)實(shí)現(xiàn)最大的可利用價(jià)值。4. 運(yùn)行環(huán)境:PXA270-S開(kāi)發(fā)板,EVC +4.0開(kāi)發(fā)平臺(tái),模擬器上進(jìn)行調(diào)試,經(jīng)過(guò)安裝軟件,確定可以進(jìn)行項(xiàng)目程序的編寫(xiě)。5. 界面要求:采用Windows標(biāo)準(zhǔn)界面,只需要使用鍵盤(pán)和鼠標(biāo)。6. 完成期限,一個(gè)學(xué)期完成整個(gè)系統(tǒng),包括程序的編寫(xiě),硬件板子的下載,以及最終的調(diào)試,測(cè)試階段。2.2.2 貪吃蛇游戲的需求分析文檔包括了嵌入式技術(shù)領(lǐng)域的介紹,嵌入式國(guó)內(nèi)外環(huán)境的探索與簡(jiǎn)介,主要從

19、我國(guó)嵌入式領(lǐng)域發(fā)展的最新階段來(lái)探討,與國(guó)際對(duì)比得出相應(yīng)發(fā)展的前景,同時(shí),針對(duì)自身對(duì)嵌入式方面的興趣愛(ài)好,以及自己所掌握的有限知識(shí)來(lái)對(duì)嵌入式方面的一些看法等,另外還有winCE環(huán)境的簡(jiǎn)介,以及用法,還有關(guān)于嵌入式基于winCE的開(kāi)發(fā)流程的一些相關(guān)文檔,還有EVC+4.0開(kāi)發(fā)工具的使用方法的介紹,以及游戲的詳細(xì)代碼的功能簡(jiǎn)介等。游戲功能:能夠?qū)崿F(xiàn)貪吃蛇自動(dòng)前線(xiàn)移動(dòng),也就是貪吃蛇能夠“活動(dòng)”的外觀(guān)效果,根據(jù)相同的時(shí)間間隔,每一次將貪吃蛇自身的蛇頭向前移動(dòng)一個(gè)小格子,同時(shí)蛇尾向前移動(dòng)一個(gè)小格子,移動(dòng)方向?yàn)樨澇陨咝凶叩姆较颉?duì)游戲中規(guī)則進(jìn)行判斷,當(dāng)游戲中的貪吃蛇遇到墻壁和自身時(shí),根據(jù)規(guī)則判斷應(yīng)為死亡,宣

20、告當(dāng)前游戲結(jié)束,記錄當(dāng)前游戲的分?jǐn)?shù)值。根據(jù)每次所得的分?jǐn)?shù)值不同,判斷玩家的能力,來(lái)顯示玩家的效果。貪吃蛇的相關(guān)操作,根據(jù)鍵盤(pán)上的上、下、左、右四個(gè)鍵來(lái)控制貪吃蛇游戲的前進(jìn)方向,同時(shí),根據(jù)空格鍵來(lái)開(kāi)始游戲,空格鍵在游戲開(kāi)始時(shí),還有另外一個(gè)功能,那就是暫停游戲功能,這樣玩家就可以根據(jù)暫停游戲來(lái)處理當(dāng)前需要處理的事情,當(dāng)游戲結(jié)束時(shí),按回車(chē)鍵就可以重新開(kāi)始游戲的初始化界面。果實(shí)的出現(xiàn),每次貪吃蛇吃到果實(shí)時(shí),于此同時(shí),應(yīng)該出現(xiàn)一個(gè)果實(shí)在地圖中,那么怎么實(shí)現(xiàn)這個(gè)功能呢?我采用的是隨機(jī)函數(shù)出現(xiàn)果實(shí)的橫縱坐標(biāo),然后判斷這個(gè)店得坐標(biāo)是不是在蛇身上,如果是那么就得重現(xiàn)出現(xiàn)上一個(gè)過(guò)程,直到食物的坐標(biāo)不在蛇身上為止。

21、這樣就出現(xiàn)了果實(shí)。游戲分?jǐn)?shù)的統(tǒng)計(jì)方法,當(dāng)貪吃蛇吃到果實(shí)時(shí),玩家的分?jǐn)?shù)就應(yīng)該隨著吃到的果實(shí)而增加,增加的規(guī)則就是貪吃蛇的身體長(zhǎng)度乘以等級(jí) 得到分?jǐn)?shù)。這樣就可以根據(jù)游戲的難度對(duì)應(yīng)得到分?jǐn)?shù)。2.2.3 貪吃蛇游戲的總體功能圖 貪吃蛇功能圖2.2.4 貪吃蛇游戲的實(shí)現(xiàn)的功能模塊在貪吃蛇游戲中,本論文設(shè)計(jì)的貪吃蛇游戲的大致可以分為五個(gè)功能模塊,以下是對(duì)這五個(gè)模塊的具體介紹:游戲規(guī)則模塊功能設(shè)計(jì):游戲規(guī)則包括蛇的運(yùn)動(dòng)范圍、蛇的生命周期問(wèn)題、分?jǐn)?shù)統(tǒng)計(jì)、關(guān)卡判斷。其中蛇的運(yùn)動(dòng)范圍是一個(gè)33*57的List Box,蛇運(yùn)動(dòng)的地圖抽象成為一個(gè)33*57的List Box,當(dāng)蛇遇到List Box邊界值(我們?cè)谶@里

22、抽象成為上、下、左、右四個(gè)邊界,其中上邊界坐標(biāo)值中縱坐標(biāo)都是20,橫坐標(biāo)任意,下邊界為縱坐標(biāo)是53,同理橫坐標(biāo)不變,左邊界為橫坐標(biāo)為20,縱坐標(biāo)任意,同理右邊界為橫坐標(biāo)為77,縱坐標(biāo)任意)時(shí),宣告蛇生命周期結(jié)束,貪吃蛇死亡,這個(gè)是第一個(gè)規(guī)則;另外,當(dāng)蛇自己吃到自己身體的某一部分時(shí),也宣告游戲結(jié)束,在程序里通過(guò)循環(huán)判斷蛇頭下一個(gè)前進(jìn)方向的節(jié)點(diǎn)是不是蛇身上的某一部分節(jié)點(diǎn)即可,如果是那么蛇死亡,否則繼續(xù)運(yùn)行游戲。分?jǐn)?shù)統(tǒng)計(jì)算法的思想是每次蛇吃到一個(gè)果實(shí)時(shí),相加的分?jǐn)?shù)為蛇身長(zhǎng)度乘以一個(gè)定值來(lái)記錄分?jǐn)?shù),這樣可以隨著游戲難度的增加,分?jǐn)?shù)值也隨之增多。關(guān)卡功能設(shè)置通過(guò)與分?jǐn)?shù)相關(guān)聯(lián)而體現(xiàn)的,初始化游戲?yàn)榈谝魂P(guān),

23、分?jǐn)?shù)為0,當(dāng)玩家玩到一定的分?jǐn)?shù)時(shí)(例如是500)關(guān)卡加一,變?yōu)榈诙P(guān),同時(shí),蛇前進(jìn)速度相應(yīng)增加一個(gè)等級(jí),這樣就實(shí)現(xiàn)了不同關(guān)卡,不同速度的貪吃蛇,從而增加了游戲的難度。蛇身操作模塊功能的設(shè)計(jì): 首先得到當(dāng)前按下的移動(dòng)方向,此時(shí)有兩種情況需要考慮,如果遇到的是一個(gè)果實(shí),則蛇身長(zhǎng)度增加一個(gè)單位,表現(xiàn)在程序中是存放蛇身數(shù)組值增加一位,如果沒(méi)遇到果實(shí),則不斷更新蛇身數(shù)組中的相應(yīng)坐標(biāo)值。按鍵功能模塊:游戲是通過(guò)鍵盤(pán)按鍵控制,其中空格鍵控制游戲開(kāi)始和暫停,上、下、左、右鍵控制蛇頭前進(jìn)方向,回車(chē)鍵控制游戲重新開(kāi)始,程序內(nèi)部是通過(guò)消息響應(yīng)函數(shù)實(shí)現(xiàn)。主界面地圖模塊:貪吃蛇游戲的主界面是通過(guò)窗體初始化事件進(jìn)行實(shí)現(xiàn)的

24、,運(yùn)用MFC類(lèi)庫(kù)中的FillSoldRect ()庫(kù)函數(shù)通過(guò)程序內(nèi)部的二維數(shù)組進(jìn)行繪制地圖,地圖然后可以改變,這樣在游戲運(yùn)行后就會(huì)在窗體上顯示游戲初始化的效果。幫組模塊:通過(guò)窗體的調(diào)用另外一個(gè)幫組窗體顯示游戲的規(guī)則,游戲的計(jì)分公式,游戲的玩法等等。2.2.5 貪吃蛇游戲的主要功能設(shè)計(jì)思路Windows MFC在程序執(zhí)行時(shí),會(huì)動(dòng)態(tài)的調(diào)用窗口資源,在程序自動(dòng)生成函數(shù)中,添加相應(yīng)的函數(shù)實(shí)現(xiàn)程序初始化界面,本程序的具體思路是:程序在開(kāi)始執(zhí)行時(shí)會(huì)調(diào)用BOOL CSnakeDlg:OnInitDialog()函數(shù),進(jìn)行窗體的初始化,我們?cè)诖舜绑w客戶(hù)區(qū)求得窗體長(zhǎng)和寬的最小值,記錄在WIDTHOFBRICKS

25、和HEIGHTOFBRICKS 變量中,因?yàn)槲覀冊(cè)O(shè)計(jì)的游戲地圖是一個(gè)33*57的矩形區(qū)域,在這,根據(jù)WIDTHOFBRICKS和HEIGHTOFBRICKS 等分,求出每個(gè)小矩形的邊長(zhǎng)存放在HEIGHTOFBRICKS和WIDTHOFBRICKS變量中,然后調(diào)用繪圖函數(shù)void CSnakeDlg:MyDraw()進(jìn)行地圖的繪制,這樣在程序執(zhí)行時(shí),就動(dòng)態(tài)繪制了貪吃蛇游戲地圖。首先,食物時(shí)通過(guò)一個(gè)坐標(biāo)記錄下在地圖上的位置,通過(guò)繪圖函數(shù)繪制這點(diǎn)坐標(biāo)的小矩形,程序中采用的是隨機(jī)數(shù)生成食物出現(xiàn)的坐標(biāo)。其次,程序中必須增加一個(gè)判斷,判斷當(dāng)前生成的食物坐標(biāo)是否在貪吃蛇身體范圍內(nèi),如果當(dāng)前生成的坐標(biāo)在蛇身坐

26、標(biāo)范圍內(nèi),那么必須重新隨機(jī)產(chǎn)生食物坐標(biāo)直到不在為止。如果坐標(biāo)不在蛇身坐標(biāo)范圍內(nèi),則把坐標(biāo)位置返回給調(diào)用對(duì)象。程序中本模塊具體功能是在void InitFoods()函數(shù)中實(shí)現(xiàn)。具體代碼參見(jiàn)程序主要代碼說(shuō)明。程序執(zhí)行的步驟:首先接受玩家按下方向鍵消息,并把當(dāng)前要前進(jìn)的方向保存在方向變量snake_direct中,記錄貪吃蛇下一個(gè)狀態(tài)前進(jìn)的方向,通過(guò)方向判斷頭節(jié)點(diǎn)下一個(gè)節(jié)點(diǎn)的坐標(biāo)值。先判斷下一個(gè)節(jié)點(diǎn)坐標(biāo)值是不是符合游戲規(guī)則之內(nèi)(也就是判斷蛇是不是死亡)的坐標(biāo),此時(shí)調(diào)用IS_GameOver()函數(shù)判斷游戲是否結(jié)束,如果結(jié)束宣告游戲結(jié)束,否則程序繼續(xù)執(zhí)行;如果下一個(gè)節(jié)點(diǎn)的坐標(biāo)值與當(dāng)前食物節(jié)點(diǎn)坐標(biāo)值(

27、snake_foods)相同,則調(diào)用void MyDraw()函數(shù)重繪蛇頭和蛇尾節(jié)點(diǎn)顏色,因?yàn)榇藭r(shí)蛇吃到一個(gè)果實(shí),蛇身長(zhǎng)度加一,動(dòng)態(tài)的現(xiàn)實(shí),將果實(shí)重繪為蛇身顏色(紅色),蛇尾節(jié)點(diǎn)顏色不變,蛇身變量長(zhǎng)度snake_body_length自加,動(dòng)態(tài)記錄當(dāng)前蛇頭節(jié)點(diǎn)snake_head和蛇尾節(jié)點(diǎn)snake_rear的坐標(biāo);如果下一個(gè)節(jié)點(diǎn)不是食物節(jié)點(diǎn),重繪蛇頭蛇尾顏色,蛇身長(zhǎng)度不變,動(dòng)態(tài)的蛇頭和蛇尾節(jié)點(diǎn)坐標(biāo)改變。分?jǐn)?shù)統(tǒng)計(jì)和改變關(guān)卡的設(shè)計(jì)思路:在本程序設(shè)計(jì)的貪吃蛇游戲中,分?jǐn)?shù)統(tǒng)計(jì)采用的是如下公式進(jìn)行的統(tǒng)計(jì),貪吃蛇游戲分?jǐn)?shù) = 貪吃蛇蛇身長(zhǎng)度 * 定制變量(本程序設(shè)置的是整形常量5),這樣可以動(dòng)態(tài)的根據(jù)蛇

28、身長(zhǎng)度不同,每次得到果實(shí)的分?jǐn)?shù)也就隨之不同,體現(xiàn)了游戲難度的差異;另外游戲關(guān)卡的設(shè)計(jì)與分?jǐn)?shù)統(tǒng)計(jì)有著密切的關(guān)系,關(guān)卡是通過(guò)玩家玩得的分?jǐn)?shù)而自動(dòng)晉級(jí)的,換句話(huà)說(shuō),例如:游戲的初始化分?jǐn)?shù)為0,游戲關(guān)卡為第一關(guān),當(dāng)玩家玩到1000分?jǐn)?shù)時(shí)根據(jù)程序內(nèi)部定義,關(guān)卡增加一級(jí),同時(shí),游戲難度也要隨之增加,體現(xiàn)在程序中就是,定時(shí)器變量刷新間隔要變小,也就是類(lèi)中定義的TimerInterval變量要隨之相應(yīng)的變小。這樣,在玩家看來(lái),蛇的刷新速度就會(huì)變得越來(lái)越快。按鍵響應(yīng)功能的設(shè)置思路:貪吃蛇游戲的控制通過(guò)鍵盤(pán)按鍵來(lái)控制,所以必須實(shí)現(xiàn)鍵盤(pán)響應(yīng)功能,程序規(guī)定,上、下、左、右按鍵控制貪吃蛇的前進(jìn)方向,空格鍵控制游戲開(kāi)始和

29、暫停,當(dāng)按下回車(chē)鍵時(shí),游戲重新進(jìn)行初始化,重新開(kāi)始游戲,此時(shí)需要重復(fù)上一個(gè)過(guò)程。這些按鍵消息響應(yīng)是通過(guò)函數(shù)BOOL CSnakeDlg:PreTranslateMessage(MSG* pMsg)來(lái)實(shí)現(xiàn),內(nèi)部通過(guò)case語(yǔ)句進(jìn)行相應(yīng)按鍵的響應(yīng),從而實(shí)現(xiàn)按鍵響應(yīng)功能2.2.6 貪吃蛇游戲界面的實(shí)現(xiàn)貪吃蛇游戲界面是通過(guò)MFC初始化窗口實(shí)現(xiàn),地圖是通過(guò)初始化窗體時(shí),計(jì)算窗體客戶(hù)區(qū)高度和寬度,然后取其中最小值,等分為24部分,記錄下每部分的長(zhǎng)度,這就是地圖中每個(gè)小矩形的長(zhǎng)度。具體界面詳見(jiàn)下圖:如上圖:游戲界面左邊為地圖部分,是一個(gè)33*的二維數(shù)組抽象出來(lái)的,右面有七個(gè)按鈕部分,分別對(duì)應(yīng)著上訴部分按鍵功

30、能。2.2.7 貪吃蛇游戲主要代碼說(shuō)明下面函數(shù)是游戲開(kāi)始函數(shù),主要功能是初始化游戲的狀態(tài),開(kāi)啟計(jì)時(shí)器函數(shù),實(shí)現(xiàn)游戲的開(kāi)始。void CSnakeDlg:Start()Level=1;Score=0;TimerInterval=200;GameState=RUNNING;dead_flag=1;/初始化蛇沒(méi)有死SetDlgItemText(IDC_SCORE_NUM,L"0");SetTimer(1,TimerInterval,NULL);/開(kāi)始設(shè)置計(jì)時(shí)器下面的函數(shù)功能是初始化游戲界面,通過(guò)窗體初始化事件來(lái)進(jìn)行計(jì)算游戲地圖的寬和高,這樣進(jìn)一步計(jì)算出來(lái)游戲地圖上每個(gè)小格子的寬度

31、和高度,然后調(diào)用初始化函數(shù)進(jìn)行游戲界面初始化。BOOL CSnakeDlg:OnInitDialog()CDialog:OnInitDialog();SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);CenterWindow(GetDesktopWindow();CRect rt;GetClientRect(&rt);WIDTHOFBRICKS=(rt.right -rt.left)-LEFTMARGIN)/24;/HEIGHTOFBRICKS=(rt.bottom-rt.top)/24;WIDTHOFBRICKS=HEIGHTOFBRICK

32、S=min(WIDTHOFBRICKS,HEIGHTOFBRICKS);Level=0;GameState=STOP;InitSnake();return TRUE; 下面是通過(guò)二維數(shù)組值來(lái)確定地圖上的各種顏色,是背景色,是蛇身色,還是食物顏色等。void CSnakeDlg:RefreshAll()CDC* dc=GetDC();for(int y=0;y<24;y+)for(int x=0;x<24;x+)if(SnakeOfBrickyx=0) dc->FillSolidRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HEIGHTOFBRICK

33、S,WIDTHOFBRICKS,HEIGHTOFBRICKS,BACKCOLOR); dc->Draw3dRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRIC KS,CLRTOPLEFT,BACKCOLOR);if(SnakeOfBrickyx=1) dc->FillSolidRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,SNAKECOLOR); dc->Dr

34、aw3dRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,CLRTOPLEFT,SNAKECOLOR);ReleaseDC(dc);3.系統(tǒng)整合及測(cè)試3.1 系統(tǒng)整合通過(guò)前幾章的敘述,我們已經(jīng)把系統(tǒng)的各個(gè)部分分別作了非常詳細(xì)的論述,我們已經(jīng)將上述過(guò)程中定制好的winCE系統(tǒng)下載到PXA270-S實(shí)驗(yàn)箱上,于此同時(shí)我們已經(jīng)在EVC+4.0開(kāi)發(fā)平臺(tái)上運(yùn)用VC+語(yǔ)言開(kāi)發(fā)好貪吃蛇游戲的詳細(xì)代碼,剩下的就是將上訴三個(gè)過(guò)程最終整合在一起,達(dá)到編制好的程序最終在開(kāi)發(fā)板上運(yùn)行的一種嵌入式程序設(shè)計(jì)的效

35、果。我們將開(kāi)發(fā)板接好電源,下載好winCE系統(tǒng),后,將數(shù)據(jù)線(xiàn)連接好,啟動(dòng)同步軟件,進(jìn)行連接,直到同步軟件顯示連接成功之后,瀏覽板子內(nèi)容,選擇PXA270-S開(kāi)發(fā)板SDK,進(jìn)行編譯,將C:Documents and Settingslining桌面Snake_no_deadARMV4Irel目錄下的可執(zhí)行文件加入到實(shí)驗(yàn)箱目錄下,然后連接鍵盤(pán)和鼠標(biāo)到開(kāi)發(fā)板上的USB上,點(diǎn)擊可執(zhí)行程序Snake文件,運(yùn)行開(kāi)發(fā)完成的貪吃蛇游戲程序,這樣,整個(gè)系統(tǒng)整合完成。3.2 系統(tǒng)整體測(cè)試3.2.1 系統(tǒng)規(guī)則測(cè)試本程序制定的規(guī)則是貪吃蛇撞墻死亡,撞到自己身體任意一部分死亡。按照預(yù)先設(shè)計(jì)應(yīng)出現(xiàn)的結(jié)果是當(dāng)蛇頭下一個(gè)移動(dòng)

36、節(jié)點(diǎn)的位置是地圖四周的墻壁時(shí),或者是蛇自身的某一個(gè)位置節(jié)點(diǎn)時(shí),應(yīng)該顯示出一個(gè)對(duì)話(huà)框,標(biāo)志著蛇死亡。下面我們進(jìn)行測(cè)試。我們運(yùn)行程序,然后按空格鍵開(kāi)始游戲,讓蛇自身開(kāi)始移動(dòng),我們首先讓蛇頭撞到地圖周?chē)膲Ρ?,觀(guān)察結(jié)果是不是出現(xiàn)應(yīng)該出現(xiàn)的結(jié)果。下圖是我們運(yùn)行程序后的結(jié)果截圖,觀(guān)察出現(xiàn)的結(jié)果如圖所示:通過(guò)上圖我們可以發(fā)現(xiàn),當(dāng)貪吃蛇由于“貪吃”而不小心撞到了地圖周?chē)膲Ρ谏?,出現(xiàn)了一個(gè)對(duì)話(huà)框,宣告程序游戲結(jié)束,玩家記錄分?jǐn)?shù)如上圖右面部分所示。根據(jù)游戲規(guī)則,當(dāng)貪吃蛇吃到自己身體的某一部分時(shí),也應(yīng)該出現(xiàn)一個(gè)對(duì)話(huà)框,顯示游戲結(jié)束,標(biāo)志著游戲的結(jié)束,玩家重新開(kāi)始游戲。測(cè)試用例:讓蛇吃到自己身體的某一個(gè)部分,觀(guān)察出現(xiàn)的結(jié)果是不是根據(jù)游戲規(guī)則應(yīng)該出現(xiàn)的。開(kāi)始游戲,然后讓蛇吃到自己的身體某一部分,結(jié)果如下

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論