畢業(yè)設(shè)計論文-Java桌面游戲-植物大戰(zhàn)僵尸_第1頁
畢業(yè)設(shè)計論文-Java桌面游戲-植物大戰(zhàn)僵尸_第2頁
畢業(yè)設(shè)計論文-Java桌面游戲-植物大戰(zhàn)僵尸_第3頁
畢業(yè)設(shè)計論文-Java桌面游戲-植物大戰(zhàn)僵尸_第4頁
畢業(yè)設(shè)計論文-Java桌面游戲-植物大戰(zhàn)僵尸_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

常州工學(xué)院學(xué)士學(xué)位設(shè)計PAGEPAGEPAGE17目錄第一部分設(shè)計方向…………………3一·設(shè)計需求……………3二·課題的相關(guān)資料………………4第二部分設(shè)計說明…………………8一·設(shè)計分析……………8二·設(shè)計過程……………9第三部分設(shè)計成果…………………12一·界面圖片展示………………………12二·界面代碼展示………………………13第四部分結(jié)束語……………………17一·畢業(yè)設(shè)計的歸納和總結(jié)……………17第五部分致謝…………18第六部分參考文獻(xiàn)…………………19

第一部分設(shè)計方向一、設(shè)計需求1.設(shè)計背景:《植物大戰(zhàn)僵尸》是一款益智策略類java小游戲,玩家可以通過自己對各種職業(yè)的了解來種植植物抵抗僵尸,有效地抵擋并且消滅僵尸。不同的僵尸,不同的玩法,大致的游戲內(nèi)容就是:游戲玩家通過控制植物,抵御僵尸的進(jìn)攻,保護(hù)主人的屋子。此游戲?qū)ν婕业拇笾驴简炇切枰凶⒁饬蛯Ω鞣N植物的相互理解及配合,同時玩家也可以在游戲中獲得一些生活中所學(xué)不到戰(zhàn)略思維,及游戲成功時說帶來的滿足感,給自己的生活增添一絲自信。2.設(shè)計界面內(nèi)容:通過玩家對不同植物的選擇,例如向日葵可快速產(chǎn)生陽光,豌豆射手可攻擊敵人等等,來操作游戲,后臺通過調(diào)整時間和參數(shù)達(dá)到前端界面游戲的可玩性。功能類別子功能前端游戲界面素材收集主界面模式選擇進(jìn)入游戲確定關(guān)卡退出游戲內(nèi)素材收集植物陽光僵尸3.技術(shù)要求:前端:Javascript后臺:Servlet 開發(fā)工具:MyEclipse服務(wù)器:Tomcat6.0二、課題的相關(guān)資料主界面:玩家通過冒險模式進(jìn)入游戲,體驗游戲所帶來的樂趣,達(dá)到休閑娛樂的目的。游戲界面:玩家可以通過獲得陽光來種植不同的植物來抵抗僵尸的侵襲。1、豌豆射手耐久:300臨界點:0攻擊:20射程:正前方一整行射擊間隔:1.4秒價格:100陽光冷卻時間:7.5秒2、向日葵耐久:300臨界點:0生產(chǎn)間隔:24秒價格:50陽光冷卻時間:7.5秒3、土豆衛(wèi)士耐久:4000臨界點:0價格:50陽光冷卻時間:30秒4、寒冰射手耐久:300臨界點:0攻擊:20射程:正前方一整行射擊間隔:1.4秒價格:175陽光冷卻時間:7.5秒5.僵尸最普通最常見的僵尸,生命力低,移動速度慢,最多能挨十下豌豆的攻擊攻擊力100/s速度:約4.7s走完一格(此為僵尸普遍速度)第二部分設(shè)計說明一、設(shè)計分析1.游戲背景新世紀(jì)的來臨,面對時代的快速發(fā)展,人們在發(fā)展的同時,周圍的生長環(huán)境日益變差,直到有一天,一群奇特的物種被周圍的環(huán)境所影響,變成一個人們無法接受的事物,他們不斷的入侵人類家園,而人們也不斷的抵抗著,直到有一天,有人發(fā)現(xiàn)這類物種是因為環(huán)境污染導(dǎo)致的基因突變,同時也發(fā)現(xiàn)它們害怕植物,人們這時才意識到植物和環(huán)境的重要性,同時也通過保護(hù)自然環(huán)境、利用這些自然界的植物生產(chǎn)綠色武器來保衛(wèi)家園。2.游戲邏輯(1)僵尸是攻擊方,為了攻擊,防御僵尸,人類通過栽種培植出的各種植物來抵御進(jìn)攻型僵尸的攻擊。植物需要相應(yīng)的陽光值成長。(2)在作戰(zhàn)地點,玩家需要通過種植各種攻擊植物來消滅僵尸,也可以通過種防御植物來阻擋僵尸,還需要太陽花來產(chǎn)生種植需要的陽光。3.僵尸作戰(zhàn)單位(1)普通僵尸。速度(1幀),血限3,毀掉植物需要3s。四、植物作戰(zhàn)單位(1)太陽花。種植需陽光值50,作用:生產(chǎn)種植所需的陽光值,每隔10s生產(chǎn)50點陽光值,不具備攻擊力。(2)碗豆射手。種植需陽光值100,作用:5s發(fā)射一顆炮彈,戰(zhàn)斗值1。(3)寒冰射手。種植需陽光值175,作用:5s發(fā)射一顆炮彈,戰(zhàn)斗值1.(4)土豆衛(wèi)士。種植需陽光值50,作用:抵擋各種僵尸3s,主要用來防御,沒有任何戰(zhàn)斗力。等共5種可供選擇種植的植物。關(guān)卡簡介:所有的僵尸都會參與攻擊,所有的植物也都會參與作戰(zhàn),每次只能選取5種植物參與作戰(zhàn)。5碰撞邏輯說明僵尸會在屏幕的右邊生成,然后緩慢向左邊屏幕移動,如果在僵尸移動的線路上有攻擊型植物,則發(fā)射炮彈。當(dāng)種植的植物或炮彈與僵尸接觸,即當(dāng)他們的坐標(biāo)相同的時候,即為接觸,接觸大小的區(qū)域就是圖片的大小區(qū)域。當(dāng)炮彈與僵尸碰撞之后,炮彈也就會立即消失,同時僵尸生命值的也隨之減少一點。若炮彈未擊中任何僵尸,越出屏幕后也將消失。二、設(shè)計過程1:首先了解植物大戰(zhàn)僵尸含有哪些元素,有陽光,有僵尸,有能種植植物的草坪,有植物。有子彈。我們這里只是進(jìn)行設(shè)計簡單的實現(xiàn)游戲,植物有單發(fā)射手,寒冰射手,櫻桃炸彈。僵尸只有普通僵尸。2:先設(shè)計最簡單的陽光類Sun.java,陽光會從天空掉落和植物生成,從天空掉落的陽光會進(jìn)行掉落運(yùn)動,植物生成的陽光是禁止不動的,所以陽光有一個isStatic是否靜止不動的布爾型標(biāo)識,然后陽光在不是禁止不動的時候y坐標(biāo)要增加就是下落,然后停止。所以在構(gòu)造函數(shù)中隨機(jī)一個目標(biāo)y值,陽光非禁止不動狀態(tài)下y坐標(biāo)不斷增加,當(dāng)?shù)竭_(dá)目標(biāo)y值時候就把狀態(tài)更改為禁止不動,其次陽光有一個消失標(biāo)識,采用Vector動態(tài)數(shù)組存儲陽光對象,繪制時候繪制該動態(tài)數(shù)組的所有陽光對象,如果該陽光的消亡標(biāo)識為真就把該陽光從容器里面進(jìn)行移除,陽光的消亡標(biāo)識有兩種情況下變成真,一是用戶點擊,二是到了一定時間消亡標(biāo)識為真,所以陽光有一個計數(shù)器變量count,然后不斷的自加,當(dāng)?shù)竭_(dá)陽光的消亡時間就讓消亡標(biāo)識為真,其次是用戶點擊了陽光,判斷用戶點到了陽光可以使用java中的Rect對象的contains方法判斷點在矩形范圍內(nèi),用戶點擊屏幕觸摸坐標(biāo)在陽光的矩形范圍就讓消亡標(biāo)識為真。繪制的時候陽光要不斷旋轉(zhuǎn),聲明一個角度變量angle不斷自加然后以陽光的中心點為旋轉(zhuǎn)中心旋轉(zhuǎn)陽光即可。3:接著我們設(shè)計一個草坪類Grass.java,草坪類的作用是用來種植植物,總共有5x9塊草坪,橫9豎5總共45塊草坪,草坪的屬性相對較于簡單,就有一個是否可種植植物的布爾型標(biāo)識,有植物在這塊草坪上就不能進(jìn)行植物種植了,所以聲明一個5x9的二維草坪數(shù)組,然后把草坪坐標(biāo)寬高傳進(jìn)去,其次草坪要有一個編號用來傳遞給植物用于植物鏟除索引出該草坪改變它的是否可種植植物標(biāo)識,草坪的編號對應(yīng)0到44,草坪的繪制方法用草坪的編號值%2除以2的余數(shù)如果是0就繪制藍(lán)色草坪否則繪制綠色草坪,這里我就是直接繪制一個矩形,然后在View的繪制函數(shù)中for循環(huán)繪制所有草坪這樣我們就可以看到藍(lán)綠相間的草坪了,當(dāng)然草坪的方法還沒寫先寫好其他類再接著寫。4:設(shè)計好了草坪我們設(shè)計一個僵尸類Jiangshi.java,僵尸有一個整形變量type代表僵尸的類型,0代表普通僵尸,其次僵尸有一個整形變量hp代表僵尸的血量,然后有一個isMove布爾型標(biāo)識表示僵尸是否可移動,僵尸在碰到植物的時候讓僵尸停止移動即正在吃食物,僵尸與植物的碰撞檢測可用矩形碰撞檢測,java的Rect對象有一個intersect方法用來判斷兩個矩形是否交合用于矩形碰撞檢測。僵尸的移動就是x坐標(biāo)減去一個速度值即可即向左邊移動,依舊使用一個Vector容器來進(jìn)行存儲僵尸,如果僵尸血量為0就從該容器移除僵尸,創(chuàng)建僵尸的時候可以使用一個固定二維數(shù)組,這是一個二維數(shù)組,第一維長度為10代表10波僵尸第二維表示要創(chuàng)建的僵尸,0表示普通僵尸,當(dāng)?shù)竭_(dá)一定的時間就循環(huán)該波數(shù)的數(shù)組長度創(chuàng)建僵尸,然后波數(shù)值增加,比如這里第一波是一個普通僵尸,第二波是兩個普通僵尸,雖然僵尸數(shù)據(jù)是固定的,但是對僵尸出現(xiàn)的位置也要進(jìn)行一下隨機(jī)。5:然后設(shè)計子彈類Zidan.java,子彈依舊有一個整型變量type表示子彈的類型,0表示普通子彈,跟僵尸一樣采用Vector存儲子彈對象,依舊有一個是否消失的標(biāo)識,當(dāng)子彈碰撞到僵尸后或者子彈的x坐標(biāo)大于屏幕右邊就讓消失標(biāo)識為真從容器里面移除子彈,子彈的移動就是x坐標(biāo)增加一個速度往右邊移動。子彈同僵尸一樣有一個列屬性表示該子彈在哪一列,所以子彈與僵尸的列屬性相等的碰撞才視為有效碰撞,碰撞以后取出該子彈類型不同的類型對僵尸造成不同的傷害。6:設(shè)計道具類Daoju.java,道具依舊有一個整形變量type表示道具的類型,0代表鐵鏟,1代表向日葵,2代表單發(fā)豌豆射手,3代表寒冰射手,道具有一個isSelect是否被選中的布爾型屬性,如果被選中就在該區(qū)間繪制一個紅色的邊框,除此道具有一個布爾型變量是否冷卻狀態(tài),表示該道具是否在冷卻中,如果在冷卻中該道具不可使用,另外還需有一個計時器count,如果在冷卻狀態(tài)不斷自加,當(dāng)達(dá)到了該道具的冷卻時間以后把該道具的冷卻狀態(tài)改為假。如果為冷卻狀態(tài)就繪制一個半透明灰色矩形以count作為進(jìn)度值繪制在道具上面。用一個整形變量表示使用該道具所要消耗的陽光,不同的道具消耗不同的陽光值。依舊使用一個Vector容器來存儲道具對象。7:設(shè)計植物類Zhiwu.java,植物也有一個類型type,如果為0代表向日葵,1代表單發(fā)豌豆射手,2代表寒冰射手,也使用一個Vector存儲植物對象,植物也有一個hp表示植物的血量,不同類型的植物有不同的血量,植物有一個編號標(biāo)識表示是在哪塊草坪上,當(dāng)植物hp為0或者鏟除植物時候從Vector進(jìn)行移除該植物,并獲取該植物編號所對應(yīng)的草坪設(shè)置可種植狀態(tài)為真,植物的邏輯處理在不同類型處理不同的邏輯,在陽光狀態(tài)每隔一定時間從陽光容器里面進(jìn)行添加陽光對象,如果是單發(fā)子彈就從子彈容器添加一個子彈對象,如果是雙發(fā)射手就添加兩個子彈對象,可以發(fā)子彈的植物需要封裝一個是否可發(fā)射子彈的方法,每次都讓可發(fā)射子彈的標(biāo)識為假,當(dāng)有僵尸出現(xiàn)在植物的攻擊范圍就是矩形碰撞檢測就讓發(fā)射子彈標(biāo)識為真,如果為真才從容器添加子彈。

