2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  畢 業(yè) 論 文</b></p><p>  題目:基于Android操作系統(tǒng)的足球小將手機(jī)游戲 </p><p>  摘要: 近年來,隨著經(jīng)濟(jì)的日益發(fā)展,人們的生活水平不斷提高,生活質(zhì)量也在漸漸的改善。適當(dāng)?shù)挠螒驅(qū)θ藗兊臉I(yè)余生活是不可必缺的。說到游戲,種類有好多種。在電腦游戲上的分類也很多。RCG(賽車游戲)、FTG(格斗游戲)、SPG(

2、體育游戲)、RPG(角色扮演)、ACT(動(dòng)作游戲)、AVG(冒險(xiǎn)游戲)、PUZ(益智游戲) 等等。雖說繁多的游戲種類讓人目不暇接,游戲的可玩性、可延續(xù)性和可對(duì)比性是益智類游戲深受各年齡階層玩家歡迎的原因。當(dāng)今網(wǎng)絡(luò)發(fā)展迅速,益智類游戲被廣泛運(yùn)用到網(wǎng)絡(luò)各大平臺(tái)上。借鑒網(wǎng)絡(luò)各大平臺(tái)上的益智游戲,我利用java 、Android API語(yǔ)言開發(fā)了本游戲項(xiàng)目。我通過Eclipse 、Android SDK 利用Java語(yǔ)言編寫的《足球小將》,在游

3、戲中控制自己的球員擊球、進(jìn)門,達(dá)到一定分?jǐn)?shù)獲得勝利。</p><p>  關(guān)鍵字: 足球小將;道具;聲音;分?jǐn)?shù);關(guān)卡</p><p>  ABSTRACT: In recent years, growing as the economy, improving people's living standard and quality of life has also gradual

4、ly improved. Appropriate games on people’s spare time are not lack of will. There are so many kind of game. Also the classification of the computer games. Such as RCG (racing game), FTG (Fighting Game), SPG (sports gam

5、es), RPG (role playing), ACT (action game), AVG (adventure game), PUZ (Puzzle Games) and so on. Although there are too many kinds for the eye to take in.</p><p>  Key words: Football Soccer;Prop; sound;

6、 scores; levels</p><p>  目 錄</p><p>  前言……………………………………………………………………3</p><p>  相關(guān)研究綜述…………………………………………………………5</p><p>  研究的目標(biāo)、內(nèi)容與意義……………………………………………6</p><

7、p>  3.1 研究目標(biāo)…………………………………………………………6</p><p>  3.2 研究主要內(nèi)容……………………………………………………6 </p><p>  3.2 研究的意義………………………………………………………6 </p><p>  Android程序設(shè)計(jì)相關(guān)技術(shù)概論……………………………………..8</p><

8、;p>  4.1 XML界面布局………………………………………………….9</p><p>  4.2 Android的Activity組件………………………………………9</p><p>  4.3 SQLite數(shù)據(jù)庫(kù)………………………………………………….9</p><p>  4.4 Android 2D圖形編程…………………………………………9<

9、/p><p>  游戲研究的重點(diǎn)、算法與思路……………………………………… 10</p><p>  5.1游戲研究的重點(diǎn)……………………………………………10</p><p>  5.2游戲研究的算法……………………………………………16</p><p>  5.3游戲界面………………………………........………………20</p&g

10、t;<p>  5.4游戲的思路…………………………………………………26</p><p>  論文總結(jié)…………………………………………………………… 28</p><p>  參考文獻(xiàn)…………………………………………………………………… 30</p><p>  致謝………………………………………………………………………...31</p>

11、<p>  附錄一(游戲截圖)…………………………………………………............32</p><p><b>  前 言</b></p><p>  現(xiàn)在,游戲的類型也由最初的動(dòng)作游戲和簡(jiǎn)單益智游戲向更復(fù)雜、更高智力,更具真實(shí)性的游戲發(fā)展。目前的游戲種類繁多,包括角色扮演、仿真模擬類、人工智能、休閑類、渲染類、網(wǎng)絡(luò)類等等,甚至有的游戲包含了

12、好幾種類型。</p><p>  足球小將游戲一直以來都很多。但仿真模擬類的游戲卻有不少,現(xiàn)在休閑類的技術(shù)廣泛的應(yīng)用到很多游戲里面等等。最廣泛應(yīng)用的應(yīng)該就是交換排列檢測(cè)。隨著技術(shù)的不斷提高,玩家對(duì)游戲真實(shí)性的要求也不斷提高。相信益智類游戲的技術(shù),以后會(huì)更加深入各種游戲之中。</p><p>  鑒于游戲的對(duì)社會(huì)的巨大影響力和光輝的發(fā)展前景,以及我們自己對(duì)游戲愛好,這次的畢業(yè)設(shè)計(jì)我們決定嘗試

