【文章內(nèi)容簡介】
的許可協(xié)議。 20 開發(fā)環(huán)境簡介 本項目在 windowsXP 操作系統(tǒng)上進行開發(fā), Google 為開發(fā)者提供了 SDK(Software Development Kit)。 Android SDK 的下載地址為: 發(fā)工具是 eclipse,所以還需要安裝 ADT(Android Development Tools)插件。具體安裝步驟就不在本文中介紹了。 第三章 需求分析 需求分析工作是軟件生存周期中重要的一步,也是起決定性的一步。通過它可以全面了解整個系統(tǒng)的功能和性能方面的要求,為軟件設(shè)計打下堅實的基礎(chǔ)。該部分的目標(biāo)主要有:獲得目標(biāo)系統(tǒng)的物理模型,了解目標(biāo)系統(tǒng)是如何運行的;抽象出目標(biāo)系統(tǒng)的邏輯模型,對物理模型 進行篩選,得到與軟件系統(tǒng)有關(guān)的部分;建立目標(biāo)系統(tǒng)的邏輯模型,得出數(shù)據(jù)流圖和數(shù)據(jù)字典;補充 21 目標(biāo)系統(tǒng)的邏輯模型,對目標(biāo)系統(tǒng)的用戶界面,至今尚未考慮的細節(jié)進行說明。 系統(tǒng)開發(fā)目標(biāo) 采用基于 Android 的程序設(shè)計技術(shù),以及用 eclipse 開發(fā)Android 程序的相關(guān)技術(shù)開發(fā)出具有良好用戶界面,操作簡單易學(xué),游戲功能齊全且有益于智力開發(fā)的貪吃蛇游戲 。 系統(tǒng)需求分析 業(yè)務(wù)需求分析 雖然現(xiàn)在市面上存在著各種各樣的游戲版本 ,可是貪吃蛇其市場還是相當(dāng)大的 .因為它的特殊在于它能吸引人更深入 ,愛不釋手 .隨著游戲速度不斷加快 ,其刺激性也更強 .可以說該游戲的優(yōu)勢在于它的簡單易行 ,不論是手機 ,還是小游戲機 ,都能很快順利的運行 .對于在外忙碌的人 ,不可能花費大量時間在娛樂上 ,大型游戲是行不通的 ,這樣的小游戲剛好迎合了他們的需求 . 手機 貪 吃蛇游戲基于 JAVA 平臺編寫,采用 Android 技術(shù)開發(fā)的一款手機游戲。手機游戲程序是一項精度要求很高的程序系 22 統(tǒng),因為其代碼利用率很高。一個實時運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻率在后臺等待響應(yīng),若有絲毫的差別都將很容易導(dǎo)致程序在 運行不久后可能出現(xiàn)嚴重錯誤,甚至死循環(huán)。因此,其邏輯設(shè)計應(yīng)當(dāng)相當(dāng)嚴謹,需將所有可能發(fā)生的事件及意外情況考慮在設(shè)計中。JAVA 是基于虛擬機的半解釋型編譯系統(tǒng),其執(zhí)行效率較 C++等完全編譯后的程序會低很多,程序如果不進行精簡和優(yōu)化,將可能導(dǎo)致運行的不流暢。游戲的結(jié)束、開始、動態(tài)信息畫面作為構(gòu)成一個程序都是必不可少的重要部分。良好的用戶界面更是吸引用戶的硬指標(biāo),相關(guān)的美術(shù)構(gòu)圖和人性化設(shè)置也需要有一定的考慮。 用戶需求分析 本項目中用戶的需求如下圖所示: 23 游戲用例圖 游戲開 發(fā)成功后,最終用戶為各個年齡段的人群,用戶范圍相當(dāng)廣泛。 但是用戶對軟件產(chǎn)品也有一定的要求: 時間不管對于誰來說都是寶貴的,用戶不會愿意花大量時間去學(xué)習(xí)使用一款軟件。一款軟件如果操作界面不友好,讓用戶難以上手使用,那就說明這款軟件開發(fā)得不夠成功,從而失去大量的用戶。所以本項目必須擁有良好的交互界面,讓用戶安裝之后就能進行游戲。 一款軟件設(shè)計得不夠好,那么就有可能在運行的時候出現(xiàn)一些不可預(yù)料的錯誤從而造成軟件崩潰。如果用戶正在游戲突然軟件崩潰了,無疑會讓用戶感到非常不舒服,有可能就把軟件給卸 24 載了,這樣也會失去很多用戶。 用戶不是程序員,他們不知道程序的內(nèi)部邏輯。所以程序員必須提供給用戶便捷的操作接口來供用戶操作,靈活便捷的操作性直接影響了一款軟件的好壞。軟件是做給用戶使用的,所以一切都要站在用戶的角度來看問題。 功能需求分析 本項目是一個運行在 Android 手機上的游戲,所以在應(yīng)該實現(xiàn)以下功能: 玩家可以從手機鍵盤或者觸屏開始游戲,操控游戲,暫停游戲,結(jié)束游戲; 玩家開始游戲后,在手機屏幕上繪制出一條初始由 7 個節(jié)點組成小蛇。蛇能 夠在屏幕上移動,屏幕上隨機位置出現(xiàn)食物,當(dāng)蛇吃到食物后蛇的身體會增長一截同時移動速度也會響應(yīng)加快。 25 蛇不能向相反方向移動,例如蛇頭朝南時則不能向北移動。當(dāng)蛇頭碰到墻壁或者碰到自己的身體時游戲結(jié)束。 當(dāng)游戲結(jié)束后,顯示并保存玩家在游戲中所獲得的分數(shù)。 第四章 概要設(shè)計 程序流程設(shè)計 本游戲的流程如下圖所示: 26 模塊設(shè)計 模塊劃分 從面向?qū)ο蟪绦蛟O(shè)計的角度,本項目總體地可以分為游戲界面模塊、數(shù)據(jù)存儲模塊和控制模塊。 如 下圖所示: 觸摸屏幕游戲開始, 蛇開始移動 鍵盤操作: 向上 左移 右移 向下 沒有吃到食物且蛇碰到邊界 游戲結(jié)束 游戲中途欲中斷,稍后繼續(xù)游戲 觸摸屏幕暫停游戲 游戲暫停 進入游戲畫面 再次觸摸屏幕游戲恢復(fù) 圖 游戲處理流程圖 27 游戲主界面模塊 游戲界面主框架主要包括游戲圖形區(qū)域界面、游戲的開始按鈕、暫停按鈕、游戲的退出按鈕。 游戲界面主框架的主要結(jié)構(gòu)圖如圖 所示。 游戲控制模塊 游戲控制模塊主要通過手機鍵盤上的按鈕來控制游戲的開始、游戲的暫停、游戲的退出這三個功能以及控制游戲分數(shù)變化。貪吃蛇游戲 游戲主界面模塊 游戲控制模塊 圖 游戲總設(shè)計模塊 游戲的主界面架 游戲圖形區(qū)域界面 (即游戲畫布) 游戲控制按鈕界面 圖 游戲主界面 游戲數(shù)據(jù)存儲模塊 28 在這個模塊中,需要給各個按鈕添加響應(yīng)事件代碼,來對上述的功能加以進一步的實現(xiàn)。 游戲 控制模塊的主要框架如圖 所示。 模塊實現(xiàn)原理 游戲界面模塊實現(xiàn) 本游戲采用 Activity 作為游戲背景的載體 ,在 Android 中一個Activity 就相當(dāng)于 windows 中的一個窗口, Activity 上可以放置許多類型的控件。 一個 activity 主要有三個狀態(tài): 當(dāng)在屏幕前臺時(位于當(dāng)前任務(wù)堆棧的頂部),它是活躍或運游戲控制模塊 游戲的移動速度功能能 游戲的暫停功能 游戲的重新開始 圖 游戲控制模塊框架 29 行的狀態(tài)。它就是相應(yīng)用戶操作的 activity。 當(dāng)它失去焦點但仍然對用戶可見時,它處于暫 停狀態(tài)。即是:在它之上有另外一個 activity。這個 activity 也許是透明的,或者未能完全遮蔽全屏,所以被暫停的 activity 仍對用戶可見。暫停的 activity 仍然是存活狀態(tài)(它保留著所有的狀態(tài)和成員信息并連接至窗口管理器),但當(dāng)系統(tǒng)處于極低內(nèi)存的情況下,仍然可以殺死這個 activity。 如果它完全被另一個 activity 覆蓋是,它處于停止?fàn)顟B(tài)。它仍然保留所有的狀態(tài)和成員信息。然而它不在為用戶可見,所以它的窗口將被隱藏,如果其它地方需要內(nèi)存,則系統(tǒng)經(jīng)常會殺死這個 activity。 如果一個 activity 處于暫?;蛲V?fàn)顟B(tài),系統(tǒng)可以通過要求它結(jié)束(調(diào)用它的 finish() 方法)或直接殺死它的進程來將它驅(qū)出內(nèi)存。當(dāng)它再次為用戶可見的時候,它只能完全重新啟動并恢復(fù)至以前的狀態(tài)。 當(dāng)一個 activity 從這個狀態(tài)轉(zhuǎn)變到另一個狀態(tài)時,它被以下列protected 方法所通知: void onCreate(Bundle savedInstanceState) 、 void onStart() 、void onRestart() 、 void onResume() 、 void onPause() 、 void onStop() 、 void onDestroy() 2. 實現(xiàn)蛇的身體 蛇可以看做是一個個節(jié)點組成的 ,因此可以用一個鏈表來存儲 30 蛇身的元素 ,在畫蛇時遍歷這個鏈表講里面的元素一一畫出 ,這樣就實現(xiàn)了一條蛇 . 3. 實現(xiàn)蛇的移動 用一個 timer(定時器 )來不斷地刷新游戲畫面 ,每刷新一次就再蛇頭的前面 (鏈表的尾部 )增加一個新元素 ,同時把蛇尾的一個元素刪掉 ,這樣從視覺上看起來就實現(xiàn)了蛇的移動 . 4. 實現(xiàn)蛇吃食物 蛇移動的過程中如果蛇頭的坐標(biāo)與食物出現(xiàn)的坐標(biāo)重合了 ,那么就在蛇頭的位置增加一個元素同時不刪除蛇尾的最后一個元素 ,這樣 蛇每遲到一個食物 身體就會變長一截 . 游戲控制模塊實現(xiàn) 在 Android 系統(tǒng)中,手機上的每個按鈕都會有一個對應(yīng)的鍵值跟它對應(yīng),所在可以給對應(yīng)的按鈕設(shè)置監(jiān)聽器 OnClickListener,監(jiān)聽器是一個接口 ,該接口中有一個方法 onClick(View v)。當(dāng)按鈕被點擊的時候系統(tǒng)會自動調(diào)用該監(jiān)聽器的 onClick(View v)方法。所以實現(xiàn)游戲控制的具體代碼將被寫到該方法中。 因為本游戲中不允許蛇向與蛇頭相反的方向移動,所以當(dāng)用戶操作時需要判斷用戶操作的方向是 不是跟規(guī)則沖突,若沖突則 31 無視該操作,若不沖突則響應(yīng)該操作,所以需要用一個變量來記錄蛇頭的當(dāng)前方向。 在 Activity 的生命周期中,有一個 onPause()方法 .該方法在Activity 變得不可 見的時候被系統(tǒng)自動調(diào)用 .在玩游戲過程中,如果有來電或是其它事件中斷, 這時應(yīng)該把當(dāng)前狀態(tài)保存。以便返回時,還可以繼續(xù)玩游戲。這就使用 onSaveInstanceState 實現(xiàn)保存當(dāng)前狀態(tài)。 Activity 生命周期 的 onResume()方法 .該方法在 Activity 從 不可見的 狀 態(tài)下變得可見 時被系統(tǒng)自動調(diào)用 .在用戶接完電話或者在暫停狀態(tài)下觸摸屏幕后可以在該生命周期方法中對游戲進行恢復(fù) . 當(dāng)一個 Activity 退出或者被調(diào)用 finish()方法后 ,系統(tǒng)會調(diào)用其生命周期方法 onDestroy().當(dāng)用戶退出游戲時 ,可以在這個方法中對資源進行釋放 . 32 數(shù)據(jù)存儲模塊實現(xiàn) 在 Android 系統(tǒng)中數(shù)據(jù)的存儲是使用 SQLite 數(shù)據(jù)庫來實現(xiàn)的 ,SQLite 是一款輕型的數(shù)據(jù)庫,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百 K 的內(nèi)存就夠了。它能夠支持Windows/Linux/Unix 等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結(jié)合,比如 Tcl、 PHP、 Java 等,還有 ODBC 接口,同樣比起 Mysql、 PostgreSQL 這兩款開源世界著名的數(shù)據(jù)庫管理系統(tǒng)來講,它的處理速度比他們都快。 在 SQLite 中創(chuàng)建一張表,表的結(jié)構(gòu)如下表所示: 該表用來存放玩家數(shù)據(jù)。 字段名 類型 意義 player varchar 玩家名字 score int 玩家分數(shù) 33 第五章 詳細設(shè)計 游戲類圖 本游戲的類圖如下: 34 Sn a k em S n a k e V ie w : S n a k e V ie wI C I C L E _K E Y : S t ri n g+ on C re a t e ( )+ on P a u s e ( )+ on S a v e I n s t a n c e S t a t e ( )Sn a k e V ie w+ S n a k e V ie w ( c on t e x t : C on t e x t , a t t rs : A t t ri b u t e S e t )+ in it S n a k e V ie w ( )+ in it N e w G a m e ( )+ on K e y D ow n ( k e y C od e : in t , m s g : K e y E v e n t ) : b ool e a n+ a d d R a n d om A p p le ( )+ u p d a t e ( )+ u p d a t e S n a k e ( )+ u p d a t e W a lls ( )+ u p d a t e A p p le s ( )+ c oor d A rr a y L is t T oA rr a y ( c v e c : A rr a y L is t C oor d in a t e ) : in t [ ]+ re s t or e S t a t e ( ic ic l: B u n