JAVA吃豆豆項目報告_第1頁
JAVA吃豆豆項目報告_第2頁
JAVA吃豆豆項目報告_第3頁
JAVA吃豆豆項目報告_第4頁
JAVA吃豆豆項目報告_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PINGDINGSHANUNIVERSITY專業(yè)實訓(xùn)(四)項目報告題目:基于JAVA的吃豆豆游戲開發(fā)院(系):軟件學院專業(yè)年級:10級姓名:蘇振鵬學號:101530140指導(dǎo)教師:黃淼2012年6月1日目錄PINGDINGSHANUNIVERSITY 01項目簡介 21.1項目意義 21.2項目說明 21.3關(guān)鍵技術(shù) 32總體設(shè)計 32.1主類設(shè)計 32.2各個模塊的設(shè)計 43詳細設(shè)計與實現(xiàn) 63.1地圖的刷新繪制 63.2地圖路徑與豆豆路徑的生成 73.3碰撞檢測代替的實現(xiàn) 93.4怪物自動路徑的設(shè)置 103.5被怪物追到以及吃到豆豆的檢測 124項目截圖 134.1主界面 134.2游戲積分 144.3游戲失敗 145項目說明 145.1游戲程序打包 146結(jié)論 151項目簡介1.1項目意義 實現(xiàn)小時候PC上經(jīng)典游戲,吃豆子。練習JAVA基礎(chǔ)技能。掌握圖片繪制方法,刷新方法。以及多線程的使用,文件讀取與操作,字符串的分析等諸多技能。完成課程設(shè)計。1.2項目說明 吃豆豆游戲規(guī)則介紹:黃色的是吃豆豆主角,你需要把畫面內(nèi)所有白色的小豆豆都吃掉,而同時又有數(shù)個各種顏色的怪物追殺。如果被怪物追上,代表游戲失敗并結(jié)束。如果吃光了所有白色小豆豆,那么恭喜你,您過關(guān)了。 游戲操作:空格開始游戲,按上下左右鍵控制主角移動方向。1.3關(guān)鍵技術(shù) 本項目采用JAVA編程語言進行開發(fā)。使用JFrame做窗體,Graphice做畫筆繪制圖形。其中關(guān)鍵技術(shù)包括:1、畫面的繪制與更新。2、怪物自動行進路線的設(shè)計。3、吃豆豆方向的控制。4、豆豆被吃掉以及主角被怪物抓到的檢測。5、更新吃豆豆得到的分數(shù)。6、地圖的生成與制作7、地圖集的解析8、碰撞檢測的代替2總體設(shè)計2.1主類設(shè)計主類主類界面類主角類豆豆類怪物類資源類地圖類豆豆路徑類行走路徑類共包含8個類。分別是主類EatBean、界面類Frame、主角類Bean、豆豆類Food、怪物類Monster、資源類StaticValue、豆豆路徑類MakeFood、行走路徑類MakeMap 2.2各個模塊的設(shè)計Frame類: 繼承JFrame類,在paint方法中,實現(xiàn)對界面的繪制,并將界面線繪制到緩存中,再繪制到界面上,避免出現(xiàn)刷新閃爍現(xiàn)象。地圖直接采用背景圖片,無須繪制方式。用了特殊的方法處理了與地圖的碰撞處理。將在隨后的詳細設(shè)計中介紹。 實現(xiàn)KeyListener與Runnable接口。初始化聲明主角、豆豆、怪物類。監(jiān)聽KeyListener中的keyPressed方法,獲取鍵盤上VK_UP、下VK_DOWN、左VK_RIGHT、右VK_LEFT、空格VK_SPACE來開始游戲,并調(diào)用Bean類的控制方法來控制主角的上下左右的行動。Runnable接口中的run方法負責每30毫秒調(diào)用repaint方法重繪地圖,刷界面。 addSoucre方法,當主角吃下一個豆豆的時候調(diào)用改方法。并判定是否吃完所有的豆豆,如果吃完所有豆豆,判斷游戲獲勝,停止怪物的移動。并在游戲界面中心顯示youwin。 gameOver方法,當怪物追到主角的時候,調(diào)用該方法。判定游戲結(jié)束,顯示youlose。 writeMap方法在程序中未被執(zhí)行。是制作地圖的時候需要使用的方法,以保存行走路徑。Bean類: 包含屬性x,y,tx,ty,image,listPonit,listFood,makeMap,monsters等。實現(xiàn)部分屬性的get方法。初始化中,獲取怪物數(shù)組以及食物數(shù)組。 利用left、right、up、down來改變想x,y坐標來實現(xiàn)主角的移動。并講值先賦予tx,ty臨時坐標。檢測tx,ty是否在行動路線坐標集中。如果存在,表明可以移動,則將tx,ty賦予x,y。否則不可移動,對tx,ty進行還原,即不做移動處理。主角將不能移動。 繼承Runnable接口,在run方法中完成對吃食物已經(jīng)被怪物追到的判斷處理。因為3方都是在既定路線中行進。只需判斷是否出現(xiàn)坐標重復(fù)既可,但是為了避免出現(xiàn)相鄰都無事,進行泛判斷。只要在一個很近的距離內(nèi),都會被判斷吃到豆豆貨被怪物追上。如果吃到豆豆,就調(diào)用該對象的dead方法,如果被怪物追上,則調(diào)用自身的dead方法,并調(diào)用Frame類的游戲結(jié)束方法。Food類:包含屬性x,y,life,hasAdd。實現(xiàn)部分屬性的get方法其中dead方法來控制豆豆是否顯示,并且調(diào)用Frame的addSoucer方法,增加游戲積分。利用hasAdd屬性,控制多次調(diào)用dead方法導(dǎo)致積分不正常現(xiàn)象。Monster類:與Bean類相似,不過因為怪物需要自己實現(xiàn)行走,所以沒有外部調(diào)用怪物的方向方法,繼承Runnable接口,在Run方法中實現(xiàn)怪物的自動行走方法。因為在Bean中已經(jīng)實現(xiàn)了追到主角的判斷,所以不需要在Moster中實現(xiàn)該判斷。并且聲明的Moseter較多,使用該方法,造成程序效率稍低。在詳細介紹中會介紹關(guān)于怪物自動尋路的設(shè)計。goon與go方法用來實現(xiàn)怪物的自動行走,自動尋路。MakeFood、MakeMap類:分別獲取目錄下的map.txt和food.txt,并進行解析,分別獲取Point數(shù)組和Food數(shù)組,并返回。StaticVaule類:資源類,將所有圖片資源讀取到BufferedImage中,并設(shè)置為靜態(tài)對象。提供別的類使用3詳細設(shè)計與實現(xiàn)3.1地圖的刷新繪制地圖的刷新在Frame類中完成,F(xiàn)rame類繼承JFrame對象,實現(xiàn)其paint方法。除Food對象外,所有對象均在paint方法中繪制。首先生成創(chuàng)建imgae,獲取image的畫筆Graphics,利用Graphics完成游戲界面的繪制。Food類的繪制,遍歷Food集合,向Food類的paint方法傳入畫筆。繪制背景,主角,怪物。Food對象用自身方法繪制自己。另繪制積分字段,根據(jù)游戲勝利或失敗繪制游戲狀態(tài)。最后講image畫入Frame中,完成界面的繪制過程。Frame繼承了Runnable方法,在其run方法中,每30毫秒,調(diào)用repaint方法,重繪場景,完成地圖場景的刷新。 publicvoidpaint(Graphicsg) { //TODO自動生成方法存根 BufferedImageimage=newBufferedImage(570,720,BufferedImage.TYPE_3BYTE_BGR); Graphicsg2=image.getGraphics(); //繪制主角 g2.drawImage(StaticValue.background,0,25,this); g2.drawImage(bean.getImage(),bean.getX(),bean.getY(),this); //繪制怪物 g2.drawImage(monster1.getImage(),monster1.getX(),monster1.getY(),this); g2.drawImage(monster2.getImage(),monster2.getX(),monster2.getY(),this); g2.drawImage(monster3.getImage(),monster3.getX(),monster3.getY(),this); g2.drawImage(monster4.getImage(),monster4.getX(),monster4.getY(),this); g2.drawImage(monster5.getImage(),monster5.getX(),monster5.getY(),this); g2.drawImage(monster6.getImage(),monster6.getX(),monster6.getY(),this); g2.drawImage(monster7.getImage(),monster7.getX(),monster7.getY(),this); g2.drawImage(monster8.getImage(),monster8.getX(),monster8.getY(),this); //繪制豆豆 Iterator<Food>iterator=listFood.iterator(); while(iterator.hasNext()) { Foodfood=iterator.next(); food.Paint(g2); } //繪制積分 Stringstr="現(xiàn)在的積分:"+source; g2.drawString(str,15,700); //勝利 if(winGame) { Stringstrs="YouWin"; g2.drawString(strs,270,335); } if(loseGame) { Stringstrs="YouLose"; g2.drawString(strs,270,700); } g.drawImage(image,0,0,this); }3.2地圖路徑與豆豆路徑的生成 游戲初始化時,通過初始化對象MakeFood和MakeMap類,讀取目錄下map.txt和food.txt獲取路徑。15:570表示坐標點,-區(qū)分不同的坐標點。 利用字符串的split方法,將每個每個坐標點取出,生成Point對象,并存入ArrayList<Point>,MakeFood中,利用Point對象聲明Food對象,并存入ArrayList<Food>中。Stringmap=newString(buffer); String[]point=map.split("-"); Set<Point>points=newHashSet<Point>(); for(inti=0;i<point.length;i++) { String[]p=point[i].split(":"); if(!p[0].equals("")&&!p[1].equals("")) { intx=Integer.parseInt(p[0]); inty=Integer.parseInt(p[1]); Pointpoint2=newPoint(x,y); points.add(point2); } } Iterator<Point>it=points.iterator(); while(it.hasNext()){ listPoint.add(it.next()); //Set轉(zhuǎn)化List } 該坐標點,是在程序制作初期。利用Frame類中的writeMap方法實現(xiàn)。該方法使得,主角移動路線自動保存下來。在生成地圖路徑的時候,只需要遍歷行走所有主角和怪物規(guī)定可以行走的路線即可。僅僅生成允許行走路線的坐標點。豆豆類的坐標點類似,添加對空格的監(jiān)聽,如果主角行走在該位置,按下空格,變保存這個坐標點。這些坐標點講用于隨后生成豆豆的位置。3.3碰撞檢測代替的實現(xiàn) 該游戲并不對主角進行碰撞檢測,而是使用了替代方法。省去了地圖繪制過程。地圖只需要背景圖片即可,方便繪制各種地圖。利用之前所生成的坐標點集合。主角并不對地圖邊緣進行碰撞檢測。因為之前已經(jīng)將全部可行走路經(jīng)點生成。只需要判斷主角行走路徑是否在該集合內(nèi)即可。只要在集合內(nèi)的坐標點行動,就不會出現(xiàn)和地圖邊緣碰撞的情況,也就不必再做碰撞碰撞檢測。 publicbooleanup() { ty-=5; if(listPoint.contains(newPoint(tx,ty))) { y=ty; }else{ ty+=5; returnfalse; } returntrue; } 主角或怪物移動的時候,先改變tx、ty臨時坐標,判斷臨時坐標是否在坐標集中。如果在,將臨時坐標賦予坐標。否則恢復(fù)臨時坐標,將無法移動。用這種方法替代了傳統(tǒng)的邊緣檢測。3.4怪物自動路徑的設(shè)置 怪物的自動路徑是用隨機變量生成的。怪物的上下左右方法,比主角多了返回值。如果可以繼續(xù)前進,再返回true。如果不能,再返回false。根據(jù)隨機數(shù),讓怪物前進。如果無法繼續(xù)前進,再換方向。隨機數(shù)種子是獲取當前時間做隨機數(shù)種子。因為每個怪物的啟動時間有延遲。所以每個怪物的隨機數(shù)種子不一樣,保證每個怪物的行走路線不一樣。publicvoidrun() { try { Thread.sleep(time*300); }catch(InterruptedExceptione1) { //TODOAuto-generatedcatchblock e1.printStackTrace(); } while(true&&!Frame.winGame) { goon(); try { Thread.sleep(60); }catch(InterruptedExceptione) { //TODOAuto-generatedcatchblock e.printStackTrace(); } } } publicvoidgoon() { Randomrandom; if(!go(go)) { random=newRandom(newjava.util.Date().getTime()+type*10); go=(Math.abs(random.nextInt()))%4; } } publicbooleango(inti) { switch(i) { case0: returnthis.up(); case1: returnthis.down(); case2: returnthis.left(); case3: returnthis.right(); } returntrue; } 繼承Runnable接口,在run方法中,讓怪物不斷調(diào)用goon()方法。以此實現(xiàn)怪物的自動尋走方法。3.5被怪物追到以及吃到豆豆的檢測繼承Runnable接口,在run方法中完成對吃食物已經(jīng)被怪物追到的判斷處理。因為3方都是在既定路線中行進。只需判斷是否出現(xiàn)坐標重復(fù)既可,但是為了避免出現(xiàn)相鄰都無事,進行泛判斷。只要在一個很近的距離內(nèi),都會被判斷吃到豆豆貨被怪物追上。如果吃到豆豆,就調(diào)用該對象的dead方法,如果被怪物追上,則調(diào)用自身的dead方法,并調(diào)用Frame類的游戲結(jié)束方法。 publicvoidrun(){ //TODO自動生成方法存根 while(true) { Iterator<Monster>iterator=monsters.iterator(); Monstermonster; while(iterator.hasNext()) { monster=iterator.next(); if((this.getX()==monster.getX())&&(this.getY()==monster.getY())) dead(); if((this.getX()==monster.getX()+5)&&(this.getY()==monster.getY()+5)) dead(); if((this.getX()==monster.getX()+5)&&(this.getY()==monster.getY()-5)) dead(); if((this.getX()==monster.getX()-5)&&(this.getY()==monster.getY()+5)) dead(); if((this.getX()==monster.getX()-5)&&(this.getY()==monster.getY()-5)) dead(); } Iterator<Food>iterator2=listFood.iterator(); Foodfood; while(iterator2.hasNext()) { food=iterator2.next(); if((this.getX()==food.getX())&&(this.getY()==food.getY())) food.dead(); if((this.getX()==food.getX()+5)&&(this.getY()==food.getY()+5)) food.dead(); if((this.getX()

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論