13、設(shè)計(jì)和制作一個(gè)具有一定可玩性的游戲。期間,我們收集相關(guān)資料、研究同類型的游戲、閱讀有關(guān)這類型游戲和相關(guān)技術(shù)性的書籍,通過制作游戲項(xiàng)目來熟悉游戲的制作思路、過程,加深對(duì)面向?qū)ο缶幊陶Z(yǔ)言的掌握,培養(yǎng)自己的耐心、細(xì)心和考慮問題的全面性,同時(shí)解決本課題要完成的問題,如游戲框架如何構(gòu)建,如何將DirectX的內(nèi)容封裝,如何完善游戲的各種功能,如何能讓游戲有音樂和音效的實(shí)現(xiàn),如何能讓游戲過關(guān),如何能讓游戲界面美觀,看起來舒服感覺。</p>

14、;<p><b>  二、相關(guān)研究綜述</b></p><p>  近年來,國(guó)內(nèi)外的專家學(xué)者以及一線的開發(fā)人員從理論、方法、技術(shù)等不同的角度對(duì)Android手機(jī)操作系統(tǒng)進(jìn)行了一定的研究。本小節(jié)將從Android手機(jī)操作系統(tǒng)的發(fā)展歷程、研究現(xiàn)狀、程序開發(fā)設(shè)計(jì)簡(jiǎn)介四個(gè)方面分析總結(jié)國(guó)內(nèi)外的相關(guān)研究結(jié)果。</p><p>  今天我們來聊一聊Android系統(tǒng)的

15、歷史,首先我們就要先來說說Android系統(tǒng)這個(gè)名字的來歷。Android這一次最先出現(xiàn)在法國(guó)作家利爾 亞當(dāng)在1886年發(fā)飆的科幻小說《未來夏娃》中,作者將外表像人類的機(jī)器起名為Android,這也就是Android小人名字的由來。</p><p>  知道了Android名字的來歷我們?cè)賮砜匆幌翧ndroid系統(tǒng)的來歷。Android系統(tǒng)一開始并不是由谷歌研發(fā)出來了,Android系統(tǒng)原來的公司名字就叫做And

16、roid,谷歌公司在2005收購(gòu)了這個(gè)僅成立22月的高科技企業(yè)。Android系統(tǒng)也開始由谷歌接手研發(fā),Android系統(tǒng)的負(fù)責(zé)人以及Android公司的CEO安迪·魯賓成為谷歌公司的工程部副總裁,繼續(xù)負(fù)責(zé)Android項(xiàng)目的研發(fā)工作。</p><p>  在2007年11月5日這天,谷歌公司正式向外接展示了這款名為Android的操作系統(tǒng),并且在這天谷歌宣布建立一個(gè)全球性的聯(lián)盟組織,該組織由34家 手

17、機(jī)制造商、軟件開發(fā)商、電信運(yùn)營(yíng)商以及芯片制造商共同組成。這一聯(lián)盟將支持谷歌發(fā)布的手機(jī)操作系統(tǒng)以及應(yīng)用軟件,將共同開發(fā)Android系統(tǒng)的開放源 代碼。</p><p>  三、研究的目標(biāo)、內(nèi)容與意義</p><p><b>  3.1 研究目標(biāo)</b></p><p>  本項(xiàng)目主要研究的目標(biāo)分為:程序設(shè)計(jì)思想實(shí)踐改進(jìn)目標(biāo)、Android平臺(tái)手

18、機(jī)開發(fā)技術(shù)的研究目標(biāo)。</p><p>  (1)運(yùn)用面向?qū)ο蟮木幊趟枷虢y(tǒng)一過程,對(duì)Chess足球小將手機(jī)游戲的系統(tǒng)結(jié)構(gòu)、過程、功能等要素進(jìn)行可視化的描述,為Android程序設(shè)計(jì)的可視化提供方法、技術(shù)上的支持,為系統(tǒng)的理論模型和軟件建模提供參照。</p><p> ?。?)本系統(tǒng)中使用了多種基于Android平臺(tái)的軟件開發(fā)技術(shù),根據(jù)要實(shí)現(xiàn)的系統(tǒng)功能,系統(tǒng)需要使用到的技術(shù)及技術(shù)研究的目標(biāo)主

19、要有:</p><p>  手機(jī)游戲用戶界面的人性化、個(gè)性化界面布局,給用戶以良好的游戲體驗(yàn);</p><p>  移動(dòng)設(shè)備上的圖形編程,提供流暢靚麗的游戲過程界面;</p><p>  3.2 研究主要內(nèi)容</p><p>  項(xiàng)目研究的內(nèi)容主要有以下二大塊:</p><p>  第一部分是手機(jī)游戲的界面設(shè)計(jì)和背景音

20、效的設(shè)計(jì)。和PC上的游戲開發(fā)有些許不同,手機(jī)游戲更加的注重用戶體驗(yàn),一個(gè)人性化的、時(shí)尚靚麗的游戲界面和優(yōu)美個(gè)性化的音效設(shè)計(jì)是一個(gè)成功的手機(jī)游戲要達(dá)到的基本要求。</p><p>  第二部分是對(duì)局智能程序的設(shè)計(jì)。可以和設(shè)計(jì)好的AI(Artificial Intelligence)算法進(jìn)行游戲。人工智能程序設(shè)計(jì)是一項(xiàng)對(duì)算法要求很高的程序設(shè)計(jì),特別是在手機(jī)這種硬件資源緊缺的環(huán)境中,更是需要一個(gè)高效的算法來提供強(qiáng)大的A

