狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

游戲設計與開發

| 瀏覽次數:

 中國礦業大學計算機學院 2013 級本科生課程報告 課程名稱

  《軟件測試》

  報告時間

 2016 年 7 月

 學生姓名

  李龍

 學

 號

 專

 業

 計算機科學與技術

 任課教師評語 任課教師評語 (①對課程基礎理論的掌握;②對課程知識應用能力的評價;③對課程報告相關實驗、作品、軟件等成果的評價;④課程學習態度與上課紀律;⑤課程成果與報告工作量;⑥總體評價與成績;⑦存在問題等): 成 績:

  任課教師簽字:

  2016 年

  6

  月

  25日 摘 要 本課題就是設計開發一款小游戲,由于本人知識的有限,以及客觀條件的限制,本人打算開發一個單機版的游戲。本人在手機上玩過貪吃蛇的游戲,曾經為了與別人比賽,苦苦的玩了好多次,追求高分!后來得知這個小小的游戲就是 nokia當年很成功的一款手機游戲,許多人都玩過,也很喜歡。現在這款游戲的版本已經發展到第三版了,手機生產廠商繼續開發這個游戲,瞧來這個游戲還就是有很大的市場的。Google 公司 2007 年 11 月 5 日發布的開源的 Android 平臺 —— 一款包括操作系統(基于 Linux 內核)、中間件與關鍵應用的手機平臺,并組建了開放手機聯盟(Open Handset Alliance),包括 Google、中國移動、T-Mobile、宏達電、高通、摩托羅拉等領軍企業。于就是,我決定利用自己大學所學的知識,獨立開發這個小游戲。重首先說明了這個貪吃蛇程序所用到的一些類與控件,包括 Drawable,Canvas, Thread,等等。介紹了這些類的一般的使用方法,以及本程序就是如何使用這些類來進行游戲的開發的。本程序將老少皆宜的經典作品移植到手機上來,為更流行的硬件平臺提供應用軟件。這些都將能很好的滿足未來人們對手機游戲的需求。吞吃蛇游戲基于 Android 平臺編寫,滿足一般手機用戶

 的娛樂需求。

 關鍵詞:Android 系統; 貪食蛇游戲; 手機游戲 ABSTRACT 、This topic is using java language on the Android platform mobile phone game development, I limited knowledge, and objective constraints, I intend to develop a stand-alone game、 I played the game of Snake, on the phone once in order to match with others, struggling to play many times, the pursuit of high scores! Later learned that this little game nokia was very successful mobile phone games, many people have played, and also enjoyed、 Version of the game has been developed to the third edition, mobile phone manufacturers continue to develop this game, it seems that this game is a great market、 Open-source Android platform, Google"s released on November 5, 2007 - an operating system (Linux kernel), middleware and key applications-based mobile phone platform, and the formation of the Open Handset Alliance (Open Handset Alliance), includingGoogle, China Mobile, T-Mobile, HTC, Qualcomm, Motorola and other leading enterprisesSo, I decided to use the knowledge learned in his college, in the instructor"s help, the independent development of this game、This article first details some of the basic java knowledge, on this basis leads to Android, the basis of the Android and its characteristics, and then introduces the Android future prospects and development、 Highlights this Snake procedures used and controls, including the Drawable Canvas, Thread, and so on、 Describes the general use, as well as the program is how to use these classes to the development of the game、 The ages of the classic works transplantation in this program to the phone up, to provide application software for the more popular hardware platforms、 These will be well positioned to meet future demand for mobile games、 Devour the snake game based on the Android platform, prepared to meet the entertainment needs of the general mobile phone users、

 Key words: Android system; Gluttony snake game; Mobile game 目錄 1 背景 1、1研究背景 隨著社會的發展,人們生活的步調日益加快,越來越多的人加入了全球化的世界。人們不再拘泥于一塊天地,加班,出差成了現代人不可避免的公務。而此時一款可以隨時隨地娛樂的游戲成了必需品。貪吃蛇這一游戲簡單易行,操作方便,娛樂性較強,吸引了不少人。這一款游戲緊緊地抓住了人們的心理,雖然簡單,卻其樂無窮,在人們不斷追求更多的欲望下,該游戲給人們帶來了追逐的快感,以及成功后的滿足感,對于一直處于高壓下的現代人就是很好的放松工具[1] 。

 當前科學技術飛速發展,特別就是微電子技術,計算機軟件與應用技術的發

 展,使得人們的日常生活豐富多彩。單片微型計算機(簡稱單片機)作為微型計算機家族的一員,以其獨特的結構,良好的穩定性,便宜的價格在嵌入式領域廣泛應用。與傳統的 PC 上設計的貪吃蛇游戲不同,本次作者利用 Android 平臺,java 語言編程,實現便攜地貪吃蛇游戲 1、2 項目目的與意義 1 1 、2 2 、1 1 開發目的

 自 2007 年 Google 發布 Android 系統 1、0 之后,各大手機生產廠商紛紛將目光投向了最具發展潛力的 Android 系統,并陸續推出了各種品牌的搭載 Android系統的智能手機。

 時隔四年,Android 手機在手機市場中占的市場份額正以非常迅猛的速度上升:2010 年市場份額:Symbian 36、6%、Android 25、5%、iPhone 16、7、windows Mobile

  2、8%、linux

  2、1% 。Nokia的 Symbian 系統在 Android 系統的沖擊下,正在從手機市場中的王者慢慢被擠下來。在未來的幾年內,Android 手機必定會占據手機市場的主要份額,所以在這種形式下,Android 應用的前景也必定就是前景一片大好。

 1 1 、2 2 、2 2 開發意義

  現如今,電子商品的硬件支持越來越高端。人們對手機的功能要求不再僅僅局限于接電話與打電話了,在這些基本功能的基礎上,手機更成了人們日常生活中非常重要的娛樂與休閑工具。許多時候人們都會處于無聊的狀態,比如等車的時候、坐長途車的時候、、、這時若有一款有意思的游戲來打發時間就是再好不過了。由于 Android 手機具有多任務功能,可以一邊聽音樂一邊玩游戲,就是讓人們在等車的時候玩上一玩消磨時間的好東東。

 1、3 手機游戲國內外現狀與發展趨勢 1 1 、3 3 、 1 手機游戲國內外現狀

 近年來,網路尤其就是無線通信網絡在國內迅速普及,網絡游戲也得到了高速發展。同樣手機的普及,使得手機游戲市場空前發展。國內外巨大的手機使用量,也讓商家瞧到了新的商機,手機游戲市場利潤將會十分的豐厚。面對潛力巨大的手機游戲市場,各大游戲開發商、運營商、服務商以及手機終端廠商等都開始準備應對措施,以便搶占更多的手機市場分額。Nokia、索愛、三星等各大手機廠商開始不斷的提升手機的游戲性能,同時采用開放式的手機操作系統,方便用戶能夠享受到不同的游戲業務[4] 。而國內游戲開發商,如盛大、騰訊、網易等公司,紛紛躋身手機游戲開發商行列。新浪、搜狐等著名的門戶網站,也紛紛涉足手機游戲領域,相繼開辟了各自的手機游戲相關欄目,其她一些游戲網站也都加快了手機游戲開發的腳步。現階段國內的手機游戲還局限于小型單機游戲與簡單的卡牌類網絡游戲,而國外已經開始致力于開發能夠依靠GPRS定位,或者用戶佩戴輔助器械的大型手機游戲。

 1 1 、3 3 、 2 手機游戲的發展趨勢

 每個人都可以隨時隨地玩手機游戲,雖然手機游戲的價格不貴,但它的使用量巨大,也因此帶來巨大的商業價值。手機游戲具有娛樂性與趣味性,而且它的操

 作簡單,易與掌握,就是人們日常生活中不可或缺的娛樂方式。伴隨著3G、4G時代的到來,手機上網逐漸普及,上網資費進一步下調,使用手機進行娛樂互動的消費者越來越多。隨著移動快捷支付系統日趨成熟與盈利模式的逐漸明朗,隨著資本對于手機游戲市場的關切,隨著業界內各個環節逐漸完善與壯大,手機游戲必將會迎來一個新的發展高峰[6] 。

 高科技游戲曾經就是任天堂、索尼與微軟三足鼎立的天下,由于智能手機的興起,手機游戲的發展在短短2年里就超越了掌上機及電腦游戲。Pop Cap Games公司針對2500名英美成年人所做的調查顯示,有一半以上的受訪者至少玩過一次手機游戲。

 大量平價游戲、更為簡化的游戲技術,大大降低了用戶玩手機游戲的門檻,在中國手機游戲幾乎都就是免費下載的。撇開平價手機游戲所帶來的商業影響不談,游戲開發商認為手機游戲其實蘊藏著無限發展機遇。智能手機用戶就是移動行業中數量增長最快的用戶,手機游戲公司們最近的表現也同樣勢不可擋。

 操作簡易,內容簡單的游戲就是小型手機游戲的主打產品,但隨著電子技術的發展,手機硬件性能的不斷提升,手機電池容量更大續航時間更久,以及手機外設的開發,手機游戲也向著流暢舒服的操作,內容豐富的大型游戲制作方向發展。開發大型手機游戲不僅能開拓新的市場,新的商機與利潤,也能給用戶帶來操作、視覺的雙重享受。

 貪吃蛇作為一款操作簡單的單機類游戲,在競爭激烈的手機游戲領域中,近些年來也得到了充分的發展。Nokia在其WP7手機上推出了瘋狂貪吃蛇(Crazy Snake),雖然操作簡單,畫面簡單,但游戲體驗早就不簡單了,就是一款不能錯過的游戲[7] 。Snake的開發商XIMAD又推出了寶石貪吃蛇游戲,這款名為Snake的游戲將貪吃蛇的畫面水平推向了一個新的高度。Snake無論就是游戲畫面還就是游戲可玩度都非一般的貪吃蛇游戲所能比擬的。在這款游戲中,您的貪吃蛇將會在地下收集文物,但就是要及時的避開各種障礙物,以通過各種關卡,獲取積分。不僅如此,貪吃蛇游戲還發展出了3D貪吃蛇,現在正在開發的GPRS定位通過用戶走動控制的貪吃蛇游戲,將會把貪吃蛇推向新的高度。

 2 方案論證 2、1經濟可行性分析 本系統開發經費并不就是很多。個人或者團隊都可以按相應時間完成基本功能。若在基本功能上進而實現界面的美化,則還需要更好的美術人員協助實現。

 投入:除軟件開發成本外,需要一臺安裝Windows操作系統與Android虛擬機的中等以上電腦,一部中等配置的裝有Android2、3或以上的Android手機。

 2、2技術可行性分析 2 2 、2 2 、 1Android 平臺特性

 (1)

 支持組件的重用與替換。意味著我們可以把系統中不喜歡的應用程序換掉,安裝我們自己喜歡的程序。

 (2) Dalvik虛擬機專門為移動設備做了優化。將class文件通過DX工具轉換

 成后綴為、dex的文件來執。Dalvik虛擬機基于寄存器,比java虛擬機快。

 (3) 內部集成瀏覽器基于開源的WebKit引擎。

 (4) 優化的2D與3D圖形庫。

 (5) SQLite數據庫,用于結構化的數據存儲。

 (6) 支持各種多媒體格式:MPEG4、H、264、MP3、AAC、AMR、JPG、PNG、GIF。

 (7) GSM電話—全球通。

 (8) 藍牙、Wifi(無線網絡)、EDGE(GSM到3G的過渡)。

 (9) 照相機、GPS、指南針與加速度計。

 (10) 豐富的開發環境包括設備模擬器,調式工具,內存及性能分析表與Eclipse集成開發環境插件。Google提供了Android開發包SDK,其中包含大量的類庫與開發工具。

 2 2 、2 2 、 2Android 應用程序組件

 如前所述,Android運行在Linux 內核上。Android應用程序就是用Java 編程語言編寫的,它們在一個虛擬機(VM)中運行。需要注意的就是,這個VM并非您想象中的JVM,而就是Dalvik Virtual Machine,這就是一種開源技術。每個Android應用程序都在Dalvik VM 的一個實例中運行,這個實例駐留在一個由Linux內核管理的進程中,如下圖2-1所示。

 如圖 2-1 Android 應用程序由一個或多個組件組成。

 1、 活動(Activity)

 具有可視 UI 的應用程序就是用活動實現的。當用戶從主屏幕或應用程序啟動器選擇一個應用程序時,就會開始一個動作。

 2、 服務(Service)

 服務應該用于任何需要持續較長時間的應用程序,例如網絡監視器或更新檢查應用程序。

 3、 內容提供程序(Content Provider)

 可以將內容提供程序瞧作數據庫服務器。內容提供程序的任務就是管理對持久數據的訪問,例如 SQLite 數據庫。如果應用程序非常簡單,那么可能不需要

 創建內容提供程序。如果要構建一個較大的應用程序,或者構建需要為多個活動或應用程序提供數據的應用程序,那么可以使用內容提供程序實現數據訪問。

 4、 廣播接收器(Broadcast Receiver)

 Android 應用程序可用于處理一個數據元素,或者對一個事件(例如接收文本消息)做出響應。

 5、 視圖(View)

 View 就是 Android 中圖形用戶界面的基類,提供了可視化界面展示。Android的圖形界面分為三層:底層就是 Activity;Activity 上面就是 Window; Window上面就是 Views。View 又可以分為 View 與 ViewGroup。View 就是基本控件,ViewGroup 就是布局控件。

 6、 信使(Intent)

 Intent 就是不同組件之間相互導航的紐帶,封裝了不同組件導航查找的條件。

 Android 應用程序就是連同一個 AndroidManifest、xml 文件一起部署到設備的。AndroidManifest、xml 包含必要的配置信息,以便將它適當地安裝到設備。它包括必需的類名與應用程序能夠處理的事件類型,以及運行應用程序所需的許可。例如,如果應用程序需要訪問網絡—例如為了下載一個文件—那么manifest 文件中必須顯式地列出該許可。很多應用程序可能啟用了這個特定的許可。這種聲明式安全性有助于減少惡意應用程序損害設備的可能性。

 2、4 開發工具及環境簡介 2 2 、4 4 、1 1 開發工具 e Eclipse 簡介

  Eclipse就是一個開放源代碼的、與NetBeans、Sun ONE Studio Borland Jbuilder類似的一種基于Java的整合型可擴展開發平臺,也就是目前最著名的開源項目之一,Eclipse 附帶了一個標準的插件集,包括 Java 開發工具(Java Development Tools,JDT)。其未來的目標不僅僅就是成為專門開發Java程序的IDE環境,根據Eclipse的體系結構,通過開發插件,它能擴展到任何語言的開發,甚至能成為圖片繪制的工具。

  目前,Eclipse已經開始提供C語言開發的功能插件。更難能可貴的就是,Eclipse就是一個開放源代碼的項目,任何人都可以下載Eclipse的源代碼,并且在此基礎上開發自己的功能插件。也就就是說未來只要有人需要,就會有在Eclipse之上COBOL,Perl,Python等語言的開發插件出現。同時可以通過開發新的插件擴展現有插件的功能,可以無限擴展,而且有著統一的外觀,操作與系統資源管理,這也正就是Eclipse的潛力所在。

  Eclipse的主要組成。

  Eclipse就是一個開放源代碼的軟件開發項目,專注于為高度集成的工具開發提供一個全功能的、具有商業品質的工業平臺。它主要由Eclipse項目、Eclipse工具項目與Eclipse技術項目三個項目組成,具體包括四個部分組成——

 Eclipse Platform、JDT、CDT與PDE、JDT支持Java開發、CDT支持C開發、PDE

 用來支持插件開發,Eclipse Platform則就是一個開放的可擴展IDE,提供了一個通用的開發平臺。它提供建造塊與構造并運行集成軟件開發工具的基礎。

  Eclipse SDK(軟件開發者包)就是Eclipse Platform、JDT與PDE所生產的組件合并,它們可以一次下載。這些部分在一起提供了一個具有豐富特性的開發環境,允許開發者有效地建造可以無縫集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse項目生產的工具與來自其它開放源代碼的第三方軟件組合而成。Eclipse項目生產的軟件以 CPL發布,第三方組件有各自自身的許可協議。

 2 2 、4 4 、2 2 開發環境簡介

 本項目在windowsXP操作系統上進行開發,Google為開發者提供了 SDK(Software Development Kit)。Android SDK的下載地址為。因為本項目的開發工具就是Eclipse,所以還需要安裝ADT(Android Development Tools)插件。具體安裝步驟就不在本文中介紹了。

 第二章 游戲開發 2、1 需求分析 需求分析工作就是軟件生存周期中重要的一步,也就是起決定性的一步。通過它可以全面了解整個系統的功能與性能方面的要求,為軟件設計打下堅實的基礎。該部分的目標主要有:獲得目標系統的物理模型,了解目標系統就是如何運行的;抽象出目標系統的邏輯模型,對物理模型進行篩選,得到與軟件系統有關的部分;建立目標系統的邏輯模型,得出數據流圖與數據字典;補充目標系統的邏輯模型,對目標系統的用戶界面,至今尚未考慮的細節進行說明。

 本系統主要就是完成貪吃蛇游戲的基本操作。用戶可以自己練習與娛樂。本系統需要滿足以下幾點要求。

 (1) 利用方向鍵來改變蛇的運行方向。

 (2) 吃到食物就變成新的蛇體,碰到壁或自身則游戲結束,否則正常運行 2、2 系統開發目標 采用基于Android的程序設計技術,以及用Eclipse開發Android程序的相關技術開發出具有良好用戶界面,操作簡單易學,游戲功能齊全且有益于智力開發的貪吃蛇游戲。

 3、游戲策劃 3、1 系統需求分析 3 3 、1 1 、1 1 業務需求分析

 雖然現在市面上存在著各種各樣的游戲版本,可就是貪吃蛇其市場還就是相當大的、因為它的特殊在于它能吸引人更深入,愛不釋手、隨著游戲速度不斷加快,其刺激性也更強、可以說該游戲的優勢在于它的簡單易行,不論就是手機,還就是小游戲機,都能很快順利的運行、對于在外忙碌的人,不可能花費大量時間在娛樂上,大型游戲就是行不通的,這樣的小游戲剛好迎合了她們的需求。

 手機貪吃蛇游戲基于 JAVA 平臺編寫,采用 Android 技術開發的一款手機游戲。手機游戲程序就是一項精度要求很高的程序系統,因為其代碼利用率很高。一個實時運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都

 會以極高的頻率在后臺等待響應,若有絲毫的差別都將很容易導致程序在運行不久后可能出現嚴重錯誤,甚至死循環。因此,其邏輯設計應當相當嚴謹,需將所有可能發生的事件及意外情況考慮在設計中。JAVA 就是基于虛擬機的半解釋型編譯系統,其執行效率較 C++等完全編譯后的程序會低很多,程序如果不進行精簡與優化,將可能導致運行的不流暢。

 2 2 、3 3 、2 2 用戶需求分析

 游戲開發成功后,最終用戶為各個年齡段的人群,用戶范圍相當廣泛。但就是用戶對軟件產品也有一定的要求。

 1、 簡單易學

 時間不管對于誰來說都就是寶貴的,用戶不會愿意花大量時間去學習使用一款軟件。一款軟件如果操作界面不友好,讓用戶難以上手使用,那就說明這款軟件開發得不夠成功,從而失去大量的用戶。所以本項目必須擁有良好的交互界面,讓用戶安裝之后就能進行游戲。

 2、 運行穩定

 一款軟件設計得不夠好,那么就有可能在運行的時候出現一些不可預料的錯誤從而造成軟件崩潰。如果用戶正在游戲突然軟件崩潰了,無疑會讓用戶感到非常不舒服,有可能就把軟件給卸載了,這樣也會失去很多用戶。

 3、 操作簡便

 用戶不就是程序員,她們不知道程序的內部邏輯。所以程序員必須提供給用戶便捷的操作接口來供用戶操作,靈活便捷的操作性直接影響了一款軟件的好壞。

 3 3 、2 2 、3 3 功能需求分析

 本項目就是一個運行在 Android 手機上的游戲,所以在應該實現以下功能。

 1、 響應鍵盤事件 玩家可以從手機鍵盤或者觸屏開始游戲,操控游戲。

 2、 繪制游戲圖形界面 玩家開始游戲后,在手機屏幕上繪制出一條初始由 7 個節點組成小蛇。蛇能夠在屏幕上移動,屏幕上隨機位置出現食物,當蛇吃到食物后蛇的身體會增長一截同時移動速度也會響應加快。蛇不能向相反方向移動,例如蛇頭朝南時則不能向北移動。當蛇頭碰到墻壁或者碰到自己的身體時游戲結束。

 3、 記錄玩家分數 當游戲結束后,顯示玩家在游戲中所獲得的分數。

 4 游戲設計 4、1 程序流程設計 本游戲的流程如下圖 4-1 所示。

 如圖 4-1 4、2 概要設計 開始 初始化界面與蛇身 放置食物 蛇開始運動 蛇吃到食? 蛇長大 蛇死亡? 繼 續退出界面 N N Y N Y 游戲者按鍵選擇 Y

 4 4 、2 2 、1 1 模塊劃分

 從面向對象程序設計的角度,本項目總體可以分為游戲界面模塊、數據存儲模塊與控制模塊。

 如下圖 4-2 所示。

 如圖 4-2 4 4 、2 2 、2 2 游戲主界面模塊

 游戲界面主框架主要包括游戲圖形區域界面、游戲的開始按鈕、暫停按鈕、游戲的退出按鈕。

 游戲界面主框架的主要結構圖如圖 4-3 所示。

 如圖 4-3 4 4 、2 2 、3 3 游戲控制模塊

 游戲控制模塊主要通過手機鍵盤上的按鈕來控制游戲的開始、游戲的退出這兩個功能以及控制游戲分數變化。在這個模塊中,需要給各個按鈕添加響應事件

 代碼,來對上述的功能加以進一步的實現。游戲控制模塊的主要框架如圖 4-4 所示。

 如圖 4-4 4、3 模塊實現原理

 4 4 、3 3 、1 1 游戲界面模塊實現

 1、 實現游戲背景

 本游戲采用 Activity 作為游戲背景的載體,在 Android 中一個 Activity 就相當于 windows 中的一個窗口,Activity 上可以放置許多類型的控件。一個activity 主要有三個狀態。

 當在屏幕前臺時(位于當前任務堆棧的頂部),它就是活躍或運行的狀態。它就就是相應用戶操作的 activity。

  當它失去焦點但仍然對用戶可見時,它處于暫停狀態。即就是:在它之上有另外一個 activity。這個 activity 也許就是透明的,或者未能完全遮蔽全屏,所以被暫停的 activity 仍對用戶可見。暫停的 activity 仍然就是存活狀態(它保留著所有的狀態與成員信息并連接至窗口管理器),但當系統處于極低內存的情況下,仍然可以殺死這個 activity。如果它完全被另一個 activity 覆蓋就是,它處于停止狀態。它仍然保留所有的狀態與成員信息。然而它不在為用戶可見,所以它的窗口將被隱藏,如果其它地方需要內存,則系統經常會殺死這個activity。

 如果一個 activity 處于暫停或停止狀態,系統可以通過要求它結束(調用它的 finish() 方法)或直接殺死它的進程來將它驅出內存。當它再次為用戶可見的時候,它只能完全重新啟動并恢復至以前的狀態。

 當一個 activity 從這個狀態轉變到另一個狀態時,它被以下列 protected

 方法所通知。

 void onCreate(Bundle savedInstanceState) 、void onStart() 、void onRestart() 、void onResume() 、void onPause() 、void onStop() 、void onDestroy()

 2、 實現蛇的身體

 蛇可以瞧做就是一個個節點組成的,因此可以用一個鏈表來存儲蛇身的元素,在畫蛇時遍歷這個鏈表講里面的元素一一畫出,這樣就實現了一條蛇。

 3、 實現蛇的移動

 用一個 timer(定時器)來不斷地刷新游戲畫面,每刷新一次就再蛇頭的前面(鏈表的尾部)增加一個新元素,同時把蛇尾的一個元素刪掉,這樣從視覺上瞧起來就實現了蛇的移動。

 4、 實現蛇吃食物

 蛇移動的過程中如果蛇頭的坐標與食物出現的坐標重合了,那么就在蛇頭的位置增加一個元素同時不刪除蛇尾的最后一個元素,這樣蛇每遲到一個食物 身體就會變長一截。

 4 4 、3 3 、2 2 游戲控制模塊實現

 1、 實現操作蛇的移動方向

 在 Android 系統中,手機上的每個按鈕都會有一個對應的鍵值跟它對應,所在可以給對應的按鈕設置監聽器 OnClickListener,監聽器就是一個接口,該接口中有一個方法 onClick(View v)。當按鈕被點擊的時候系統會自動調用該監聽器的 onClick(View v)方法。所以實現游戲控制的具體代碼將被寫到該方法中。

 因為本游戲中不允許蛇向與蛇頭相反的方向移動,所以當用戶操作時需要判斷用戶操作的方向就是不就是跟規則沖突,若沖突則無視該操作,若不沖突則響應該操作,所以需要用一個變量來記錄蛇頭的當前方向。

 2、 實現游戲暫停

 在 Activity 的生命周期中,有一個 onPause()方法、該方法在 Activity 變得不可見的時候被系統自動調用、在玩游戲過程中,如果有來電或就是其它事件中斷,這時應該把當前狀態保存。以便返回時,還可以繼續玩游戲。這就使用onSaveInstanceState 實現保存當前狀態。

 3、 實現游戲恢復

 Activity 生命周期的 onResume()方法、該方法在 Activity 從不可見的狀態下變得 可見時被系統自動調用、在用戶接完電話或者在暫停狀態下觸摸屏幕后可以在該生命周期方法中對游戲進行恢復。

 4、 實現游戲退出

 當一個 Activity 退出或者被調用 finish()方法后,系統會調用其生命周期方法 onDestroy()、當用戶退出游戲時,可以在這個方法中對資源進行釋放 。

 4 4 、3 3 、w 3TileView 類的設計

 TileView 就是游戲的界限,即蛇頭若觸碰到界限則游戲結束。因為界限也需要被現實到屏幕上,所以 TileView 需要繼承 Android、view、View 類。Android、view、View 類就是描繪塊狀視圖的基類。View 會繪制一個包含 Drawing 就是event 事件的方形塊。View 就是所有與用戶交互的組件的 Widgets 的基類(Buttons,textField 等),View 的子類 ViewGroup 就是 layouts 類的基類,layouts 類可以包含其她的 View/ViewGroup 組件并且定義展示的屬性。

 實現一個 View,首先需要實現框架中一些所有 Views 公用的方法。不必重寫所有所有的方法,可以僅僅重寫 onDraw(Android、graphics、Canvas)。

 4 4 、3 3 、4 4

 w SnakeView 類的設計

 SnakeView 就是本游戲的業務邏輯類,該類中包含了游戲數據與一些處理數據的方法以及一些內部類。SnakeView 的方法摘要。

 1、 判斷按鍵的方法

 在 Android 手機上,每個按鍵都會有一個唯一的鍵值與它對應,可以通過獲得鍵值來判斷哪個鍵被按下了并采取相應的動作。

 2、 設置提示信息的方法

 通過程序判斷動態地設置用戶提示信息,如游戲結束。

 3、 在隨機位置出現食物的方法

 通過隨機數在屏幕范圍內隨機出現一個食物,但就是不允許同一時刻有兩個食物存在。

 4、 刷新蛇的當前位置的方法

 主要用于刷新蛇的當前位置。

 5、 判斷蛇就是否吃到食物的方法

 因為食物與蛇都會有一個坐標,所以可以通過判斷蛇頭坐標就是否跟食物坐標相等的方法來判斷蛇就是否吃到了食物。

 4、4

 程序主結構

 本次所設計貪吃蛇游戲的程序主結構如圖 4-5 所示。

 如圖 4-5

  4、5

 程序類圖 該程序由以下三個類實現,分別為 TileView,Snake,SnakeView。各個類之間的關系及所包括的方法如圖 4-6 所示。

 4、6 詳細代碼 4 4 、6 6 、e 1 Snake 類的詳細設計

 Snake 類就是蛇頭以及蛇頭的控制部分,包括判斷 newDirection 與oldDirection 就是否為相反方向,用于選取有效方向。判斷蛇頭就是否與蛇身的某個節點的坐標重合,即蛇就是否吃到自己。實現蛇身沿著蛇頭的軌跡移動。根據方向鍵,改變蛇頭的 x、y 的值,即改變方向。以及讓蛇不停走動。

 Snake、java public class TileView extends View {

  /**

  * Parameters controlling the size of the tiles and their range within view、

  * Width/Height are in pixels, and Drawables will be scaled to fit to these

  * dimensions、 X/Y Tile Counts are the number of tiles that will be drawn、

  */

  protected static int mTileSize ; // ?? ? tile? ? ?С???? ? ??? ? ? ? ????? ? ? ????

  ? ??

 protected static int mXTileCount ; // ?? ? ??x??? ???????tile????????????????

 protected static int mYTileCount ;

  private static int mXOffset ; // ?? ? ???? ? ????

 private static int mYOffset ;

  /**

  * A hash that maps integer handles specified by the subclasser to the

  * drawable that will be used for that reference

  */

 private Bitmap[] mTileArray;

 // ?? ? ??tile?? ? ?? ?? ???顣ÿ ? ??tile???? ?? ??bitmap??????mTileArray[1]??? ? ? ? ?bitmap????????? ? ?

  /**

  * A two-dimensional array of integers in which the number represents the

  * index of the tile that should be drawn at that locations

  */

 private int[][] mTileGrid;

 // ?? ? ? ? ?tile?????顣????int[1][1]=0 ? ???????? ? ? ? ?int[1][2]=1 ? ????????? ? ??

 // ?? ?? ???????ô????? ? ?????и??

  ? ???

  private final Paint mPaint = new Paint(); // ??????? ? ?? ? ???????? ? ?ú???????? ???

  ? ????????????

  public TileView(Context context, AttributeSet attrs, int defStyle) {

  super(context, attrs, defStyle);

  // ?????õ???TypeArray?????????Ь ?? google?¡???google ū ?????? ? ???? ? ???飬?? ? ?????? ? ??????????? ? ?? ? ?

  TypedArray a = context、obtainStyledAttributes(attrs, R、styleable、

 TileView );

 mTileSize = a、getInt(R、styleable、 TileView_tileSize , 12);

 a、recycle();

 }

  public TileView(Context context, AttributeSet attrs) {

  super(context, attrs);

 TypedArray a = context、obtainStyledAttributes(attrs, R、styleable、TileView );

 mTileSize = a、getInt(R、styleable、 TileView_tileSize , 12);

 a、recycle();

 }

  /**

  * Rests the internal array of Bitmaps used for drawing tiles, and sets the

  * maximum index of tiles to be inserted

  *

 * @param tilecount

 */

  public void resetTiles( int tilecount) {

  mTileArray = new Bitmap[tilecount];

 }

  // ?????? ? ?????????? ?? ????? ? ? ? ??????view?? ? ??? ? ???????? ? ?? ? ???? ? ??view? ? ?С????0????????layout

  ? ??ÿ??view?? ? ??? ? ?С????????? ? ? ? ??????????

 @Override

 protected void onSizeChanged( int w, int h, int oldw, int oldh) {

  mXTileCount = ( int) Math、 floor (w / mTileSize );

 mYTileCount = ( int) Math、 floor (h / mTileSize );

 mXOffset = ((w - ( mTileSize * mXTileCount )) / 2);

  mYOffset = ((h - ( mTileSize * mYTileCount )) / 2);

 mTileGrid = new int[ mXTileCount ][ mYTileCount ];

  clearTiles();

 }

  /**

  * Function to set the specified Drawable as the tile for a particular

  * integer key、

  *

 * @param key

 * @param tile

 *

 ??????? ? ???Key????tile????????? ? ? ? tile?? ?? ???????? ? ??drawable?? ? ???bitmap??

  */

 public void loadTile( int key, Drawable tile) {

  Bitmap bitmap = Bitmap、 createBitmap ( mTileSize , mTileSize , Bitmap、Config、 ARGB_8888 );

  Canvas canvas = new Canvas(bitmap);

  tile、setBounds(0, 0, mTileSize , mTileSize );

  tile、draw(canvas);

 mTileArray[key] = bitmap;

 }

  /**

  * Resets all tiles to 0 (empty)

  *

 */

 public void clearTiles() {

  for ( int x = 0; x < mXTileCount ; x++) {

 for ( int y = 0; y < mYTileCount ; y++) {

  setTile(0, x, y);

 }

 }

 }

  /**

  * Used to indicate that a particular tile (set with loadTile and referenced

  * by an integer) should be drawn at the given x/y coordinates during the

  * next invalidate/draw cycle、

  *

 * @param tileindex

 * @param x x

 * @param y y

 *

 ??????????ÿ ? ??tile???? ? ? ?? ??? ? ?????? ? ?? ?? ???????tileindex??? ? ?????mTileArray[]?е?index

  */

 public void setTile( int tileindex, int x, int y) {

  mTileGr id[x][y] = tileindex;

 }

  // ?????????? ? ????? ? ? ? ??????? ? ? ? ?? ???ÿ??tile??????????????? ? ?? ? ??????tile??draw??canvas? ? ?

 @Override

 public void onDraw(Canvas canvas) {

  super、onDraw(canvas);

  for ( int x = 0; x < mXTileCount ; x += 1) {

 for ( int y = 0; y < mYTileCount ; y += 1) {

  if ( mTileGrid[x][y] > 0) {

 canvas、drawBitmap( mTileArray[ mTileGrid[x][y]], mXOffset + x * mTileSize , mYOffset + y * mTileSize , mPaint);

  }

 }

  }

  } }

 4 4 、6 6 、 2 w TileView 類的詳細設計

 TileView 就是游戲的界限,即蛇頭若觸碰到界限則游戲結束。因為界限也需要被現實到屏幕上,所以 TileView 需要繼承 Android、view、View 類。Android、view、View 類就是描繪塊狀視圖的基類。View 會繪制一個包含 Drawing 就是event 事件的方形塊。View 就是所有與用戶交互的組件的 Widgets 的基類(Buttons,textField 等),View 的子類 ViewGroup 就是 layouts 類的基類,layouts 類可以包含其她的 View/ViewGroup 組件并且定義展示的屬性。

 實現一個 View,首先需要實現框架中一些所有 Views 公用的方法。不必重寫所有所有的方法,可以僅僅重寫。

 TileView 、 Java

 public class TileView extends View {

  /**

  * Parameters controlling the size of the tiles and their range within view、

  * Width/Height are in pixels, and Drawables will be scaled to fit to these

  * dimensions、 X/Y Tile Counts are the number of tiles that will be drawn、

  */

  protected static int mTileSize ; // ?? ? tile? ? ?С???? ? ??? ? ? ? ????? ? ? ????

  ? ??

  protected static int mXTileCount ; // ?? ? ??x??? ???????tile????????????????

 protected static int mYTileCount ;

  private static int mXOffset ; // ?? ? ???? ? ????

 private static int mYOffset ;

  /**

  * A hash that maps integer handles specified by the subclasser to the

  * drawable that will be used for that reference

  */

 private Bitmap[] mTileArray;

 // ?? ? ??tile?? ? ?? ?? ???顣ÿ ? ??tile???? ?? ??bitmap??????mTileArray[1]??? ? ? ? ?

 bitmap????????? ? ?

  /**

  * A two-dimensional array of integers in which the number represents the

  * index of the tile that should be drawn at that locations

  */

 private int[][] mTileGrid;

 // ?? ? ? ? ?tile?????顣????int[1][1]=0 ? ???????? ? ? ? ?int[1][2]=1 ? ????????? ? ??

 // ?? ?? ???????ô????? ? ?????и??

  ? ???

  private final Paint mPaint = new Paint(); // ??????? ? ?? ? ???????? ? ?ú???????? ???

  ? ????????????

  public TileView(Context context, AttributeSet attrs, int defStyle) {

  super(context, attrs, defStyle);

  // ?????õ???TypeArray?????????Ь ?? google?¡???google ū ?????? ? ???? ? ???飬?? ? ?????? ? ??????????? ? ?? ? ?

  TypedArray a = context、obtainStyledAttributes(attrs, R、styleable、TileView );

 mTileSize = a、getInt(R、styleable、 TileView_tileSize , 12);

 a、recycle();

 }

  public TileView(Context context, AttributeSet attrs) {

  super(context, attrs);

 TypedArray a = context、obtainStyledAttributes(attrs, R、styleable、TileView );

 mTileSize = a、getInt(R、styleable、 TileView_tileSize , 12);

 a、recycle();

 }

  /**

  * Rests the internal array of Bitmaps used for drawing tiles, and sets the

  * maximum index of tiles to be inserted

  *

 * @param tilecount

 */

  public void resetTiles( int tilecount) {

  mTileArray = new Bitmap[tilecount];

 }

  // ?????? ? ?????????? ?? ????? ? ? ? ??????view?? ? ??? ? ???????? ? ?? ? ???? ? ??view? ? ?С????0????????layout

  ? ??ÿ??view?? ? ??? ? ?С????????? ? ? ? ??????????

 @Override

 protected void onSizeChanged( int w, int h, int oldw, int oldh) {

  mXTileCount = ( int) Math、 floor (w / mTileSize );

  mYTileCount = ( int) Math、 floor (h / mTileSize );

 mXOffset = ((w - ( mTileSize * mXTileCount )) / 2);

  mYOffset = ((h - ( mTileSize * mYTileCount )) / 2);

 mTileGrid = new int[ mXTileCount ][ mYTileCount ];

  clearTiles();

 }

  /**

  * Function to set the specified Drawable as the tile for a particular

  * integer key、

  *

 * @param key

 * @param tile

 *

 ??????? ? ???Key????tile????????? ? ? ? tile?? ?? ???????? ? ??drawable?? ? ???bitmap??

  */

 public void loadTile( int key, Drawable tile) {

  Bitmap bitmap = Bitmap、 createBitmap ( mTileSize , mTileSize , Bitmap、Config、 ARGB_8888 );

  Canvas canvas = new Canvas(bitmap);

  tile、setBounds(0, 0, mTileSize , mTileSize );

  tile、draw(canvas);

 mTileArray[key] = bitmap;

 }

  /**

  * Resets all tiles to 0 (empty)

  *

 */

 pu blic void clearTiles() {

  for ( int x = 0; x < mXTileCount ; x++) {

 for ( int y = 0; y < mYTileCount ; y++) {

  setTile(0, x, y);

 }

  }

 }

  /**

  * Used to indicate that a particular tile (set with loadTile and referenced

  * by an integer) should be drawn at the given x/y coordinates during the

  * next invalidate/draw cycle、

  *

 * @param tileindex

 * @param x x

 * @param y y

 *

 ??????????ÿ ? ??tile???? ? ? ?? ??? ? ?????? ? ?? ?? ???????tileindex??? ? ?????mTil

 eArray[]?е?index

  */

 public void setTile( int tileindex, int x, int y) {

  mTileGrid[x][y] = tileindex;

 }

  // ?????????? ? ????? ? ? ? ??????? ? ? ? ?? ???ÿ??tile??????????????? ? ?? ? ??????tile??draw??canvas? ? ?

 @Override

 public void onDraw(Canvas canvas) {

  super、onDraw(canvas);

  for ( int x = 0; x < mXTileCount ; x += 1) {

 for ( int y = 0; y < mYTileCount ; y += 1) {

  if ( mTileGrid[x][y] > 0) {

 canvas、drawBitmap( mTileArray[ mTileGrid[x][y]], mXOffset + x * mTileSize , mYOffset + y * mTileSize , mPaint);

  }

 }

  }

  } } 4 4 、6 6 、3 3

 w SnakeView 類的詳細設計

 SnakeView 就是本游戲的業務邏輯類,該類中包含了游戲數據與一些處理數據的方法以及一些內部類。

 SnakeView 的方法摘要。

 1、 判斷按鍵的方法

 在 Android 手機上,每個按鍵都會有一個唯一的鍵值與它對應,可以通過獲得鍵值來判斷哪個鍵被按下了并采取相應的動作。

 2、 設置提示信息的方法

 通過程序判斷動態地設置用戶提示信息,如游戲結束。

 3、 在隨機位置出現食物的方法

 通過隨機數在屏幕范圍內隨機出現一個食物,但就是不允許同一時刻有兩個食物存在。

 4、 刷新蛇的當前位置的方法主要用于刷新蛇的當前位置。

 5、 判斷蛇就是否吃到食物的方法

 因為食物與蛇都會有一個坐標,所以可以通過判斷蛇頭坐標就是否跟食物坐標相等的方法來判斷蛇就是否吃到了食物。

 SnakeView 、 java

 public class SnakeView extends TileView implements OnClickListener {

  private static final String TAG = "SnakeView";

  /**

  * Current mode of application: READY to run, RUNNING, or you have already

  * lost、 static final ints are used instead of an enum for performance

  * reasons、

  */

 privat e int mMode = READY ; // ??????? ? ??5?? ?? ??

 public static final int PAUSE = 0;

 public static final int READY = 1;

 public static final int RUNNING = 2;

 public static final int LOSE = 3;

  /**

  * Current direction the snake is headed、

  */

 private int mDirection = NORTH ; // ????? ?

  ? ?????? ? ?? ? ??? ? ???

 private int mNextDirection = NORTH ;

 private static final int NORTH = 1;

 private static final int SOUTH = 2;

 private static final int EAST = 3;

 private static final int WEST = 4;

  /**

  * Labels for the drawables that will be loaded into the TileView class

  */

 private static final int RED_STAR = 1; // ???????? ? ?

  ? ????? ? ?????tile??drawable??????RED_STAR???????????? ? ?? ?tile??

 private static final int YELLOW_STAR = 2;

  pri vate static final int GREEN_STAR = 3;

  /**

  * mScore: used to track the number of apples captured mMoveDelay: number of

  * milliseconds between snake movements、 This will decrease as apples are

  * captured、

  */

 private long mScore = 0; // ???????? ? ?? ? ? ? ??

 private long mMoveDelay = 600; // ?????? ? ??????? ? ? ? ??

 /**

  * mLastMove: tracks the absolute time when the snake last moved, and is

  * used to determine if a move should be made based on mMoveDelay、

  */

 private long mLastM ove; // ?? ? ??? ? ??? ? ??

  /**

  * mStatusText: text shows to the user in some run states

  */

 private TextView mStatusText; // ???? ? ? ? ?? ? ????? ? ??

  /**

  * mSnakeTrail: a list of Coordinates that make up the snake"s body

  * mAppleList: the secret location of the juicy apples the snake craves、

  */

 private ArrayList<Coordinate> mSnakeTrail = new ArrayList<Coordinate>(); // ????? ?У???tile??????????

 private ArrayList<Coordinate> mAppleList = new ArrayList<Coordinate>(); // ? ???????У???tile??????????

  /**

  * Everyone needs a little randomness in their ...

推薦訪問: 開發 設計 游戲

【游戲設計與開發】相關推薦

工作總結最新推薦

NEW