【正文】
果實(shí)時(shí)通過一個(gè)坐標(biāo)記錄下在地圖上的位置,通過繪圖函數(shù)繪制這點(diǎn)坐標(biāo)的小矩形,程序中采用的是隨機(jī)數(shù)生成果實(shí)出現(xiàn)的坐標(biāo)。如果坐標(biāo)不在蛇身坐標(biāo)范圍內(nèi),則把坐標(biāo)位置返回給調(diào)用對(duì)象。具體代碼參見程序主要代碼說明。先判斷下一個(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)值(snake_foods)相同,則調(diào)用void MyDraw()函數(shù)重繪蛇頭和蛇尾節(jié)點(diǎn)顏色,因?yàn)榇藭r(shí)蛇吃到一個(gè)果實(shí),蛇身長度加一,動(dòng)態(tài)的現(xiàn)實(shí),將果實(shí)重繪為蛇身顏色(紅色),蛇尾節(jié)點(diǎn)顏色不變,蛇身變量長度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),重繪蛇頭蛇尾顏色,蛇身長度不變,動(dòng)態(tài)的蛇頭和蛇尾節(jié)點(diǎn)坐標(biāo)改變。這樣,在玩家看來,蛇的刷新速度就會(huì)變得越來越快。這些按鍵消息響應(yīng)是通過函數(shù)BOOL CSnakeDlg::PreTranslateMessage(MSG* pMsg)來實(shí)現(xiàn),內(nèi)部通過case語句進(jìn)行相應(yīng)按鍵的響應(yīng),從而實(shí)現(xiàn)按鍵響應(yīng)功能。 用于初始化繪制圖形的二位數(shù)組,定義為整形int GameState。 初始化每個(gè)小格子的寬度,定義為整形int HEIGHTOFBRICKS。 記錄當(dāng)前蛇的長度,定義為整形int snake_direct。 判斷蛇死亡的標(biāo)志,定義為整形int TimerInterval。 記錄當(dāng)前食物所在的坐標(biāo),定義為整形CPoint snake_head。 記錄蛇當(dāng)前尾結(jié)點(diǎn)的坐標(biāo),定義為整形CPoint snake_body[1000]。初始化地圖和蛇開始的位置,蛇自身的長度,食物位置,游戲的狀態(tài),游戲的關(guān)卡,游戲的分?jǐn)?shù),蛇頭位置,蛇尾位置等參數(shù)值。初始化刷新屏幕,利用EVC提供的畫刷類在屏幕上顯示相應(yīng)的效果,并且通過此函數(shù)能夠?qū)崿F(xiàn)游戲的重新開始功能,即游戲的重新初始化地圖,蛇身位置,食物坐標(biāo)等相關(guān)參數(shù)。判斷蛇是否死亡,根據(jù)地圖坐標(biāo)(24*24的二維數(shù)組)和蛇自身坐標(biāo),判斷蛇死亡。void InitFoods()。void Start()。void MyDraw()。void Get_Game_Score()。此外還有一些消息處理函數(shù),用于根據(jù)鍵盤按鍵來處理相應(yīng)的消息,進(jìn)行相應(yīng)的響應(yīng)。Void OnTimer(UNIT nLDEvent)()。Void OnGameexit()。Void OnGameStart()。Void OnGamepause()。Void OnLeft()。Void OnRight()。Void OnUp()。Void OnDown()。 貪吃蛇游戲界面的實(shí)現(xiàn)貪吃蛇游戲界面是通過MFC初始化窗口實(shí)現(xiàn),地圖是通過初始化窗體時(shí),計(jì)算窗體客戶區(qū)高度和寬度,然后取其中最小值,等分為24部分,記錄下每部分的長度,這就是地圖中每個(gè)小矩形的長度。 貪吃蛇游戲主要代碼說明下面函數(shù)是游戲開始函數(shù),主要功能是初始化游戲的狀態(tài),開啟計(jì)時(shí)器函數(shù),實(shí)現(xiàn)游戲的開始。 Score=0。 GameState=RUNNING。//初始化蛇沒有死 SetDlgItemText(IDC_SCORE_NUM,L0)。//開始設(shè)置計(jì)時(shí)器}下面的函數(shù)功能是初始化游戲界面,通過窗體初始化事件來進(jìn)行計(jì)算游戲地圖的寬和高,這樣進(jìn)一步計(jì)算出來游戲地圖上每個(gè)小格子的寬度和高度,然后調(diào)用初始化函數(shù)進(jìn)行游戲界面初始化。 SetIcon(m_hIcon, TRUE)。 CenterWindow(GetDesktopWindow())。 GetClientRect(amp。 WIDTHOFBRICKS=(( )LEFTMARGIN)/24。 WIDTHOFBRICKS=HEIGHTOFBRICKS=min(WIDTHOFBRICKS,HEIGHTOFBRICKS)。 GameState=STOP。 return TRUE。void CSnakeDlg::RefreshAll(){ CDC* dc=GetDC()。y24。x24。 dcDraw3dRect(LEFTMARGIN+x*WIDTHOFBRICKS, 10+y*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRIC KS,CLRTOPLEFT,BACKCOLOR)。 dcDraw3dRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,CLRTOPLEFT,SNAKECOLOR)。} winCE內(nèi)核下載 燒寫系統(tǒng)所需資源 燒寫系統(tǒng)資源分為硬件資源和軟件資源兩個(gè)大部分,其中軟件資源就是第四章第一節(jié)所講述的系統(tǒng)內(nèi)核的定義部分,在實(shí)驗(yàn)開發(fā)指南中我們可以找到這些軟件;另外燒寫系統(tǒng)需要相應(yīng)的硬件支持,首先就是PXA270S實(shí)驗(yàn)箱,里面應(yīng)包括一個(gè)串口線,特定USB連接線,一根交叉網(wǎng)線,以及電源適配器,USB和串口轉(zhuǎn)換器。 燒寫系統(tǒng)步驟在我們燒寫winCE系統(tǒng)內(nèi)核之前,首先我們要燒寫B(tài)ootloader,燒寫WinCE 所需的Bootloader分兩個(gè)步驟:燒寫B(tài)lob和使用Blob下載Eboot。方法如下:修改BIOS中計(jì)算機(jī)并口的選項(xiàng),設(shè)置并口為“378”模式。之后在平臺(tái)和PC之間連接好JTAG下載線。并且在后面的過程中,不要關(guān)閉這個(gè)TFTP 服務(wù)器。換插好網(wǎng)線。也可以將設(shè)備正常掛在局域網(wǎng)中。使用“ifconfig空格ip空格設(shè)備IP”來配置設(shè)備IP;使用“ifconfig空格server空格開發(fā)機(jī)IP”來配置開發(fā)PC的IP。如有錯(cuò)誤重新配置。2. 下載Eboot在確保這一過程完成之后,在blob控制臺(tái)運(yùn)行“td eboot”回車。運(yùn)行eboot。這樣以后每次開機(jī)不必重復(fù)上述配置下載過程,進(jìn)入Blob控制臺(tái)之后,直接敲入“eboot”之后空格就可以運(yùn)行Eboot控制臺(tái)了??刂婆_(tái)負(fù)責(zé)了有關(guān)啟動(dòng)內(nèi)核的基本操作。通過PB下載WinCE內(nèi)核首先確保用可靠的PCPC直連網(wǎng)線將開發(fā)機(jī)和設(shè)備連接在一起,或者將設(shè)備用可靠的普通網(wǎng)線掛到局域網(wǎng)內(nèi)。點(diǎn)擊“Apply”“Close”退出。MAINSTN1414639。這時(shí)會(huì)出現(xiàn)下載進(jìn)度。完畢后目標(biāo)板上的WinCE系統(tǒng)會(huì)自動(dòng)運(yùn)行。如果不經(jīng)常變更設(shè)備的IP,則可以只配置上述步驟一次,以下每次出現(xiàn)Eboot的“SentBOOTME”提示的時(shí)候選擇Target\Attach Device將可以自動(dòng)完成下載過程。 系統(tǒng)整合通過前幾章的敘述,我們已經(jīng)把系統(tǒng)的各個(gè)部分分別作了非常詳細(xì)的論述,我們已經(jīng)將上述過程中定制好的winCE系統(tǒng)下載到PXA270S實(shí)驗(yàn)箱上,于此同時(shí)我們已經(jīng)在EVC++++語言開發(fā)好貪吃蛇游戲的詳細(xì)代碼,剩下的就是將上訴三個(gè)過程最終整合在一起,達(dá)到編制好的程序最終在開發(fā)板上運(yùn)行的一種嵌入式程序設(shè)計(jì)的效果。 系統(tǒng)整體測(cè)試 系統(tǒng)規(guī)則測(cè)試本程序制定的規(guī)則是貪吃蛇撞墻死亡,撞到自己身體任意一部分死亡。下面我們進(jìn)行測(cè)試。下圖是我們運(yùn)行程序后的結(jié)果截圖,觀察出現(xiàn)的結(jié)果如圖所示:通過上圖我們可以發(fā)現(xiàn),當(dāng)貪吃蛇由于“貪吃”而不小心撞到了地圖周圍的墻壁上,出現(xiàn)了一個(gè)對(duì)話框,宣告程序游戲結(jié)束,玩家記錄分?jǐn)?shù)如上圖右面部分所示。測(cè)試用例:讓蛇吃到自己身體的某一個(gè)部分,觀察出現(xiàn)的結(jié)果是不是根據(jù)游戲規(guī)則應(yīng)該出現(xiàn)的。 按鍵功能測(cè)試貪吃蛇的控制是通過鍵盤上的按鍵來進(jìn)行控制的,我們需要對(duì)相應(yīng)的按鍵進(jìn)行功能測(cè)試,看相應(yīng)的按鍵對(duì)應(yīng)的功能是不是正確。其中空格按鍵的功能是開始游戲,同時(shí)還有當(dāng)游戲在進(jìn)行時(shí)可以暫停游戲的功能,對(duì)應(yīng)測(cè)試圖如下:我們可以通過上圖看到,在按下空格鍵時(shí)游戲開始,同時(shí)按下空格鍵,游戲暫停,停留在如圖所示的狀態(tài)。通過觀察上圖和前一個(gè)狀態(tài)的變化,我們發(fā)現(xiàn)此圖顯示了按下功能鍵后,貪吃蛇蛇頭向上移動(dòng),說明向上按鍵功能正確。通過觀察上圖和前一個(gè)狀態(tài)的變化,我們發(fā)現(xiàn)此圖顯示了按右功能鍵后,貪吃蛇蛇頭向上移動(dòng),說明向上按鍵功能正確。 分?jǐn)?shù)和關(guān)卡測(cè)試玩家在進(jìn)行游戲的比賽時(shí),需要有個(gè)分?jǐn)?shù)來進(jìn)行統(tǒng)計(jì),這個(gè)分?jǐn)?shù)用來進(jìn)行比較玩家的能力高低,我們要進(jìn)行這個(gè)功能的測(cè)試,看是否隨著吃到游戲果實(shí)的增加,對(duì)應(yīng)的分?jǐn)?shù)也相應(yīng)的增加,同時(shí)當(dāng)玩家達(dá)到一定的分?jǐn)?shù)后,是不是關(guān)卡也隨之增加,我們開始進(jìn)行游戲的初始化界面如下:按下空格鍵,開始游戲,進(jìn)行測(cè)試,玩家通過開始一段時(shí)間的游戲后,觀察上圖右面部分,分?jǐn)?shù)和關(guān)卡數(shù)的文本框的變化情況,是不是和游戲規(guī)則里面的描述相符合,我們觀察下面的截圖,進(jìn)行判斷:通過玩家一段時(shí)間的游戲后,此時(shí)顯示對(duì)應(yīng)的分?jǐn)?shù)為495分,不是初始化的0分,對(duì)應(yīng)的關(guān)卡是4關(guān),與目標(biāo)測(cè)試結(jié)果相符合,說明功能正確,測(cè)試結(jié)束。2. 作為嵌入式程序設(shè)計(jì),具有方便簡易的特性,我們定制的系統(tǒng)只需要夠用即可,嵌入式的核心思維就是簡易。然而,目前設(shè)計(jì)的基于嵌入式winCE貪吃蛇游戲還處于較原始的階段,實(shí)現(xiàn)的功能還不夠完善,但隨著相關(guān)技術(shù)的成熟和軟硬件平臺(tái)的發(fā)展,完善相關(guān)的游戲功能,使之更加完善,界面更加可視化,這樣我相信對(duì)于初學(xué)嵌入式的人來說會(huì)有很大的幫組。但這寶貴的四年求學(xué)生涯讓我成長了不少。從論文題目的選定到方案的確定,再到具體的設(shè)計(jì)實(shí)現(xiàn)和論文的審核,無不傾注了吳老師的心血和辛勞。同時(shí),吳老師在學(xué)習(xí)上嚴(yán)格督促我,生活上給予我無微不至的關(guān)懷和幫助。在這里深深的祝福吳老師工作順利、家庭幸福。尤其是班長團(tuán)委等同學(xué)在學(xué)習(xí)和生活的團(tuán)結(jié)互助中建立了深厚的友誼,一生都會(huì)好好珍惜。正是因?yàn)槟銈兊闹С趾屠斫?,我才能在失敗和困難面前信心百倍,無所畏懼。參考文獻(xiàn)和注釋[1] 傅曦,[J].人民郵電出版社,2006年6月[2] [J].北京航天航空大學(xué)出版社,2006年[3] 張冬泉,[J].電子工業(yè)出版社,2006年[4] 劉大鵬,[J].微型電腦應(yīng)用,2002年8月,18卷,8期:4344[5] 70Samp。s time for the application to end. This message usually appears because the user selected Exit from the File menu, clicked the close button (the small button with an X in the window39。s system menu. When the message loop ends, WinMain returns and the application terminates. Figure 11. The Windows programming model. The window procedure typically calls other functions to help process the messages it receives. It can call functions local to the application, or it can call API functions provided by Windows. API functions are contained in special modules known as dynamiclink libraries, or DLLs. The Win32 API includes hundreds of functions that an application can call to perform various tasks such as creating a window, drawing a line, and performing file input and output. In C, the window procedure is typically implemented as a monolithic function containing a large switch statement with cases for individual messages. The code provided to process a particular message is known as a message handler. Messages that an application doesn39。s unique way of responding to messages that gives it its personality. Common Windows MessagesMessageSent WhenWM_CHARA character is input from the keyboard.WM_COMMANDThe user selects an item from a menu, or a control sends a notification to its parent.WM_CREATEA window is created.WM_DESTROYA window is destroyed.WM_LBUTTONDOWNThe left mouse button is pressed.WM_LBUTTONUPThe left mouse button is released.WM_MOUSEMOVE The mouse pointer is moved.WM_PAINTA window needs repainting.WM_QUITThe application is about to termina