21、I對(duì)局支持</p><p><b>  3.3 研究的意義</b></p><p>  游戲制作的目的是滿足了人們休閑的需要,在緊張工作之余益智類的小游戲能夠給人帶來最大程度的放松,也可以增進(jìn)人們之間的交流,溝通,通過游戲還可以認(rèn)識(shí)更多的朋友,也可以到達(dá)跨省、跨市,甚至跨國(guó)間人們互相娛樂的目的。而消消看游戲?qū)W會(huì)鍛煉眼力,時(shí)間利用快速、連續(xù)的移動(dòng),在十行十列限制區(qū)內(nèi),交

22、換相對(duì)一致球移動(dòng)。消消看除了掌握正確的動(dòng)作和遵循一般的規(guī)律以外,還應(yīng)學(xué)會(huì)一些特殊的變化。變節(jié)奏和變位置的,以避免加分被對(duì)手贏了。應(yīng)掌握多種方式的移動(dòng)球,做到能里能外,而且學(xué)會(huì)多獲取隨機(jī)出現(xiàn)增加的新球。</p><p>  足球小將游戲是一個(gè)比較經(jīng)典的游戲,根據(jù)軟件工程有關(guān)的規(guī)范,以合理的開發(fā)原則,設(shè)計(jì)出消消看游戲,并給人們的生活帶來唯美的藝術(shù)享受和健康愉快的補(bǔ)充。</p><p>  游戲

23、軟件是一種與文化背景密切聯(lián)系的產(chǎn)品,具有很強(qiáng)的民族性和豐富的文化內(nèi)涵。伴隨著游戲軟件在市場(chǎng)上的銷售,與其相關(guān)的文化也隨之傳播。因此發(fā)展我國(guó)自主的益智、健康的游戲軟件已是當(dāng)務(wù)之急。游戲是一種基于計(jì)算機(jī)的應(yīng)用軟件,是新型的休閑娛樂方式。當(dāng)前開發(fā)的游戲軟件應(yīng)該做到知識(shí)性、娛樂性、趣味性、教育性相統(tǒng)一。</p><p>  通過此次課題的設(shè)計(jì),掌握制作一個(gè)游戲軟件的方法,以及制作游戲軟件的整個(gè)流程,制作游戲軟件的步驟,為

24、以后的就業(yè)工作打下基礎(chǔ)。</p><p>  Android程序設(shè)計(jì)相關(guān)技術(shù)概論</p><p>  Android作為一個(gè)移動(dòng)設(shè)備的平臺(tái),其軟件層次結(jié)構(gòu)包括了一個(gè)操作系統(tǒng)(OS),中間件(MiddleWare)和應(yīng)用程序(Application)。根據(jù)Android的軟件框圖,其軟件層次結(jié)構(gòu)自下而上分為以下幾個(gè)層次:</p><p>  圖4.1 Android系

25、統(tǒng)架構(gòu)</p><p>  4.1 XML界面布局</p><p>  XML 是一種基于 XML 的語(yǔ)言,因此需要對(duì) XML(特別是 XML 名稱空間)很熟悉。XML是英文“XML User Interface Language”的首字母縮寫。顧名思義,它是一種應(yīng)用XML來描述使用者界面的標(biāo)示語(yǔ)言。 </p><p>  4.2 Android的Activity組

26、件</p><p>  Activity,一般代表手機(jī)屏幕的一屏,相當(dāng)于瀏覽器的一個(gè)頁(yè)面。在Activity中添加view,實(shí)現(xiàn)應(yīng)用界面和用戶交互。一個(gè)應(yīng)用程序一般由多個(gè)Activity構(gòu)成,這些Activity之間可互相跳轉(zhuǎn),可進(jìn)行頁(yè)面間的數(shù)據(jù)傳遞。每個(gè)Activity都有自己的生命周期。</p><p>  4.3 SQLite數(shù)據(jù)庫(kù)</p><p>  在An

27、droid平臺(tái)上,集成了一個(gè)嵌入式關(guān)系型數(shù)據(jù)庫(kù)—SQLite。SQLite是支持結(jié)構(gòu)化查詢的輕量級(jí)數(shù)據(jù)庫(kù),能很好得適應(yīng)于移動(dòng)設(shè)備的應(yīng)用。</p><p>  Android提供了一個(gè)名為SQLiteDatabase的類,該類封裝了一些操作數(shù)據(jù)庫(kù)的API,使用該類可以完成對(duì)數(shù)據(jù)進(jìn)行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡(jiǎn)稱為CRUD)。</p&

