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

正文內(nèi)容

畢業(yè)設(shè)計(jì)-基于java的坦克大戰(zhàn)軟件程序設(shè)計(jì)(參考版)

2024-12-08 09:51本頁(yè)面
  

【正文】 Reilly publish, 2021 [7] Wireless Tool Kit, MIDP profile,Sun Micro. [8] Developing Games in Java, David Brackeen, New Riders Publishing [9] Game Architecture and Design, Andrew Rollings、 Dave Morris,Coriolis Group Books [10] [11] [12] [13] Borland Jbuilder9 Help documents,Borland corporation. [14] Creating 2D Action Games with the Game API, Sun 公司網(wǎng)頁(yè)中的Technical Articles and Tips, Jonathan Knudsen ,及其源代碼。 原先認(rèn)為不可能的事,我發(fā)現(xiàn),如果有不畏困難的信心和 肯鉆研的勇氣,就一定會(huì)完成,甚至達(dá)到意想不到的效果。憑著探索新知識(shí)的熱情 ,我選擇了該題目。 成功的游戲融合了三維運(yùn)算、人工智能、 音效處理等計(jì)算機(jī)多媒體的精華部分。 相比一些數(shù)據(jù)庫(kù)軟件,游戲的設(shè)計(jì)有很多人情色彩和藝術(shù)思想的發(fā)揮, 正式商業(yè)的軟件的人性化界面和各個(gè)游戲間迥異的 結(jié)構(gòu)每每會(huì)讓人有去開發(fā)的沖動(dòng)。 大學(xué)期間做過銀 行取款機(jī)、圖書館管理程序等簡(jiǎn)單的數(shù)據(jù)庫(kù)管理系統(tǒng) 的課程設(shè)計(jì) , 思想大致相似,變化范圍有限,沒有太多自己可發(fā)揮的余地。 在數(shù)據(jù)庫(kù)、單片機(jī)、 各種應(yīng)用軟件和游戲中,我仍覺得對(duì)游戲的設(shè)計(jì)有極大的熱情 。雖然大學(xué)期間在 TC++下設(shè)計(jì)過一個(gè)俄羅斯方塊的游戲,并且 經(jīng)過反復(fù)的調(diào)試修改也達(dá)到了一定的精確性,但接手這個(gè)題目時(shí)仍感覺十分棘手。 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í)開的線程比較多,使得本來運(yùn)行效率就不高的 KVM 運(yùn)行異常緩慢。 2. 敵人的人工智能 變化較少,不夠理想 。 本游戲程序?qū)τ诔跎娲祟I(lǐng)域的畢業(yè)設(shè)計(jì)課題來說,尤其在開始初期,感覺邏輯復(fù)雜,難以控制,因此至今還有一些未能解決的 bug。 但 幾乎每一個(gè)計(jì)算機(jī) 程序都會(huì)有這樣那樣的 不足,尤其是 未 經(jīng)過精心維護(hù)的非商業(yè)軟件。 第 四 章 總 結(jié) 本程序 的 總結(jié)和展望 本程序設(shè)計(jì)實(shí)現(xiàn)了手機(jī)上以 J2ME 為平臺(tái)的坦克大戰(zhàn)游戲的開發(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)用。 效果如圖 310,僅停留 4 秒種,供用戶快速參考后便會(huì)跳入下一關(guān)的起始畫面 。 如果通關(guān)或完全死亡后,將提示用戶按 pass按鈕跳過該屏。因此完成的時(shí)間越短,得到的分?jǐn)?shù)就越高。時(shí)間將根據(jù) BattleCanvas 中的 beginTime 的差除以 1000 后取整決定。 由于 ScoreScreen 類繼承了 Canvas,所以必須有 paint()函數(shù)。它將所有數(shù)據(jù)庫(kù)中的數(shù)據(jù)依次讀出,再使用drawString 以固定的格式寫出。并將所有相關(guān)的 InputStream 的繼承類用close()關(guān)閉,以便釋放內(nèi)存資源。 insertRecord()可以將當(dāng)前剛剛得到的最高成績(jī)記錄到數(shù)據(jù)庫(kù)的指定位置,將最后一名排擠出局。其中 () ,score=()將分別讀出用戶名和分?jǐn)?shù),然而前者讀出后并不加以利用,因?yàn)樵诒容^分?jǐn)?shù)的過程中,并不需要用到用戶名。 Score 將被循環(huán)調(diào)用 10 次,將記錄中的 10 個(gè)最高記錄初始化。首先將循環(huán)調(diào)用(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)面。只是用戶看不見而已。如果玩家生命已死亡殆盡,就需要在進(jìn)行以上操作的同時(shí)將玩家坦克的位置放置到 屏幕外的部分。如果沒有和子 彈發(fā)生碰撞,就檢測(cè)是否與敵人碰撞,發(fā)生碰撞時(shí),將敵人從 layerManager 中移除,并置為 null,產(chǎn)生爆炸效果,敵人數(shù)量減少一位,敵人屏幕上數(shù)量減少一位。 這根據(jù)子彈的來源分為兩種情況。 如果擊中了某樣物體,那么 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 就表示沒有擊中任何東西。它標(biāo)識(shí)了該子彈是屬于 玩家的,還是敵人的,這樣可以控制子彈在脫離坦克管束后的運(yùn)行狀態(tài)中的行為。 子彈的 運(yùn)行和 控制 開始 是否出界 是否擊中物體 將可以消除的障礙物消除 玩家的子彈嗎 是否與任何敵人的子彈碰撞 是否擊中任何敵人 敵人的子彈嗎? 是否與玩家的子彈碰撞 是否擊中玩家 結(jié)束 N Y N Y Y N 子彈抵消 Y 消除敵人 Y N N N N N 消除玩家 子彈抵消 圖 49 子彈運(yùn)行的主要功能流程圖 Y Y Y 26 子彈繼承了 Runnable,運(yùn)行在獨(dú)立的線程中。 在運(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)中而無法移出。 因?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。 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 完全通過 每次輸入的鍵盤信號(hào)來做出反映。 其主要功能流程圖見圖 48。 當(dāng)然,在設(shè)置完成后,必須將 將檢測(cè)區(qū)域設(shè)置回原先的狀態(tài),否則敵人在往后自己的檢測(cè)中將發(fā)生錯(cuò)誤。事實(shí)上,敵人坦克此時(shí)并沒有阻礙玩家前進(jìn)。有一點(diǎn)非常重要:在檢測(cè)前,需要將敵人的檢測(cè)矩形區(qū)域設(shè)置為與原來圖片一樣大小。 當(dāng)可以行走時(shí),就在當(dāng)前方向的坐標(biāo)上增加或減少一個(gè)象素。 canPass()檢測(cè)是否有障礙物及是否到邊界。amp。他們可被外部調(diào)用, 以 取得生命值、死亡記數(shù)、重置位置。在 setShootCheck()的參數(shù)中,傳給子彈的是敵人的數(shù)組,子彈的對(duì)象就被確定了。在玩家坦克發(fā)射的子彈中,就必須將攻擊對(duì)象設(shè)置為所有的敵人。子彈一旦開始運(yùn)行,就脫離了當(dāng)前坦克的控制,直到其生命周期終止。 接著使用 append()將子彈貼到 layerManager 上顯示出來。這些都由坦克傳遞給子彈。 當(dāng)開炮時(shí),調(diào)用 BulletSprite 的 setLayerManager()將子彈與 layerManager 聯(lián)系起來。因?yàn)樗械恼系K物中只有草不會(huì)阻礙坦克的向前運(yùn)行。 getTileIndex()將檢測(cè)傳遞來的象素處是什么類型的障礙物,它將象素除以 8(即障礙物的象素寬度 ),取整,再通過 getCell()得到。 canPass()函數(shù)將返回坦克是否能夠向前前進(jìn),考慮到的因素有邊界、障礙物。 為了能提前預(yù)測(cè)碰撞,調(diào)用了 defineCollisionRectangle(0,1,11,12)將碰撞矩形向前設(shè)置了一個(gè)象素,具體原理見第二章。 在transformDirection[]中定義了坦克四個(gè)方向分別應(yīng)將原始圖片旋轉(zhuǎn)的角度,分別為 TRANS_NONE,TRANS_ROT90,TRANS_ROT180,TRANS_ROT270,以便在后來的setTransform()中將這些常量代入。 坦克的共同行為 在 TankSprite 中定義了所有坦克 (包括敵方坦克和玩家坦克 )的共同行為和 23 屬性。在程序中調(diào)用了 getNullEnemyIndex()進(jìn)行測(cè)試,當(dāng)返回為 1 時(shí)說明沒有序號(hào)可以分配,否則,將返回空的序號(hào)。 在每次刷新繪圖頁(yè)面時(shí),應(yīng)使用 GameCanvas 的 flushGraphics()將屏 幕后臺(tái)的緩沖區(qū)內(nèi)的圖象刷新到前臺(tái)來。并反復(fù)使用 Graphics 的 drawLine()、 drawImage()繪畫出一個(gè)三維的效果,增強(qiáng)視覺感。 效果如圖 46所示 。 在檢測(cè)用戶輸入的 input()函數(shù)中,當(dāng)按方向鍵時(shí),玩家坦克就將向不同的方向運(yùn)行,這調(diào)用了UserSprite 的 go()函數(shù) ;當(dāng)開炮時(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ù)的畫面 ,為了進(jìn)入下一關(guān),統(tǒng)計(jì)畫面只是停留四秒,就重新轉(zhuǎn)回 BattleCanvas畫面。每次循環(huán)中將檢測(cè)是否死亡,屏幕上坦克的數(shù)量,是否該過關(guān)統(tǒng)計(jì)分?jǐn)?shù),檢測(cè)用戶輸入的按鍵、重繪整個(gè)屏幕及回收垃圾內(nèi)存 (Garbage Collection)。 構(gòu)造坦克時(shí),將把坦克的 png 圖片作為參數(shù)傳
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1