第三部分設(shè)計成果一、界面圖片展示二、界面部分代碼展示publicclassController{ privateWinwin; privateGridgrid; privateIndexWinindexwin; privateintx; privateinty; privateintlength=28; privateStringplantType="00111"; privateTimertimer; privateintsunValue; privateintcorpseNum; privatebooleanuproot=false;//斷定能夠挖除植物0可以挖除 privateintoperation=0;//0添加植物1鏟除植物 privateMoneyEnoughThreadmoneyEnoughThread; privateMap<Integer,String>carRunList=newHashMap<Integer,String>(); privateMap<Integer,String>bulletList=newHashMap<Integer,String>(); privateSunAutoProduceThreadsunAutoProduceThread; privateMap<Integer,Plant>plantList=newHashMap<Integer,Plant>(); privateMap<Integer,CarThread>carList=newHashMap<Integer,CarThread>(); privateMap<String,CorpseMoveThread>corpseList=newHashMap<String,CorpseMoveThread>(); privateMap<Integer,ProduceBullet>produceBulletTimer=newHashMap<Integer,ProduceBullet>(); publicController(){ indexwin=newIndexWin(this); } publicvoidstart(){ SunAdd.stop=false; this.x=15; this.y=80; grid=newGrid(this.x,this.y); sunValue=50; win=Win.getWin(this); timer=newTimer(this); //grid.start(); indexwin.setVisible(false); sunAutoProduceThread=newSunAutoProduceThread(this); moneyEnoughThread=newMoneyEnoughThread(this); win.toShow(); putSunValue(0); timer.start(); sunAutoProduceThread.start(); moneyEnoughThread.start(); grid.getBoard()[1][0]="31111"; grid.getBoard()[4][0]="31111"; grid.getBoard()[7][0]="31111"; grid.getBoard()[10][0]="31111"; grid.getBoard()[13][0]="31111"; corpseNum=grid.getNum(); } publicvoidnewCorpseThread(){ for(inti=0;i<grid.getBoard().length;i++){ if("11,12,13,14".contains(grid.getBoard()[i][length-1].substring(0,2))&& corpseList.get(grid.getBoard()[i][length-1])==null){ corpseList.put(grid.getBoard()[i][length-1],newCorpseMoveThread(this,i,length-1)); corpseList.get(grid.getBoard()[i][length-1]).start(); } } } publicintmoveBullet(intx,inty){ if(y+1==length-1&&grid.getBoard()[x][y].equals("21bullet")){ grid.getBoard()[x][y]="00111"; return-1; } if("11,12,13,14".contains(grid.getBoard()[x][y].substring(0,2))){ return-1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& ("01,02,03,04,05".contains(grid.getBoard()[x][y+1].substring(0,2)))){ bulletList.put(100*x+y+1,"21bullet"); grid.getBoard()[x][y]="00111"; returny+1; } if(y+1!=length-1&&("01,02,03,04,05".contains(grid.getBoard()[x][y].substring(0,2)))&& ("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))&&bulletList.get(100*x+y)!=null){ if(isHit(grid.getBoard()[x][y+1])){ grid.getBoard()[x][y+1]="00111"; return-1; } bulletList.remove(100*x+y); returny+1; } if(y+1!=length-1&&("01,02,03,04,05".contains(grid.getBoard()[x][y].substring(0,2)))&& !("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))&&bulletList.get(100*x+y)!=null){ grid.getBoard()[x][y+1]=bulletList.get(100*x+y); bulletList.remove(100*x+y); returny+1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& !("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))){ grid.getBoard()[x][y+1]=grid.getBoard()[x][y]; grid.getBoard()[x][y]="00111"; returny+1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& ("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))){ if(isHit(grid.getBoard()[x][y+1])){ grid.getBoard()[x][y+1]="00111"; return-1; } grid.getBoard()[x][y]="00111"; returny+1; } return-1; } publicintmoveCorpse(intx,inty){ if(y==0&&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ fail(); return-1; } if(y-1!=-1 &&!("01,02,03,04,05".contains(grid.getBoard()[x][y-1].substring(0,2))) &&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ grid.getBoard()[x][y-1]=grid.getBoard()[x][y]; grid.getBoard()[x][y]="00111"; returny-1; } if(y-1!=-1 &&("01,02,03,04,05".contains(grid.getBoard()[x][y-1].substring(0,2))) &&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ plantList.get(x*100+y-1).setHp(plantList.get(x*100+y-1).getHp()-1); if(plantList.get(x*100+y-1)

溫馨提示

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

評論

0/150

提交評論