28、gt;<p>  4.4 Android 2D圖形編程 </p><p>  1、Simple Graphics in View:就是直接使用Android已經(jīng)實(shí)現(xiàn)的一些畫圖操作,比如說images,shapes,colors,pre-defined animation等等。這種方式只能畫靜態(tài)或者極為簡(jiǎn)單的2D圖畫,對(duì)于實(shí)時(shí)性很強(qiáng)的動(dòng)畫,高品質(zhì)的游戲都是沒法實(shí)現(xiàn)的。2、Canvas:首先我們要明白這

29、個(gè)Canvas是一個(gè)2D的概念,是在Skia中定義的。也就是說在這個(gè)方式下還是說的畫2D圖形。</p><p>  游戲研究重點(diǎn)、算法與思路</p><p>  5.1游戲研究的重點(diǎn)</p><p>  1.1 如何拼接 用一張整圖不現(xiàn)實(shí),這樣會(huì)影響程序的執(zhí)行效率,而且很占空間</p><p>  只有通過圖塊的拼接。</p>

30、<p>  1.2 裝載地圖 將地圖索引寫進(jìn)文件,在程序裝載的時(shí)候,通過輸入輸出流來讀</p><p><b>  地圖內(nèi)容。</b></p><p>  2、游戲按鍵 在游戲中通過手觸或者使用左右鍵使球員左右移動(dòng),通過判斷擊球的角度來確定足球運(yùn)行的方向和速度,當(dāng)你有事需要處理時(shí),你可以點(diǎn)擊兩個(gè)比分中間的標(biāo)志,來暫停住游戲的運(yùn)行。</p>

31、;<p>  3、關(guān)卡 關(guān)卡地圖的設(shè)置:不同的關(guān)卡,對(duì)手的移動(dòng)速度是不同的</p><p><b>  4、幫助信息</b></p><p>  (1)讓自己的隊(duì)員擊中球</p><p> ?。?)抓住時(shí)間打中道具,讓你有更大的贏面。</p><p> ?。?)控制左右鍵來使球員移動(dòng)。</p>

32、;<p>  5.2游戲研究的算法</p><p>  (1)后臺(tái)電腦判斷左右移動(dòng)</p><p>  public class AIThread extends Thread{</p><p>  GameView father;//視圖類引用</p><p>  boolean flag;//循環(huán)控制變量<

33、;/p><p>  int sleepSpan = 30;//睡眠時(shí)間</p><p>  //構(gòu)造器,初始化成員變量</p><p>  public AIThread(GameView father){</p><p>  this.father = father;</p><p>  flag = true;

34、//設(shè)置線程標(biāo)志位</p><p><b>  }</b></p><p>  //線程啟動(dòng)后的執(zhí)行方法</p><p>  public void run(){</p><p>  while(flag){ </p><p>  int d = father.ball.direction;

35、//獲取足球運(yùn)動(dòng)方向</p><p>  if(d >0 && d<8){//如果足球方向偏左</p><p>  father.aiDirection = 4;//AI運(yùn)動(dòng)方向改為向左 </p><p><b>  }</b></p><p>  else if(d>

36、;8 && d<15){//如果足球方向偏右</p><p>  father.aiDirection = 12;//AI運(yùn)動(dòng)方向改為向右</p><p><b>  }</b></p><p><b>  try{</b></p><p>  Thread.

37、sleep(sleepSpan);//休眠一段時(shí)間</p><p><b>  }</b></p><p>  catch(Exception e){</p><p>  e.printStackTrace();//打印并捕獲異常</p><p><b>  }</b></p>

38、<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  碰撞測(cè)試(足球與邊框)</p><p>  public void checkForBorders(){</p>&l

39、t;p>  int d = direction;</p><p>  //左右是不是出邊界了</p><p>  if(x <= father.fieldLeft){</p><p><b>  //撞了左邊界</b></p><p>  if(d>8 && d<16 &&

40、amp; d!=12){//如果不是正撞到左邊界</p><p>  if(Math.random() < changeOdd){//一定概率概率沿正確反射路線變向</p><p>  direction = 16 - direction;</p><p><b>  }</b></p><p>  else{

41、//一定概率隨機(jī)變向</p><p>  direction = (direction>12?1:5) + (int)(Math.random()*100)%3;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if

42、(d == 12){//如果是正撞到左邊界</p><p>  if(Math.random() < 0.4){//注意這個(gè)概率要小,因?yàn)檎采先ハMS機(jī)變向的概率大一些</p><p>  direction = 4;</p><p><b>  }</b></p><p><b>  el

43、se{</b></p><p>  direction = (Math.random() > 0.5?3:5);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&l

44、t;p>  else if(x > father.fieldRight){</p><p><b>  //撞到右邊界</b></p><p>  if(d >0 && d<8 && d!=4){</p><p>  if(Math.random() < changeOdd){/

45、/按正常反射路線變向</p><p>  direction = 16-direction;</p><p><b>  }</b></p><p>  else{//一定幾率隨機(jī)變向</p><p>  direction = (direction>4?9:13) + (int)(Math.ran

46、dom()*100)%3;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(d == 4){//如果是正撞到右邊界</p><p>  if(Math.random() < 0.4){</p><p&

47、gt;  direction = 12;</p><p><b>  }</b></p><p><b>  else{</b></p><p>  direction = (Math.random()>0.5?11:13);</p><p><b>  }</b><

48、;/p><p><b>  }</b></p><p><b>  }</b></p><p>  d = direction;</p><p>  //判斷是否撞到上邊界</p><p>  if(y < father.fieldUp){</p><

49、;p><b>  //不是正撞</b></p><p>  if(d>0 && d<4 || d>12&&d<16){</p><p>  if(Math.random() < changeOdd){//一定幾率沿正確反射路線變向</p><p>  direction

50、= (d>12?24:8) - d;</p><p><b>  }</b></p><p>  else{//一定幾率隨機(jī)變向</p><p>  direction = (d>12?9:5) + (int)(Math.random()*100)%3;</p><p><b> 

51、 }</b></p><p><b>  }</b></p><p>  else if(d == 0){//正撞到上邊界</p><p>  if(Math.random() < 0.4){//一定幾率沿正確反射路線返回</p><p>  direction = 8;</p>

52、;<p><b>  }</b></p><p><b>  else{</b></p><p>  direction = (Math.random() < 0.5?7:9);//一定幾率隨機(jī)變向</p><p><b>  }</b></p><p>

53、;<b>  }</b></p><p><b>  }</b></p><p>  //判斷是否撞到下邊界</p><p>  else if(y > father.fieldDown){</p><p><b>  //不是正撞</b></p><

