freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于j2me的java游戲坦克大戰(zhàn)的開(kāi)發(fā)畢業(yè)設(shè)計(jì)畢業(yè)設(shè)計(jì)論文(參考版)

2025-06-21 14:48本頁(yè)面
  

【正文】 然而,回首。原先認(rèn)為不可能的事,我發(fā)現(xiàn),如果有不畏困難的信心和肯鉆研的勇氣,就一定會(huì)完成,甚至達(dá)到意想不到的效果?,F(xiàn)在看來(lái)的確是這樣。我原以為這樣的速度將無(wú)法完成畢業(yè)設(shè)計(jì),但當(dāng)掌握了大部分應(yīng)用技巧時(shí),剩下的游戲思路的設(shè)計(jì)就顯得不是最大的障礙了。為了進(jìn)一步探索深層次的技巧,我花費(fèi)了大量時(shí)間在sun的Java主頁(yè)上,閱讀了幾十篇英文的技巧和代碼樣例。在發(fā)覺(jué)中文資料的稀少后,我不得不全篇閱讀midp profile英文函數(shù)庫(kù),并為了日后查找和保留方便,將其中70%的內(nèi)容摘要了部分重要內(nèi)容翻譯在筆記上,形成了論文要求外的10000多字的翻譯內(nèi)容。更為困難的是,J2ME為一種剛出現(xiàn)僅幾年的新技術(shù),國(guó)內(nèi)的參考資料非常少,僅有的幾本也停留在簡(jiǎn)單的介紹階段。在設(shè)計(jì)初期,為了畫(huà)出一個(gè)簡(jiǎn)單的圖形,需要花費(fèi)一天的時(shí)間,為了使圖形產(chǎn)生動(dòng)態(tài)效果又會(huì)花費(fèi)幾天的努力。憑著探索新知識(shí)的熱情,我選擇了該設(shè)計(jì)題目。成功的游戲融合了三維運(yùn)算、人工智能、音效處理等計(jì)算機(jī)多媒體的精華部分。相比一些數(shù)據(jù)庫(kù)軟件,游戲的設(shè)計(jì)有很多人情色彩和藝術(shù)思想的發(fā)揮,正式商業(yè)的軟件的人性化界面和各個(gè)游戲間迥異的結(jié)構(gòu)每每會(huì)讓人有去開(kāi)發(fā)的沖動(dòng)。大學(xué)期間做過(guò)銀行取款機(jī)、圖書(shū)館管理程序等簡(jiǎn)單的數(shù)據(jù)庫(kù)管理系統(tǒng)的課程設(shè)計(jì),思想大致相似,變化范圍有限,沒(méi)有太多自己可發(fā)揮的余地。在數(shù)據(jù)庫(kù)、單片機(jī)、各種應(yīng)用軟件和游戲中,我仍覺(jué)得對(duì)游戲的設(shè)計(jì)有極大的熱情。雖然大學(xué)期間在TC++下設(shè)計(jì)過(guò)一個(gè)俄羅斯方塊的游戲,并且經(jīng)過(guò)反復(fù)的調(diào)試修改也達(dá)到了一定的精確性,但接手這個(gè)題目時(shí)仍感覺(jué)十分棘手。 3. 當(dāng)坦克在草叢中時(shí),對(duì)方坦克發(fā)出的子彈不能將其擊毀。已經(jīng)解決的重要Bug:1. 當(dāng)發(fā)出子彈到達(dá)邊界并同時(shí)還在草叢中時(shí)會(huì)拋出數(shù)組邊界異常。 5. 最好有接寶物的設(shè)置,增強(qiáng)可玩性。 4. 由于每次子彈發(fā)射和每次坦克的移動(dòng)的一個(gè)象素都會(huì)對(duì)所有坦克和所有子彈進(jìn)行一次循環(huán)檢查,并由于同時(shí)開(kāi)的線程比較多,使得本來(lái)運(yùn)行效率就不高的KVM運(yùn)行異常緩慢。 2. 敵人的人工智能變化較少,不夠理想。本游戲程序?qū)τ诔跎娲祟I(lǐng)域的畢業(yè)設(shè)計(jì)課題來(lái)說(shuō),尤其在開(kāi)始初期,感覺(jué)邏輯復(fù)雜,難以控制,因此至今還有一些未能解決的bug。但幾乎每一個(gè)計(jì)算機(jī)程序都會(huì)有這樣那樣的不足,尤其是未經(jīng)過(guò)精心維護(hù)的非商業(yè)軟件。 第五章 總 結(jié) 本程序的總結(jié)和展望 本程序設(shè)計(jì)實(shí)現(xiàn)了手機(jī)上以J2ME為平臺(tái)的坦克大戰(zhàn)游戲的開(kāi)發(fā),采用從外部文件讀取地圖、自動(dòng)控制敵人坦克運(yùn)行的方式進(jìn)行控制,具有一定的可玩性和復(fù)雜性。 本章小結(jié): 第四章中按照相應(yīng)的步驟描述了所有關(guān)鍵類的具體算法實(shí)現(xiàn),引用了相關(guān)函數(shù)進(jìn)行了具體流程的解釋,并對(duì)原理稍復(fù)雜的函數(shù)做了詳細(xì)的分析。這是低級(jí)繪圖屏幕與高級(jí)用戶界面相結(jié)合的一個(gè)應(yīng)用。效果如圖410,僅停留4秒種,供用戶快速參考后便會(huì)跳入下一關(guān)的起始畫(huà)面。圖410 每關(guān)的分?jǐn)?shù)統(tǒng)計(jì)如果通關(guān)或完全死亡后,將提示用戶按pass按鈕跳過(guò)該屏。因此完成的時(shí)間越短,得到的分?jǐn)?shù)就越高。時(shí)間將根據(jù)BattleCanvas中的beginTime的差除以1000后取整決定。由于ScoreScreen類繼承了Canvas,所以必須有paint()函數(shù)。它將所有數(shù)據(jù)庫(kù)中的數(shù)據(jù)依次讀出,再使用drawString以固定的格式寫(xiě)出。并將所有相關(guān)的InputStream的繼承類用close()關(guān)閉,以便釋放內(nèi)存資源。 圖49 分?jǐn)?shù)統(tǒng)計(jì)畫(huà)面insertRecord()可以將當(dāng)前剛剛得到的最高成績(jī)記錄到數(shù)據(jù)庫(kù)的指定位置,將最后一名排擠出局。() ,score=()將分別讀出用戶名和分?jǐn)?shù),然而前者讀出后并不加以利用,因?yàn)樵诒容^分?jǐn)?shù)的過(guò)程中,并不需要用到用戶名。Score將被循環(huán)調(diào)用10次,將記錄中的10個(gè)最高記錄初始化。(NoName) (0),將記錄中的條目的用戶名置為NoName,所有的分?jǐn)?shù)置為0。(score,true)創(chuàng)建一個(gè)名為“score”的數(shù)據(jù)庫(kù)。采用的是手機(jī)專用的一種簡(jiǎn)化的數(shù)據(jù)庫(kù)RMS。因?yàn)樵诎l(fā)炮期間,坦克的再次發(fā)炮的功能是被鎖定的。這將會(huì)是很荒唐的場(chǎng)面。只是用戶看不見(jiàn)而已。如果玩家生命已死亡殆盡,就需要在進(jìn)行以上操作的同時(shí)將玩家坦克的位置放置到屏幕外的部分。如果沒(méi)有和子彈發(fā)生碰撞,就檢測(cè)是否與敵人碰撞,發(fā)生碰撞時(shí),將敵人從layerManager中移除,并置為null,產(chǎn)生爆炸效果,敵人數(shù)量減少一位,敵人屏幕上數(shù)量減少一位。這根據(jù)子彈的來(lái)源分為兩種情況。如果擊中了某樣物體,那么checkHit自然會(huì)處理,子彈的生命周期結(jié)束,以break退出循環(huán)。如果為真,就繼續(xù)檢測(cè)碰撞上了什么樣的物體。此時(shí)ArrayOutOfBoundException異常就會(huì)拋出,程序終止運(yùn)行。在隨后的checkHit(RIGHT)調(diào)用中,它將檢測(cè)它是否在x+3點(diǎn),即160點(diǎn)擊中了某個(gè)障礙物,但是160/8=20。它們反映了象素級(jí)處理的技巧。 (y 171))作為循環(huán)的條件可以控制子彈出界的范圍。 (y =5) amp。 (x =5) amp。 在線程的循環(huán)中while ( (x 155) amp。擊中鋼筋時(shí),將只產(chǎn)生爆炸效果。爆炸效果由tileExplode(x,y)根據(jù)需要爆炸的坐標(biāo)點(diǎn)生成,其中將一個(gè)Sprite圖片在界面上閃現(xiàn)150毫秒。 checkHit(int x,int y)調(diào)用了getTileIndex(x,y)獲取當(dāng)前子彈擊中的是什么障礙物,如果返回了false就表示沒(méi)有擊中任何東西。它標(biāo)識(shí)了該子彈是屬于玩家的,還是敵人的,這樣可以控制子彈在脫離坦克管束后的運(yùn)行狀態(tài)中的行為。 子彈的運(yùn)行和控制 子彈繼承了Runnable,運(yùn)行在獨(dú)立的線程中。開(kāi)始是否出界是否擊中物體將可以消除的障礙物消除玩家的子彈嗎是否與任何敵人的子彈碰撞是否擊中任何敵人敵人的子彈嗎?是否與玩家的子彈碰撞是否擊中玩家結(jié)束NYNYYN子彈抵消Y消除敵人YNNNNN消除玩家子彈抵消圖49 子彈運(yùn)行的主要功能流程圖YYY在運(yùn)行在某個(gè)方向上,當(dāng)確定為canPass時(shí),應(yīng)再檢測(cè)是否為Beginner。其他的隨機(jī)值也應(yīng)當(dāng)重置。發(fā)炮后應(yīng)立即重新賦值給隨機(jī)發(fā)炮數(shù),以便重新倒數(shù)計(jì)算。如果剛出現(xiàn),就直接走一步,具體如何行走將在go()函數(shù)中決定,并且此go()與UserSprite中的有所區(qū)別。(由boolean值destroyed決定)。如果一出現(xiàn),出口就被堵死,顯然,不能永遠(yuǎn)不出現(xiàn),那就應(yīng)采取其他的辦法,否則兩輛坦克將因?yàn)槎继幵谂鲎矤顟B(tài)中而無(wú)法移出。因?yàn)椴恍枰M(jìn)行預(yù)先檢測(cè)。語(yǔ)句將避免檢測(cè)到自己,永遠(yuǎn)返回真。一個(gè)循環(huán)將依據(jù)敵人的序號(hào)查找5次。這樣,它們才可以自動(dòng)檢測(cè)自己是否與同伴發(fā)生了碰撞,以便采取躲避、轉(zhuǎn)向等行動(dòng)。這樣就相當(dāng)于允許在某一個(gè)方向運(yùn)行0~3秒鐘的時(shí)間。 return ((())%4)*50。將他們代入需要使用方向的函數(shù)中就可以使用了。 return (())%4+1。開(kāi)始是否剛出現(xiàn)前進(jìn)Y可否開(kāi)炮開(kāi)炮可否前進(jìn)換向、取隨機(jī)移動(dòng)步數(shù)、隨機(jī)開(kāi)炮倒數(shù)記步數(shù)結(jié)束是否已死亡是否碰撞NYNYNYNN圖48 敵方坦克運(yùn)行流程圖getRandomDirection()以當(dāng)前系統(tǒng)時(shí)間作為種子,調(diào)用了Random類的nextInt()產(chǎn)生一個(gè)隨機(jī)的整數(shù),此整數(shù)取除4的余數(shù)的絕對(duì)值作為隨機(jī)的方向。 setEnemyShootCheck()函數(shù)與UserSprite中的一樣,設(shè)置了攻擊的對(duì)象,并且此函數(shù)將繼續(xù)把參數(shù)傳遞給自身的子彈,以便子彈可以識(shí)別攻擊對(duì)象。因?yàn)閿橙说倪\(yùn)行是自動(dòng)的,需要有設(shè)定的程序讓它可自己控制,而不像UserSprite完全通過(guò)每次輸入的鍵盤(pán)信號(hào)來(lái)做出反映。其主要功能流程圖見(jiàn)圖48。當(dāng)然,在設(shè)置完成后,必須將將檢測(cè)區(qū)域設(shè)置回原先的狀態(tài),否則敵人在往后自己的檢測(cè)中將發(fā)生錯(cuò)誤。事實(shí)上,敵人坦克此時(shí)并沒(méi)有阻礙玩家前進(jìn)。有一點(diǎn)非常重要:在檢測(cè)前,需要將敵人的檢測(cè)矩形區(qū)域設(shè)置為與原來(lái)圖片一樣大小。當(dāng)可以行走時(shí),就在當(dāng)前方向的坐標(biāo)上增加或減少一個(gè)象素。canPass()檢測(cè)是否有障礙物及是否到邊界。amp。他們可被外部調(diào)用,以取得生命值、死亡記數(shù)、重置位置。在setShootCheck()的參數(shù)中,傳給子彈的是敵人的數(shù)組,子彈的對(duì)象就被確定了。在玩家坦克發(fā)射的子彈中,就必須將攻擊對(duì)象設(shè)置為所有的敵人。子彈一旦開(kāi)始運(yùn)行,就脫離了當(dāng)前坦克的控制,直到其生命周期終止。接著使用append()將子彈貼到layerManager上顯示出來(lái)。這些都由坦克傳遞給子彈。當(dāng)開(kāi)炮時(shí),調(diào)用BulletSprite的setLayerManager()將子彈與layerManager聯(lián)系起來(lái)。因?yàn)樗械恼系K物中只有草不會(huì)阻礙坦克的向前運(yùn)行。getTileIndex()將檢測(cè)傳遞來(lái)的象素處是什么類型的障礙物,它將象素除以8(即障礙物的象素寬度),取整,再通過(guò)getCell()得到。canPass()函數(shù)將返回坦克是否能夠向前前進(jìn),考慮到的因素有邊界、障礙物。為了能提前預(yù)測(cè)碰撞,調(diào)用了defineCollisionRectangle(0,1,11,12)將碰撞矩形向前設(shè)置了一個(gè)象素,具體原理見(jiàn)第二章。在transformDirection[]中定義了坦克四個(gè)方向分別應(yīng)將原始圖片旋轉(zhuǎn)的角度,分別為T(mén)RANS_NONE,TRANS_ROT90,TRANS_ROT180,TRANS_ROT270,以便在后來(lái)的setTransform()中將這些常量代入。 坦克的共同行為 在TankSprite中定義了所有坦克(包括敵方坦克和玩家坦克)的共同行為和屬性。在程序中調(diào)用了getNullEnemyIndex()進(jìn)行測(cè)試,當(dāng)返回為1時(shí)說(shuō)明沒(méi)有序號(hào)可以分配,否則,將返回空的序號(hào)。在每次刷新繪圖頁(yè)面時(shí),應(yīng)使用GameCanvas的flushGraphics()將屏幕后臺(tái)的緩沖區(qū)內(nèi)的圖象刷新到前臺(tái)來(lái)。并反復(fù)使用Graphics的drawLine()、drawImage()繪畫(huà)出一個(gè)三維的效果,增強(qiáng)視覺(jué)感。效果如圖46所示。在檢測(cè)用戶輸入圖46 裝載中的畫(huà)面的input()函數(shù)中,當(dāng)按方向鍵時(shí),玩家坦克就將向不同的方向運(yùn)行,這調(diào)用了UserSprite的go()函數(shù);當(dāng)開(kāi)炮時(shí),就調(diào)用其fire()函數(shù),作出相應(yīng)的行為。如果玩家已經(jīng)死亡,就需要使用LayerManager的insert()將gameover字樣插入到最上層,以免被其他物體覆蓋。閃光位置設(shè)置了三處坐標(biāo),由于敵人不能同時(shí)出現(xiàn),便設(shè)置了enemyOutDelay的倒數(shù)計(jì)時(shí),每次屏幕刷新會(huì)減少一次計(jì)數(shù),直到為0時(shí)就準(zhǔn)備一輛坦克。當(dāng)它閃光完畢后,敵人就會(huì)從閃光位置出現(xiàn)。提供新坦克之前,在屏幕上設(shè)置了一個(gè)專用指示的閃光符號(hào),它繼承了Sprite,運(yùn)行在單獨(dú)的線程中。進(jìn)入下一關(guān)時(shí),許多變量需要重新被初始化,如地圖的繪制、敵人出現(xiàn)位置的重置、敵人的數(shù)量、玩家坦克的當(dāng)前位置。接著調(diào)用setCurrent()顯示統(tǒng)計(jì)分?jǐn)?shù)的畫(huà)面,為了進(jìn)入下一關(guān),統(tǒng)計(jì)畫(huà)面只是停留四秒,就重新轉(zhuǎn)回BattleCanvas畫(huà)面。每次循環(huán)中將檢測(cè)是否死亡,屏幕上坦克的數(shù)量,是否該過(guò)關(guān)統(tǒng)計(jì)分?jǐn)?shù),檢測(cè)用戶輸入的按鍵、重繪整個(gè)屏幕及回收垃圾內(nèi)存(Garbage Collection)。構(gòu)造坦克時(shí),將把坦克的png圖片作為參數(shù)傳遞給EnemySprite和UserSprite,BattleCanvas中創(chuàng)建坦克僅調(diào)用createEnemy()和createUser()實(shí)現(xiàn)。本程序設(shè)置為6。為此,地圖必須首先載入。這是很有必要的。地圖文件可用十六進(jìn)制的文本編輯器生成,如本程序使用的Ultraedit。每個(gè)整數(shù)代表一種障礙物。外部文件分別命名為level*.png,利用MIDP中唯一獲取外部文件為程序內(nèi)資源的getResourceAsStream()函數(shù)將地圖文件讀入程序。地圖實(shí)際即為T(mén)iledLayer的一個(gè)對(duì)象,可調(diào)用setCell設(shè)置其具體的圖象格內(nèi)容。還需保存的變量有,游戲開(kāi)始時(shí)間、結(jié)束時(shí)間(用于統(tǒng)計(jì)分?jǐn)?shù))、敵人的總數(shù)、屏幕上敵人的數(shù)量、下一個(gè)敵人需要出現(xiàn)的位置(總共允許在三個(gè)不同的位置出現(xiàn),分別位于屏幕的左、中、右方)、游戲是否已成功結(jié)束或是否已死亡。因此,有必要在其中創(chuàng)立一個(gè)LayerManager的對(duì)象。這兩個(gè)類均在BattleCanvas中建立了對(duì)象,以便進(jìn)行統(tǒng)一調(diào)度。程序中建立了另外的兩個(gè)類,分別表述了敵人坦克和玩家坦克的功能。本程序設(shè)置為20毫秒。它運(yùn)行在獨(dú)立的線程中,以恒定的頻率刷新畫(huà)面。其中,當(dāng)選擇第一項(xiàng)時(shí)將載入正式游戲畫(huà)面BattleCanvas類,第二項(xiàng)將顯示幫助信息(效果如圖43),第三項(xiàng)則是重新顯示與作品和作者相關(guān)的logo畫(huà)面。startChoice繼承了List類,用于顯示列表選項(xiàng),使用其append()函數(shù)可將選項(xiàng)加入到列表中。在設(shè)置好mandlistener后,需要調(diào)用setCommandListener()以將按鈕事件激活。繼承了mandListener的類必須擁有mandAction(),以決定對(duì)按鍵采取什么樣的行為。效果如圖42所示。但是當(dāng)顯示的畫(huà)面元素超過(guò)一屏大小時(shí),將自動(dòng)轉(zhuǎn)換為永久狀態(tài)。Alert對(duì)象用于顯示提示、警告等告之用戶信息的臨時(shí)閃現(xiàn)的屏幕,它可作為setCurrent的參數(shù),提前顯示在最終需要顯示的屏幕前。在startApp()函數(shù)中,隨即調(diào)用了Displable的setCurrent()函數(shù)將當(dāng)前屏幕設(shè)置為startChoice。運(yùn)行畫(huà)面如圖41所示。)、結(jié)束的函數(shù)。它控制著整個(gè)程序的運(yùn)行,并且可以通過(guò)相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。具體算法的代碼實(shí)現(xiàn)和詳細(xì)流程將在下章介紹。圖34 內(nèi)存監(jiān)視器 本章小結(jié): 第三章中介紹了程序的流程、相關(guān)技術(shù)的思想及其在本程序中的應(yīng)用。由于Java語(yǔ)言中,不像許多其他的如C++語(yǔ)言,不需要指定回收函數(shù)中特定不使用的資源,資源回收機(jī)制將自動(dòng)清空無(wú)效變量占用的空間。如圖34,是內(nèi)存跟蹤測(cè)
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1