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

正文內(nèi)容

畢業(yè)設(shè)計(jì)-基于java的坦克大戰(zhàn)軟件程序設(shè)計(jì)(編輯修改稿)

2025-01-09 09:51 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 amp。=et.y+20) { return true。 } if(+30=amp。amp。+30=+30amp。amp。+20=amp。amp。+20=+20) { return true。 } } } } 15 break。 case 2: //坦克向下 //取出所有的敵人坦克 for(int i=0。i()。i++) { //取出第一個(gè)坦克 EnemyTank et=(i)。 //如果不是自己 if(et!=this) { //如果敵人的方向是向下或者向上 if(==0||==2) { //我的左點(diǎn) if(=amp。amp。=+20amp。amp。+30=amp。amp。+30=et.y+30) { return true。 } //我的右點(diǎn) if(+20=amp。amp。+20=+20amp。amp。+30=amp。amp。+30=+30) { return true。 } } if(==3||==1) { if(=amp。amp。=+30amp。amp。+30=amp。amp。+30=et.y+20) { return true。 } 16 if(+20=amp。amp。+20=+30amp。amp。+30=amp。amp。+30=+20) { return true。 } } } } break。 case 3: //向左 //取出所有的敵人坦克 for(int i=0。i()。i++) { //取出第一個(gè)坦克 EnemyTank et=(i)。 //如果不是自己 if(et!=this) { //如果敵人的方向是向下或者向上 if(==0||==2) { //我的上一點(diǎn) if(=amp。amp。=+20amp。amp。=amp。amp。=+30) { return true。 } //下一點(diǎn) if(=amp。amp。=+20amp。amp。+20=amp。amp。+20=et.y+30) { return true。 } 17 } if(==3||==1) { //上一點(diǎn) if(=amp。amp。=+30amp。amp。=amp。amp。=+20) { return true。 } if(=amp。amp。=+30amp。amp。+20=amp。amp。+20=et.y+20) { return true。 } } } } break。 } return b。 } 子彈的運(yùn)行和控制 每一個(gè)坦克都有他自己的一顆子彈,這顆子彈在任何一輛坦克被畫(huà)出 時(shí)就一直存在,直至此坦克生命結(jié)束 時(shí)也隨著結(jié)束 , 它是一個(gè)繼承了 Runnable 類(lèi)的 可運(yùn)行單獨(dú)線程的對(duì)象。 在其出現(xiàn)在屏幕上的運(yùn)行周期中,每一步都需要循環(huán)檢測(cè)以下條件: 是否與某坦克發(fā)生了碰撞,即擊中了這輛坦克。 子彈的擊中又 分為兩種情況,如果此子彈來(lái)自于敵方,將只檢測(cè)玩家坦克,因?yàn)閿撤街g的子彈必須允許可以透明的穿過(guò),以保證不會(huì)在敵人之間發(fā)生子彈的消減。 如果來(lái)自玩家,則每一步需掃描所有的敵方坦克,檢查是否發(fā)生碰撞, 以便使擊中的坦克消 失。 其次,子彈之間需要檢測(cè)是否碰撞。敵人之間顯然,上 面 已經(jīng)提過(guò),不需要檢測(cè),但敵人與玩家之間應(yīng)當(dāng)可以互相消除子彈,以便在狹窄的路口中仍有存活 18 的機(jī)會(huì)。 玩家的子彈需要在每一步檢測(cè)所有敵人的子彈的運(yùn)行狀態(tài)。 最后 子彈對(duì)不同障礙物將有不同的反映。對(duì)磚墻將有能力將其擊毀, 使之在畫(huà)面上消失;對(duì)水泥鋼筋將不能發(fā)生作用,子彈也不能通過(guò); 對(duì)于河流,坦克不可以通過(guò),但子彈可以;對(duì)于草叢,子彈和坦克都可以通過(guò)。 玩家成績(jī)的記錄 任何一個(gè)游戲都會(huì)對(duì)玩家的玩耍記錄有所保存,坦克大戰(zhàn)也不例外 ,我們既需要記錄下玩家消滅的坦克數(shù)量 ,還要對(duì)游戲的進(jìn)程進(jìn)行存檔,假如玩家突然有事情需要去處理但又不想放棄該局游戲,那就必須有存檔的功能。具體程序如下: else if(().equals(exit)) { //用戶(hù)點(diǎn)擊了退出系統(tǒng)的菜單 //保存擊毀敵人數(shù)量 . ()。 (0)。 }//對(duì)存盤(pán)退出做處理 else if(().equals(saveExit)) { (111)。 (=+())。 //工作 Recorder rd=new Recorder()。 ()。 //保存擊毀敵人的數(shù)量和敵人的坐標(biāo) ()。 //退出 (0)。 游戲面板與菜單的 設(shè)計(jì) 一個(gè)基本的游戲必須要有自己的運(yùn)行菜單,最起碼的功能要有 開(kāi)始新游戲 ,退出游戲 , 存盤(pán)退出游戲 , 繼續(xù)上局游戲 。具體程序如下: //創(chuàng)建菜單及菜單選項(xiàng) jmb=new JMenuBar()。 jm1 =new JMenu(游戲 (G))。 //設(shè)置快捷方式 (39。G39。)。 jmil =new JMenuItem(開(kāi)始新游戲 (N))。 19 jmi2 =new JMenuItem(退出游戲 (E))。 jmi3 =new JMenuItem(存盤(pán)退出游戲 (C))。 jmi4 =new JMenuItem(繼續(xù)上局游戲 (S))。 //注冊(cè)監(jiān)聽(tīng) (this)。 (continueGame)。 //注冊(cè)監(jiān)聽(tīng) (this)。 (saveExit)。 (this)。 (exit)。 (39。E39。)。 //對(duì) jmil 相應(yīng) (this)。 (newgame)。 (jmil)。 (jmi2)。 (jmi3)。 (jmi4)。 (jm1)。 msp=new MyStartPanel()。 Thread t=new Thread(msp)。 ()。 第 三 章 程序 分析和具體實(shí)現(xiàn) 游戲進(jìn)入前的面板設(shè)計(jì)分析 每個(gè) MIDlet 程序都必須有一個(gè)主類(lèi),該類(lèi)必須繼承自 MIDlet。它控制著整 20 個(gè)程序的運(yùn)行,并且可以通過(guò)相應(yīng)函數(shù)從程序描述 文件中獲取相關(guān)的信息。該類(lèi)中擁有可以管理程序的創(chuàng)建、開(kāi)始、暫停、 結(jié)束的函數(shù)。 游戲運(yùn)行 時(shí),首先載入畫(huà)面的不是游戲運(yùn)行狀態(tài),而是提供選項(xiàng),當(dāng)再次選擇 開(kāi)始新游戲 時(shí)才正式運(yùn)行。運(yùn)行畫(huà)面如圖所示。 因此,在 TankMain 的構(gòu)造函數(shù)中分配了 StartChoice 類(lèi),即選項(xiàng)畫(huà)面的內(nèi)存空間 。在 startApp()函數(shù)中 , 隨即調(diào)用了 Displable 的 setCurrent()函數(shù)將當(dāng)前屏幕設(shè)置為 startChoice。在顯示高級(jí)用戶(hù)界面前,建造了一個(gè) Alert 類(lèi)。Alert 對(duì)象用于顯示提示、警告等告之用戶(hù)信息的臨時(shí)閃現(xiàn)的屏幕,它可作為setCurrent的參數(shù),提前顯示在最終需要顯示的屏幕前。 當(dāng)將 FOREVER作為 Alert的參數(shù)時(shí),將永久顯示,直到用戶(hù)點(diǎn)擊相應(yīng)按鈕 手動(dòng)結(jié)束。但是當(dāng)顯示的畫(huà)面元素超過(guò)一屏大小時(shí),將自動(dòng) 轉(zhuǎn)換為永久狀態(tài)。在此,由于貼在 Alert 上的圖片大小超出了其范圍,故已成為永久狀態(tài)。 效果如圖 32所示。 startChoice 繼承了接口 mandListener, 這樣,就可以使用高級(jí)界面的Command 按鈕。 繼承了 mandListener 的類(lèi)必須擁有 mandAction(),以決定對(duì)按鍵采取什么樣的行為。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。 在設(shè)置好mandlistener 后,需要調(diào)用 setCommandListener()以將按鈕事件激活 。 鍵盤(pán)事件中,可用 getCommandType()返回的 Command 類(lèi)型來(lái)確定選擇的是什么按鈕。 startChoice 繼承了 List 類(lèi),用于顯示列表選項(xiàng),使用其 append()函數(shù)可將選項(xiàng)加入到列表中。 getSelectIndex()可檢測(cè)到選擇的項(xiàng)目的序號(hào),序號(hào)從 0開(kāi)始遞增。 其中,當(dāng)選擇第一項(xiàng)時(shí)將載入正式游戲畫(huà)面 BattleCanvas 類(lèi),第二項(xiàng)將顯示幫助信息 , 第三項(xiàng)則是重新顯示 與作品和作者相關(guān)的 logo 畫(huà)面。 21 主游戲 邏輯 及其涉及到的若干類(lèi) BattleCanvas 主管著所有類(lèi)之間的協(xié)調(diào),決定何時(shí)死亡,何時(shí)分配新的敵人,及控制 敵人出現(xiàn)處的閃光圖標(biāo)、游戲結(jié)束后的動(dòng)態(tài) Gameover 字樣。 它運(yùn)行在獨(dú)立的線程中,以恒定的頻率刷新畫(huà)面。 刷新速度需大于 30/秒才能使畫(huà)面顯示因人眼的暫時(shí)停留效應(yīng)流暢運(yùn)行。 本程序設(shè)置為 20毫秒。 其主邏輯如圖 44所示。 程序中建立了另外的兩個(gè)類(lèi),分別表述了敵人坦克和玩家坦克的功能。它們分別為: EnemySprite 和 UserSprite。這兩個(gè)類(lèi)均在 BattleCanvas 中建立了對(duì)象,以便進(jìn)行統(tǒng)一調(diào)度。 BattleCanvas 包括了 LayerManager,這樣所有靜態(tài)和動(dòng)態(tài)的圖象都不需要手動(dòng)刷新,只需要在 LayerManager 中加入所有的需控制的元素,再統(tǒng)一由 LayerManager 刷新即可。因此,有必要在其中創(chuàng)立一個(gè)LayerManager 的對(duì)象。 其他,如 Sprite 類(lèi)的 gameover 字樣、記分統(tǒng)計(jì)畫(huà)面也都需在此主邏輯中建立相應(yīng)對(duì)象。 還需保存的變量有,游戲開(kāi)始時(shí)間、結(jié)束時(shí)間(用于統(tǒng)計(jì)分?jǐn)?shù))、敵人的總數(shù)、屏幕上敵人的數(shù)量、下一個(gè)敵人需要出現(xiàn)的位置(總共允許在三個(gè)不同的位置出現(xiàn),分別位于屏幕的左、中、右方)、游戲是否已成功結(jié)束或是否已死亡 。 構(gòu)造函數(shù)中,需初始化地圖。地圖實(shí)際即為 TiledLayer 的一個(gè)對(duì)象,可調(diào)用 setCell 設(shè)置其具體的圖象格內(nèi)容。 地圖由外部文件讀入。外部文件分別命名為 level*.png,利用 MIDP 中唯一獲取外部文件為程序內(nèi)資源的getResourceAsStream()函數(shù)將地圖文件讀入程序。在創(chuàng)建了 InputStream 類(lèi)的map 對(duì)象后,使用 read()函數(shù)可將流中的下一個(gè)字節(jié)讀出,并返回此字節(jié)代表的整數(shù)。每個(gè)整數(shù)代表一種障礙物。 用二維循環(huán)將讀出的每個(gè)整數(shù),通過(guò) setCell()將整幅地圖畫(huà)出即可。 地圖文件可用十六進(jìn)制的文本編輯器生成,如本程序使用的 Ultraedit。 繪出地圖后,可用 LayerManager 的 append()將地圖放置在第一層。這是很有必要的。因?yàn)榈貓D上的障礙物之一 —— 草,在坦克運(yùn)行中時(shí)是必須處于坦克的上層
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1