安卓程序設(shè)計報告_第1頁
安卓程序設(shè)計報告_第2頁
安卓程序設(shè)計報告_第3頁
安卓程序設(shè)計報告_第4頁
安卓程序設(shè)計報告_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

彈球游戲物聯(lián)一班謝鑫20100740123一、實驗?zāi)康恼莆誗wing圖形用戶界面編程以及事件處理等,掌握java繪圖技術(shù)。掌握多線程編程的基本原理,能使用Runnable、ExecutorService等接口進(jìn)行線程的創(chuàng)建、啟動等工作。二、實驗任務(wù)設(shè)計并編程實現(xiàn)彈球游戲:用戶能通過GUI組件指定生成小球的數(shù)量,每個小球?qū)碾S機(jī)的位置出現(xiàn),并具有隨機(jī)顏色,隨機(jī)速度以及隨機(jī)的運動方向,小球沿初始方向勻速運動,當(dāng)碰到窗口邊緣時,小球?qū)⒁罁?jù)受力原理改變運動方向(可簡化考慮,受力只改變小球的運動方向,小球仍按照初始速度勻速運動,且不考慮小球之間的碰撞)。鼠標(biāo)在界面中顯示為方塊狀,玩家需按住鼠標(biāo)來回移動以避開運動的小球及屏幕四周,如果鼠標(biāo)碰到任一小球或者窗口四周,則游戲結(jié)束。程序需提供計時功能,并最終顯示玩家能堅持多少秒。三、設(shè)計思路1.界面設(shè)計(1)制作一個簡單的面板JFrame,文件保存為bollFrame.java其中為一public的類bollFrame,其構(gòu)造方法為: bollFrame(intn){ super();setTitle("我的彈球小游戲"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Dimensiondimension=Toolkit.getDefaultToolkit().getScreenSize();//得到電腦屏幕大小 setSize(450,450); setLocation((dimension.width-game.getWidth())/2-250,(dimension.height-game.getHeight())/2-250);//設(shè)置面板顯示基中; this.n=n; myBollPanel=newbollPanel(n);//構(gòu)造一個畫板; add(myBollPanel);//將畫板放入JFrame createMenu();//創(chuàng)建菜單; setJMenuBar(bar); }(2)構(gòu)造畫板類,文件保存為bollPanel.java其構(gòu)造函數(shù)如下:bollPanel(intn){ this.n=n; //executorThread=Executors.newCachedThreadPool();//創(chuàng)建線程池; mouse=newmouseThread(mxNow,myNow,groupThread,this);//啟動鼠標(biāo)線程; this.setIsOver(false);//游戲開始線程條件的判斷; for(inti=0;i<n;++i){ myBollThread=newbollThread(this); groupThread.add(myBollThread); //executorThread.execute(myBollThread);//小球線程加入線程池; } addMouseListener(this); addMouseMotionListener(this); }Paint()方法如下構(gòu)造:publicvoidpaint(Graphicsg){ if(!this.getIsOver())//如果游戲還沒結(jié)束; { super.paint(g);//清除原先的圖像 g.setColor(Color.RED); g.setFont(newFont("宋體",Font.BOLD+Font.ITALIC,15)); g.drawString("你已堅持:"+getT()+"S",15,15);//計時器的顯示; for(inti=0;i<n;++i){//畫出每個線程球 intxNow=groupThread.get(i).getxNow(); intyNow=groupThread.get(i).getyNow(); g.setColor(groupThread.get(i).getColor()); g.fillOval(xNow,yNow,30,30); if(xNow>(getWidth()-23)||xNow<0){//碰到左右邊界; groupThread.get(i).dx=-groupThread.get(i).dx; } if(yNow>(getHeight()-23)||yNow<0){//碰到上下邊界; groupThread.get(i).dy=-groupThread.get(i).dy; } groupThread.get(i).setxNow(xNow+groupThread.get(i).getdx());//設(shè)置下一個位置; groupThread.get(i).setyNow(yNow+groupThread.get(i).getdy()); } } if(isMouse){ g.drawImage(newImageIcon("boll.gif").getImage(),mxNow,myNow,40,40,this);//鼠標(biāo)的圖像; } }//endpaint();總體界面如下:2.邏輯設(shè)計(1).首先,我們考慮到多個小球的運動,實質(zhì)上是多線程的使用,n個小球我們就同時啟動n個線程去控制每個小球的運動。因此我構(gòu)造出一個類作為一個小球的線程,保存文件為bollThread.java,顧名思義,小球線程類。相關(guān)構(gòu)造方法如下:publicbollThread(bollPanelmy){ this.myPanel=my; xStart=data.nextInt(200);//隨機(jī)產(chǎn)生開始位置; yStart=data.nextInt(200); setxNow(xStart);////設(shè)置現(xiàn)在的位置; setyNow(yStart); setdx();//設(shè)置隨機(jī)方向使用;注意:若不設(shè)置為隨機(jī),則所有小球?qū)⑾嗤粋€方向運動; setdy(); }(2)再次,小球的出現(xiàn)需要有載體,這就是畫板,前面界面設(shè)置中已提到過,通過讓多個小球共享一個畫板,以及通過線程控制小球的重繪,最后通過畫板顯示給用戶。(3)在第(2)點中提到的畫板上我們需要實現(xiàn)鼠標(biāo)的監(jiān)聽,以下給出幾個重要的鼠標(biāo)事件監(jiān)聽:publicvoidmousePressed(MouseEvente){//單擊啟動鼠標(biāo)事件; if(e.getButton()==MouseEvent.BUTTON1){ copy.schedule(newtask(),0,1000);//啟動定時器; for(inti=0;i<n;++i){ Threadmy=newThread(groupThread.get(i)); my.start();//啟動游戲,啟動小球線程; } mxNow=e.getX(); myNow=e.getY(); isMouse=true; if(!mouse.isAlive()){ mouse.start();//啟動鼠標(biāo)線程; } }//endif(e.getButton()==MouseEvent.BUTTON1); }//注意按下鼠標(biāo)開始游戲; publicvoidmouseDragged(MouseEvente){//游戲過程中通過按住鼠標(biāo)左鍵控制“眼睛”的移動來躲避小球; mxNow=e.getX();//TODOAuto-generatedmethodstub myNow=e.getY(); if(mxNow>(this.getWidth()-30)||mxNow<=0||myNow>(this.getHeight()-30)||myNow<=0){//鼠標(biāo)是否碰到邊界; //executorThread.shutdown(); this.setIsOver(true); copy.cancel(); JOptionPane.showMessageDialog(null,"你撞墻了,下次小心點。。。游戲結(jié)束","提示",JOptionPane.OK_OPTION); this.removeMouseListener(this); this.removeMouseMotionListener(this); } for(inti=0;i<n;++i){ intxNow=groupThread.get(i).getxNow(); intyNow=groupThread.get(i).getyNow(); if(isPeng(xNow,yNow,mxNow,myNow)){ //executorThread.shutdown(); this.setIsOver(true); copy.cancel(); JOptionPane.showMessageDialog(null,"if(你撞球了){"+"\n"+"挑戰(zhàn)失敗,游戲結(jié)束.}","提示",JOptionPane.OK_OPTION); //System.exit(0); this.removeMouseListener(this); this.removeMouseMotionListener(this); }//鼠標(biāo)的上下左右邊和球碰撞的情況, } }(4)如果游戲開始后我們突然松開鼠標(biāo),讓我們控制的小球(或"眼睛")停留在最后松開的點上,那么小球碰到它還會判斷是否相撞嗎?答案是可以的,我們可以通過編寫一個鼠標(biāo)線程類來實現(xiàn),保存文件為mouseThread.java;讓此線程在我們按下鼠標(biāo)開始游戲時同時啟動,在我們松開鼠標(biāo)時啟動判斷相撞事件。相關(guān)的構(gòu)造方法如下:mouseThread(intmxNow,intmyNow,List<bollThread>group,bollPanelbollpane){ this.mxNow=mxNow;//傳入鼠標(biāo)現(xiàn)在位置; this.myNow=myNow; this.groupThread=group;//傳入小球線程組; this.bollpane=bollpane;//傳入畫板對象; }程序測試在程序測試中,先后測試出了,以下幾個注意點:在判斷小球與鼠標(biāo)控制的小球(“眼睛”)相撞時,條件中用到兩點之間的距離問題,發(fā)現(xiàn)條件不能是兩點距離剛好等于兩相撞物體半徑和,此條件太苛刻,可能引起判斷的失誤(概率蠻高的呵呵),而應(yīng)該是小于半徑和。.在小球碰撞或控制的小球(”眼睛“)碰到邊界游戲結(jié)束時,已經(jīng)停止了線程,小球竟然還能動,而且是緩慢移動,但是判斷是否碰撞及邊界問題都能正常執(zhí)行,與我所意料的完全相反,到現(xiàn)在也不知道是怎么回事,只能在paint()里進(jìn)行條件判斷,只讓bollPanel留下最后一次的個小球及“眼睛”位置。C.這是最后才調(diào)試出來的,也是這個游戲中較難注意到的。就是一些boolean變量的設(shè)置:privatebooleanisTime;//定時器是否啟動; privatebooleanisGroupThread;//所有小球線程組是否啟動; privatebooleanisMouseThread;//鼠標(biāo)線程是否啟動; privatebooleanisMouse;//鼠標(biāo)事件是否啟動; privatebooleanisOver;//游戲是否結(jié)束;剛開始時并沒有注意到這些,如果我點擊鼠標(biāo)左鍵開始游戲時,啟動了小球線程,這時要設(shè)置變量isGroupThread=true標(biāo)志小球線程組已啟動,釋放鼠標(biāo)啟動鼠標(biāo)線程時,isMouseThread=true讓鼠標(biāo)線程來控制與小球相撞的判斷,定時器也在這時響應(yīng)啟動isTime=true開始計時,若不設(shè)置這些的話,將發(fā)生以下本質(zhì)上的共同錯誤::等我釋放鼠標(biāo)后想再次控制小球,就必須在一次啟動鼠標(biāo)事件,這時將重新啟動一次計時器,重新啟動一次小球線程組,重新啟動鼠標(biāo)線程;這樣的結(jié)果是導(dǎo)致游戲的結(jié)果不確定性,沒碰到小球(實際上已碰撞)它就檢測碰撞結(jié)束游戲。以及計時器的計時紊亂等。具體調(diào)試后的相關(guān)代碼實現(xiàn)見附錄.。五、實驗總結(jié)通過這次的程序設(shè)計,我更加明白了學(xué)以致用的道理,對線程的應(yīng)用使得我更好更快的掌握了線程的本質(zhì),同時,在此次的程序設(shè)計中,經(jīng)過不斷地調(diào)試,是我明白了一個程序或項目要做到“精致”,是是需要花多大的精力和耐心,總之,學(xué)以致用,會將學(xué)到的知識應(yīng)用到實際中才是學(xué)之根本。此次實驗也更了解到了線程的知識,比如:一個線程stop后,不能再用start啟動,而應(yīng)當(dāng)重新實例化,在start()。也就是說線程的狀態(tài)轉(zhuǎn)換過程(新建-就緒-運行-阻塞-死忙)是不可逆的,這是個人理解,至少從本實驗中可以得到驗證。最后,感謝老師的指導(dǎo)和同學(xué)們對我的幫助。附錄以下是調(diào)試后的相關(guān)算法實現(xiàn):A: publicbooleanisPeng(intxNow,intyNow,intmxNow,intmyNow){//利用兩點之間的距離算法,判斷是否撞球 intx1=xNow+15,y1=yNow+15; intx2=mxNow+20,y2=myNow+20; intmulx=x1-x2,muly=y2-y1; doublesum=Math.pow(muly,2)+Math.pow(mulx,2); if(sum<Math.pow(35,2)) returntrue; elsereturnfalse;}B:publicvoidpaint(Graphicsg){ if(!this.getIsOver())//在此判斷游戲是否結(jié)束; { super.paint(g);//清除原先的圖像 g.setColor(Color.RED); g.setFont(newFont("宋體",Font.BOLD+Font.ITALIC,15)); g.drawString("你已堅持:"+getT()+"S",15,15); for(inti=0;i<n;++i){//畫出每個線程球 intxNow=groupThread.get(i).getxNow(); intyNow=groupThread.get(i).getyNow(); g.setColor(groupThread.get(i).getColor()); g.fillOval(xNow,yNow,30,30); if(xNow>(getWidth()-23)||xNow<0){//碰到左右邊界; groupThread.get(i).dx=-groupThread.get(i).dx; } if(yNow>(getHeight()-23)||yNow<0){//碰到上下邊界; groupThread.get(i).dy=-groupThread.get(i).dy; } groupThread.get(i).setxNow(xNow+groupThread.get(i).getdx()); groupThread.get(i).setyNow(yNow+groupThread.get(i).getdy()); } } if(isMouse){ g.drawImage(newImageIcon("boll.gif").getImage(),mxNow,myNow,40,40,this); } }//endpaint();C:(1)publicvoidmousePressed(MouseEvente){//單擊啟動鼠標(biāo)事件; if(e.getButton()==MouseEvent.BUTTON1){ if(isMouseThread){//鼠標(biāo)線程是否活著; mouse.stop(); isMouseThread=false; } if(!isTime){ copy.schedule(newtask(),0,1000);//啟動定時器; isTime=true; } if(!isGroupThread){ for(inti=0;i<n;++i){ Threadmy=newThread(groupThread.get(i)); my.start();//啟動游戲,啟動小球線程; } isGroupThread=true; } mxNow=e.getX(); myNow=e.getY(); isMouse=true; }//endif(e.getButton()==MouseEvent.BUTTON1); }(2) publicvoidmouseReleased(MouseEvente){ //mouse.setmxNow(e.getX()); //mouse.setmyNow(e.getY());//設(shè)置松開點的鼠標(biāo)位置; mxNow=e.getX(); myNow=e.getY(); if(!isMouseThread){ mouse=newmouseThread(mxNow,myNow,groupThread,this);//新建鼠標(biāo)線程;/啟動鼠標(biāo)線程;............................................................................ mouse.start(); isMouseThread=true; } }(3)publicvoidmouseDragged(MouseEvente){ mxNow=e.getX();//TODOAuto-generatedmethodstub myNow=e.getY();

溫馨提示

  • 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

提交評論