54、p>  if(d >4 && d<12 && d!=8){</p><p>  if(Math.random() < changeOdd){//按正常反射路線變向</p><p>  direction = (d>8?24:8) - d;</p><p><b>  }</b>&l

55、t;/p><p>  else{//隨機(jī)變向</p><p>  direction = (d>8?13:1) +(int)(Math.random()*100)%3;</p><p><b>  }</b></p><p><b>  }</b></p><p&

56、gt;  else if(d == 8){//正撞到下邊界</p><p>  if(Math.random() < 0.4){//正常變向</p><p>  direction = 0;</p><p><b>  }</b></p><p>  else{//隨機(jī)變向</p>

57、<p>  direction = (Math.random()>0.5?1:15);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</

58、b></p><p><b>  /*</b></p><p>  * 此方法檢測(cè)是否碰到AI運(yùn)動(dòng)員,如果碰到,則調(diào)用handleCollision方法處理碰撞,</p><p>  * 同時(shí)播放聲音設(shè)置足球新速率和設(shè)置lastKicker</p><p><b>  */</b></p

59、><p>  public void checkForAIPlayers(){</p><p>  int r = (this.ballSize + father.playerSize)/2;</p><p>  for(Player p:father.alAIPlayer){</p><p>  if((p.x - this.x)*(p.x -

60、 this.x) + (p.y - this.y)*(p.y - this.y) <= r*r){//發(fā)生碰撞</p><p>  handleCollision(this,p);//處理碰撞</p><p>  if(father.father.wantSound && father.father.mpKick!=null){//播放聲音</p&

61、gt;<p>  try {//用try/catch語(yǔ)句包裝</p><p>  father.father.mpKick.start();</p><p>  } catch (Exception e) {}</p><p><b>  }</b></p><p>  velocit

62、y = p.power;</p><p>  lastKicker = 8;//記錄最后一腳是誰(shuí)踢的</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>&l

63、t;b>  /*</b></p><p>  * 此方法檢測(cè)是否碰到了玩家 的足球運(yùn)動(dòng)員,</p><p><b>  */</b></p><p>  public void checkForUserPlayers(){</p><p>  int r = (this.ballSize + fathe

64、r.playerSize)/2;</p><p>  for(Player p:father.alMyPlayer){</p><p>  if((p.x - this.x)*(p.x - this.x) + (p.y - this.y)*(p.y - this.y) <= r*r){//發(fā)生碰撞</p><p>  handleCollision(thi

65、s,p);//處理碰撞</p><p>  if(father.father.wantSound && father.father.mpKick!=null){//播放聲音</p><p><b>  try {</b></p><p>  father.father.mpKick.start();</p>

66、<p>  } catch (Exception e) {}</p><p><b>  }</b></p><p>  velocity = p.power;//被 賦予新速度</p><p>  lastKicker = 0;//記錄最后一腳誰(shuí)踢的</p><p><b&g

67、t;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  /*</b></p><p>  * 此方法處理足球和運(yùn)動(dòng)員之間的碰撞,AI和玩家的處理方式是一樣的,</p><p&

68、gt;  * 首先查看Player對(duì)象的movingDirection,再綜合Player對(duì)象的</p><p>  * attackDirection,確定方向范圍,類似直角坐標(biāo)系中的4個(gè)象限,</p><p>  * 然后在方向范圍中隨機(jī)產(chǎn)生一個(gè),這樣產(chǎn)生的方向有慣性在里面,看著</p><p>  * 比較真實(shí)。需要注意的是如果足球和運(yùn)動(dòng)員碰撞時(shí)運(yùn)動(dòng)員靜止不動(dòng)

69、,</p><p>  * 那么可選的方向就是1或15(進(jìn)攻方向朝上)、7或9(進(jìn)攻方行朝下)</p><p><b>  */</b></p><p>  public void handleCollision(Ball ball,Player p){</p><p>  switch(p.movingDirectio

70、n){</p><p>  case 12://移動(dòng)方向向左</p><p>  if(p.attackDirection == 0){//攻擊方向向上</p><p>  ball.direction = 13 + (int)(Math.random()*100)%3;//取13,14,15中一個(gè)</p><p><b

71、>  }</b></p><p>  else{//攻擊方向向下</p><p>  ball.direction = 9 + (int)(Math.random()*100)%3;//取9,10,11中一個(gè)</p><p><b>  }</b></p><p><b> 

72、 break;</b></p><p>  case 4://移動(dòng)方向向右</p><p>  if(p.attackDirection == 0){//攻擊方向向上</p><p>  ball.direction = 1 + (int)(Math.random()*100)%3;//取1,2,3中一個(gè)</p><

73、p><b>  }</b></p><p>  else{//攻擊方向向下</p><p>  ball.direction = 5 + (int)(Math.random()*100)%3;//取5,6,7中一個(gè)</p><p><b>  }</b></p><p>&l

74、t;b>  break;</b></p><p>  default://沒有移動(dòng)</p><p>  if(p.attackDirection == 0){//攻擊方向向上</p><p>  ball.direction = 15 + (int)(Math.random()*100)%3;//取1,2,3中一個(gè)</p>

75、;<p>  if(ball.direction > 15){</p><p>  ball.direction = ball.direction % 16;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else{

76、//攻擊方向向下</p><p>  ball.direction = 7 + (int)(Math.random()*100)%3;//取7,8,9中一個(gè)</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  

77、}</b></p><p><b>  }</b></p><p><b>  /*</b></p><p>  * 此方法用于檢測(cè)是否進(jìn)球,如是,則相應(yīng)球隊(duì)得分加1,然后判斷游戲是否結(jié)束(游戲規(guī)則是誰(shuí)先進(jìn)夠8個(gè)誰(shuí)就贏)</p><p><b>  */</b>&l

78、t;/p><p>  public void checkIfScoreAGoal(){</p><p>  if(this.y <= father.fieldUp && this.x > father.AIGoalLeft && this.x < father.AIGoalRight){</p><p>  //上方球門

79、進(jìn)球,即玩家</p><p>  isPlaying = false;</p><p>  father.scores[0]++;</p><p>  father.checkIfLevelUp();</p><p><b>  }</b></p><p>  else if(this.y >

80、;= father.fieldDown && this.x > father.myGoalLeft && this.x < father.myGoalRight){</p><p><b>  //AI進(jìn)球</b></p><p>  isPlaying = false;</p><p>  fath

81、er.scores[1]++;</p><p>  father.checkIfLevelUp();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //升級(jí)方法</b></p><p>  p

82、ublic void levelUp(){</p><p>  this.minVelocity +=3;</p><p>  if(minVelocity > 20){</p><p>  minVelocity = 20;</p><p><b>  }</b></p><p><

83、b>  }</b></p><p><b>  /*</b></p><p>  * 該方法判斷是否碰到了Bonus,如果碰到,對(duì)相應(yīng)的Bonus進(jìn)行操作</p><p>  * 改變其狀態(tài),調(diào)用其方法修改游戲參數(shù)等等,并播放聲音</p><p><b>  */</b></

84、p><p>  public void checkForBonus(){</p><p>  if(father.balLive.size() != 0){</p><p>  for(Bonus b:father.balLive){</p><p>  if((b.x - x)*(b.x - x) + (b.y-y)*(b.y-y) <=

85、 (b.bonusSize/2+ballSize/2)*(b.bonusSize/2+ballSize/2)</p><p>  && b.status == Bonus.LIVE){</p><p>  b.status = Bonus.EFFECTIVE;</p><p>  father.balLive.remove(b);</p>

86、<p>  b.setTarget(this.lastKicker);</p><p>  b.doJob();</p><p>  b.setTimeout(Bonus.EFFECT_SPAN);</p><p>  if(father.father.wantSound){</p><p>  if(b instanceof

87、 IceBonus){//是冰凍小球</p><p><b>  try {</b></p><p>  father.father.mpIce.start();</p><p>  } catch (Exception e) {}</p><p><b>  }</b></

88、p><p>  else if( b instanceof LargerGoalBonus){//是擴(kuò)大球門的</p><p><b>  try {</b></p><p>  father.father.mpLargerGoal.start();</p><p>  } catch (Exception e) {}&

89、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b

90、></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  5.3游戲界面</b></p><p>  public class FootballActivity extends Activity {</p>

91、<p>  View current; // 記錄當(dāng)前View</p><p>  GameView gv; // GameView對(duì)象</p><p>  WelcomeView welcome; // 歡迎界面</p><p>  LoadingView lv; // 進(jìn)度條加載界面</p><p>  int keySta

92、te = 0; // xxxx00為不動(dòng),xxxx10為向左,xxxx01為向右</p><p>  PlayerMoveThread pmt; // 移動(dòng)球員位置的線程</p><p>  boolean wantSound = true; // 是否播放聲音標(biāo)志位</p><p>  int[] layoutArray; // 表示球員球場(chǎng)站位的數(shù)組</p

93、><p>  MediaPlayer mpWelcomeMusic; // 游戲開始前的歡迎音樂</p><p>  MediaPlayer mpKick; // 踢球音效</p><p>  MediaPlayer mpCheerForWin; // 贏了的音樂</p><p>  MediaPlayer mpCheerForLose; //

94、輸了的音樂</p><p>  MediaPlayer mpCheerForGoal; // 進(jìn)球后的音樂</p><p>  MediaPlayer mpIce; // 撞到冰山后的音樂</p><p>  MediaPlayer mpLargerGoal; // 撞到打開球門后的音樂</p><p>  Rect[] rectPlus;

95、// 代表增加球員按鈕的矩形框</p><p>  Rect[] rectMinus; // 代表減少球員按鈕的矩形框</p><p>  Rect rectSound; // 是否播放聲音按鈕的矩形框</p><p>  Rect rectStart; // 開始按鈕的矩形框</p><p>  Rect rectQuit; // 退出按鈕

96、的矩形框</p><p>  Rect rectGallery; // 表示Gallery的矩形框</p><p>  int[] imageIDs = { // 存放8個(gè)俱樂部的圖片ID</p><p>  R.drawable.club_1, R.drawable.club_2, R.drawable.club_3, R.drawable.club_4,<

97、/p><p>  R.drawable.club_5, R.drawable.club_6, R.drawable.club_7,</p><p>  R.drawable.club_8 };</p><p>  int clubID = imageIDs[0]; // 記錄用戶選擇的俱樂部的ID</p><p>  public void on

98、Create(Bundle savedInstanceState) { // 重寫onCreate方法</p><p>  super.onCreate(savedInstanceState);</p><p>  initWelcomeSound(this); // 初始化開場(chǎng)動(dòng)畫音樂</p><p>  requestWindowFeature(Window.F

99、EATURE_NO_TITLE); // 設(shè)置全屏</p><p>  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,</p><p>  WindowManager.LayoutParams.FLAG_FULLSCREEN);</p><p>  welcome = new Welc

100、omeView(this); // 將屏幕切到歡迎界面</p><p>  setContentView(welcome);</p><p>  // current是當(dāng)前activity中打開的視圖</p><p>  current = welcome;</p><p>  // wantSound一個(gè)變量表示用戶是否開啟音樂</p

101、><p>  if (wantSound && mpWelcomeMusic != null) { // 如需要,播放相應(yīng)聲音</p><p>  mpWelcomeMusic.start();</p><p><b>  }</b></p><p>  initRects(); // 初始化用于匹配點(diǎn)擊事件

102、的矩形框</p><p><b>  }</b></p><p>  // 方法:初始化歡迎界面的聲音</p><p>  public void initWelcomeSound(Context context) {</p><p>  mpWelcomeMusic = MediaPlayer.create(conte

103、xt, R.raw.music);</p><p><b>  }</b></p><p>  // 方法:初始化矩形框</p><p>  public void initRects() {</p><p>  rectPlus = new Rect[3];</p><p>  rectMinu

104、s = new Rect[3];</p><p>  for (int i = 0; i < 3; i++) {</p><p>  rectPlus[i] = new Rect(244, 200 + 40 * i, 280, 236 + 40 * i);</p><p>  rectMinus[i] = new Rect(280, 200 + 40 * i,

105、 316, 236 + 40 * i);</p><p><b>  }</b></p><p>  rectSound = new Rect(135, 370, 185, 420);</p><p>  rectStart = new Rect(205, 425, 295, 475);</p><p>  rectQu

106、it = new Rect(25, 425, 115, 475);</p><p>  rectGallery = new Rect(10, 10, 310, 110);</p><p><b>  }</b></p><p><b>  @Override</b></p><p>  public

107、 boolean onTouchEvent(MotionEvent event) {// 重寫onTouchEvent方法</p><p>  if (event.getAction() == MotionEvent.ACTION_UP) {// 判斷事件類型</p><p>  int x = (int) event.getX(); // 獲得點(diǎn)擊處的X坐標(biāo)</p><

108、;p>  int y = (int) event.getY(); // 獲得點(diǎn)擊處的Y坐標(biāo)</p><p>  if (current == welcome) {// 如果當(dāng)前界面是歡迎界面</p><p>  if (rectGallery.contains(x, y)) { // 用戶點(diǎn)擊的是Gallery</p><p>  welcome.cg.gal

109、leryTouchEvnet(x, y); // 交給Gallery來處理點(diǎn)擊事件</p><p>  } else if (rectSound.contains(x, y)) { // 點(diǎn)下的是聲音選項(xiàng)</p><p>  this.wantSound = !this.wantSound; // 更改聲音選項(xiàng)</p><p>  return true;</

110、p><p>  } else if (rectStart.contains(x, y)) { // 點(diǎn)下開始鍵</p><p>  if (checkLayout(welcome.layout)) { // 檢查玩家選擇的布局是否正確</p><p>  layoutArray = welcome.layout; // 獲得玩家選擇站位布局</p><

111、;p>  lv = new LoadingView(this); // 創(chuàng)建讀取進(jìn)度View</p><p>  this.setContentView(lv); // 將屏幕設(shè)為讀取進(jìn)度的LoadingView</p><p>  this.current = lv; // 記錄當(dāng)前View</p><p>  lv.lt.start(); // 啟動(dòng)Loa

112、dingView的刷屏線程</p><p>  new Thread() { // 啟動(dòng)一個(gè)新線程,在其中創(chuàng)建GameView對(duì)象</p><p>  public void run() {</p><p>  if (wantSound) {</p><p>  initSound();// 初始化聲音</p><p&g

113、t;<b>  }</b></p><p><b>  // 創(chuàng)建</b></p><p><b>  // 創(chuàng)建游戲界面</b></p><p>  lv.progress = 100;</p><p>  welcome = null; // 釋放掉WelcomeView&

114、lt;/p><p><b>  }</b></p><p>  }.start();</p><p>  gv = new GameView(FootballActivity.this,</p><p>  imageIDs[welcome.cg.currIndex]);</p><p><b&

115、gt;  }</b></p><p>  } else if (rectQuit.contains(x, y)) { // 按下退出鍵</p><p>  System.exit(0); // 程序退出</p><p>  } else { // 檢查是否按下了修改隊(duì)員站位的加號(hào)和減號(hào)按鈕</p><p>  for (int i

116、 = 0; i < 3; i++) {</p><p>  if (rectPlus[i].contains(x, y)) { // 如果有加號(hào)按鈕點(diǎn)下,就增加對(duì)應(yīng)進(jìn)攻防守線上人數(shù)</p><p>  // 如果有富余的人再加</p><p>  if (welcome.layout[0] + welcome.layout[1]</p><

117、p>  + welcome.layout[2] < 10) {</p><p>  welcome.layout[i]++;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p

118、><p>  if (rectMinus[i].contains(x, y)) {// 如果有減號(hào)按鈕點(diǎn)下,就減少相應(yīng)人數(shù)</p><p>  if (welcome.layout[i] > 0) { // 如果該處人數(shù)不為零,就減少一個(gè)</p><p>  welcome.layout[i]--;</p><p><b>  }

119、</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  } else if

120、(current == gv) { // 如果當(dāng)前顯示的View為GameView</p><p>  if (gv.rectMenu.contains(x, y)) { // 如果點(diǎn)下了菜單按鈕</p><p>  gv.isShowDialog = true; // 設(shè)置顯示對(duì)話框</p><p>  gv.ball.isPlaying = false; //

121、足球停止移動(dòng)</p><p>  pmt.flag = false; // 使PlayerMoveThread空轉(zhuǎn)</p><p>  } else if (gv.rectYesToDialog.contains(x, y)) { // 如果點(diǎn)下的是對(duì)話框中的”是“按鈕</p><p>  if (gv.isShowDialog) { // 檢查對(duì)話框是不是正在顯示

122、</p><p>  welcome = new WelcomeView(this); // 新建一個(gè)WelcomeView</p><p>  setContentView(welcome); // 設(shè)置當(dāng)前屏幕為WelcomeView</p><p>  welcome.status = 3; // 直接設(shè)為待命狀態(tài)</p><p>  

123、current = welcome; // 記錄當(dāng)前屏幕</p><p>  gv = null; // 將GameView指向的對(duì)象聲明為垃圾</p><p>  if (wantSound && mpWelcomeMusic != null) { // 如需要,播放聲音</p><p>  mpWelcomeMusic.start();</

124、p><p><b>  }</b></p><p><b>  }</b></p><p>  } else if (gv.rectNoToDialog.contains(x, y)) { // 如果點(diǎn)下的是對(duì)話框中的”否“按鈕</p><p>  if (gv.isShowDialog) { // 檢

125、查對(duì)話框是不是正在顯示</p><p>  gv.isShowDialog = false; // 不顯示對(duì)話框</p><p>  pmt.flag = true; // 設(shè)置雙方球員可移動(dòng)</p><p>  gv.ball.isPlaying = true; // 設(shè)置足球可移動(dòng)</p><p><b>  }</b&g

126、t;</p><p><b>  }</b></p><p>  } else if (current == lv) { // 如果當(dāng)前屏幕為L(zhǎng)oadingView</p><p>  if (lv.progress == 100) { // 如果進(jìn)度達(dá)到100%</p><p>  setContentView(gv)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論