版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> JAVA設(shè)計貪吃蛇游戲</p><p><b> 1.課程設(shè)計目的</b></p><p> 《JAVA程序設(shè)計》是計算機(jī)相關(guān)專業(yè)的必修專業(yè)基礎(chǔ)課程,其實踐性、應(yīng)用性很強(qiáng)。實踐教學(xué)環(huán)節(jié)是必不可少的一個重要環(huán)節(jié)。本課程的程序設(shè)計專題實際是計算機(jī)相關(guān)專業(yè)學(xué)生學(xué)習(xí)完《JAVA程序設(shè)計》課程后,進(jìn)行的一次全面的綜合訓(xùn)練,JAVA程序設(shè)計的設(shè)計目的是加
2、深對理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較系統(tǒng)地掌握程序設(shè)計及其在網(wǎng)絡(luò)開發(fā)中的廣泛應(yīng)用,基本方法及技巧,為學(xué)生綜合運(yùn)用所學(xué)知識,利用軟件工程為基礎(chǔ)進(jìn)行軟件開發(fā)、并在實踐應(yīng)用方面打下一定基礎(chǔ)。</p><p><b> 2.設(shè)計方案論證</b></p><p><b> 2.1設(shè)計思路</b></p><p> 貪吃蛇游戲
3、設(shè)計與實現(xiàn),主要分為以下二個模塊:游戲主界面模塊和游戲控制模塊。在此只實現(xiàn)游戲的游戲主界面模塊、游戲控制模塊。并且只是實現(xiàn)移動速度、暫停、重新開始等功能。</p><p><b> 游戲主界面模塊:</b></p><p> 游戲的主界面是進(jìn)入游戲后,能夠給玩家第一感官的部分,主要包括游戲圖形區(qū)域界面、游戲的速度選擇更新界面、新生方塊的預(yù)覽、游戲速度控制按鈕、暫停
4、游戲按鈕、重新開始游戲按鈕以及游戲排行榜按鈕。從很大程度上決定了玩家對游戲的興趣問題,因此,游戲的主界面應(yīng)該力求美觀,爽心悅目。</p><p><b> 游戲控制模塊:</b></p><p> 這個模塊是游戲的中心環(huán)節(jié),主要完成控制游戲的速度、暫停、重新開始等功能。為了能夠給玩家一個很好的游戲環(huán)境,這部分應(yīng)該做到易懂、易操作。</p><p
5、> 本設(shè)計所開發(fā)的是基于Java的一個貪吃蛇游戲軟件,主要實現(xiàn)游戲的速度控制、游戲的暫停、游戲的退出等功能,分為: 游戲主界面模塊、游戲控制模塊以二個模塊。</p><p><b> 性能:</b></p><p> 本軟件在設(shè)計方面本著方便、實用及娛樂性高的宗旨,在對界面進(jìn)行設(shè)計的過程中,始終堅持清晰明了,在性能方面能夠?qū)崿F(xiàn)效率高,不易出錯等優(yōu)點。<
6、;/p><p><b> 2.2概要設(shè)計</b></p><p> 2.3.1自定義類說明</p><p> 類名:Exception</p><p> 作用:用來處理當(dāng)蛇撞到墻或自己的身體時程序的運(yùn)行</p><p> 繼承的父類:GreedSnake類</p><p&
7、gt;<b> 實現(xiàn)的接口:沒有</b></p><p><b> 2.3詳細(xì)設(shè)計</b></p><p><b> 2.3.1程序概述</b></p><p> 本程序是一個利用Java應(yīng)用軟件制作的貪食蛇小游戲。</p><p> 在游戲過程中,用戶通過點擊小鍵盤
8、區(qū)的方向鍵來控制蛇的運(yùn)行方向;通過Pageup和pagedown鍵來控制蛇的移動速度,每單擊一次,蛇的移動速度改變一次,改變頻率為0.75。游戲運(yùn)行過程中,如果想暫停,只需要按Space或P鍵即可。重新開始游戲的按鍵為Enter、S或R。當(dāng)蛇沒有吃到食物且碰到墻壁或自己的身體時游戲結(jié)束。</p><p> 本程序的另一個功能是在程序運(yùn)行窗口的左上角顯示,用戶在游戲過程中所得的分?jǐn)?shù),不過缺點是無法保存分?jǐn)?shù)。<
9、;/p><p> 2.4.2程序流程圖</p><p> 本次游戲設(shè)計的處理流程如圖1所示。</p><p> 2.3.3 總設(shè)計模塊的劃分</p><p> 根據(jù)游戲需求中游戲所要實現(xiàn)的功能,整個游戲分為二個模塊進(jìn)行具體的設(shè)計,如圖2所示。</p><p> 游戲控制模塊的主要框架如圖3所示。</p>
10、;<p> 游戲移動速度功能控制:點擊“PageUp, PageDown”按鈕,蛇的移動速度就會改變,每點擊一次,速度的改變頻率為0.75。</p><p> 游戲暫??刂疲狐c擊“Space或P暫停游戲”按鈕,游戲暫停;再單擊,游戲繼續(xù)。</p><p> 游戲重新開始控制:點擊“Enter、S或R”鍵后,系統(tǒng)圖重新載入,即游戲重新開始。</p><
11、p> 2.3.4類、方法、屬性說明</p><p><b> ?。?)成員變量</b></p><p> 表1 主要成員變量(屬性)</p><p><b> ?。?)方法</b></p><p><b> 表2 主要方法</b></p><p&
12、gt;<b> 3.設(shè)計結(jié)果與分析</b></p><p> 本程序在運(yùn)行后,能夠正常的相應(yīng)按鍵事件。由于程序的主要部分已經(jīng)集成為一個對象SnakeModel,所以利用鍵盤就可以實現(xiàn)操作。蛇前行的過程中,可以任意向其左或右方向改變方向,但按其前進(jìn)方向和前進(jìn)的反方向都沒有反應(yīng)。點擊PageUp, PageDown鍵后,蛇的移動速度會根據(jù)點擊的次數(shù)而改變。每點擊一次,速度的改變頻率為0.75
13、。點擊Space或P鍵后游戲就暫停了。點擊Enter或R或S鍵后系統(tǒng)則重新載入,即游戲重新開始。運(yùn)行結(jié)果如下圖4所示:</p><p> 圖4 程序運(yùn)行圖 </p><p> 當(dāng)蛇沒有吃到食物且碰到邊界或碰撞到自己的身體時,游戲結(jié)束,此時得分為0。如果想重新開始即按ENTER或S鍵,運(yùn)行結(jié)果如下圖5所示:</p><p><b> 圖5 程序結(jié)束圖
14、</b></p><p><b> 程序異常處理</b></p><p> 在蛇的運(yùn)行線程過程中,當(dāng)蛇撞到墻或自己的身體時,將拋出一個Exception類的異常對象,然后使用try-catch去捕捉這個異常,</p><p><b> 異常的處理如下:</b></p><p>
15、try{ Thread.sleep(timeInterval); }catch(Exception e) { break; </p><p><b> }</b></p><p><b> 4.心得體會</b></p><p> 通過這次課程設(shè)計,我對這學(xué)期所學(xué)的JAVA語言程序設(shè)計有一個更深刻的了解,將所
16、學(xué)的知識應(yīng)用于實踐,由于所學(xué)知識有限,為了使游戲能夠?qū)崿F(xiàn)自己預(yù)先的構(gòu)想,我通過上網(wǎng)和去圖書館找程序,比較好的流程圖及功能模塊,不斷閱讀修改代碼使程序達(dá)到預(yù)期所要實現(xiàn)的目標(biāo),完成課程設(shè)計后,可以感覺到自己對Java程序的又有了新的認(rèn)識。</p><p> 在做Java設(shè)計之前也有做過其他的課程設(shè)計,大多規(guī)模很小。在數(shù)據(jù)庫、各種應(yīng)用軟件和游戲中,我仍覺得對游戲的設(shè)計有極大的熱情。因為其各個模塊間的聯(lián)系十分緊密,代碼
17、重復(fù)執(zhí)行率高,當(dāng)經(jīng)過無數(shù)次的調(diào)試、修改后,能最終看到成品,有無比自豪的心情。大學(xué)期間做過圖書館管理程序等簡單的數(shù)據(jù)庫管理系統(tǒng)的課程設(shè)計,思想大致相似,變化范圍有限,沒有太多自己可發(fā)揮的余地。綜合運(yùn)用以前所學(xué)習(xí)的知識,設(shè)計一個JAVA手機(jī)游戲,并能實現(xiàn)以下的功能:游戲暫停、游戲重新開始、游戲的結(jié)束??傊ㄟ^本次的課程設(shè)計,使我平時學(xué)到的理論知識得到了很好地升華,理論與實際得到一次很好的結(jié)合,為我今后參加工作打下了堅實的基礎(chǔ),使我受益匪淺
18、。</p><p><b> 5.附錄</b></p><p> import java.awt.*; </p><p> import java.awt.event.*; </p><p> import javax.swing.*; </p><p> import java.uti
19、l.*; </p><p> //Main Class </p><p> public class GreedSnake extends KeyAdapter{ </p><p> JFrame mainFrame; </p><p> Canvas paintCanvas; </p><p> JLabe
20、l labelScore;//計分牌 </p><p> SnakeModel snakeModel=null;// 蛇 </p><p> public static final int DEFAULT_WIDTH=500; </p><p> public static final int DEFAULT_HEIGHT=300; </p>&
21、lt;p> public static final int nodeWidth=10; </p><p> public static final int nodeHeight=10; </p><p> //GreedSnake():初始化游戲界面 </p><p> public GreedSnake(){ </p><p>
22、;<b> //設(shè)置界面元素 </b></p><p> mainFrame=new JFrame("貪吃蛇游戲"); </p><p> Container cp=mainFrame.getContentPane(); </p><p> labelScore=new JLabel("所得分?jǐn)?shù)為:&quo
23、t;,JLabel.CENTER); </p><p> cp.add(labelScore,BorderLayout.NORTH); </p><p> paintCanvas=new Canvas(); </p><p> paintCanvas.setSize(DEFAULT_WIDTH+1,DEFAULT_HEIGHT+1); </p>
24、<p> paintCanvas.addKeyListener(this); </p><p> cp.add(paintCanvas,BorderLayout.CENTER); </p><p> JPanel panelButtom=new JPanel(); </p><p> panelButtom.setLayout(new Border
25、Layout()); </p><p> JLabel labelHelp;// 幫助信息 </p><p> labelHelp=new JLabel("按 PageUP 或 PageDown 鍵改變速度",JLabel.CENTER); </p><p> panelButtom.add(labelHelp,BorderLayout.N
26、ORTH); </p><p> labelHelp=new JLabel("按 Enter 或 S 鍵重新開始游戲",JLabel.CENTER); </p><p> panelButtom.add(labelHelp,BorderLayout.CENTER); </p><p> labelHelp=new JLabel("
27、按 SPACE 鍵或 P 鍵暫停游戲",JLabel.CENTER); </p><p> panelButtom.add(labelHelp,BorderLayout.SOUTH); </p><p> cp.add(panelButtom,BorderLayout.SOUTH); </p><p> mainFrame.addKeyListene
28、r(this); </p><p> mainFrame.pack(); </p><p> mainFrame.setResizable(false); </p><p> mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); </p><p> mainFrame.se
29、tVisible(true); </p><p><b> begin(); </b></p><p><b> } </b></p><p> //keyPressed():按鍵檢測 </p><p> public void keyPressed(KeyEvent e){ </p&
30、gt;<p> int keyCode=e.getKeyCode(); </p><p> if(snakeModel.running) </p><p> switch(keyCode){ </p><p> case KeyEvent.VK_UP: </p><p> snakeModel.changeDirect
31、ion(SnakeModel.UP); </p><p><b> break; </b></p><p> case KeyEvent.VK_DOWN: </p><p> snakeModel.changeDirection(SnakeModel.DOWN); </p><p><b> break
32、; </b></p><p> case KeyEvent.VK_LEFT: </p><p> snakeModel.changeDirection(SnakeModel.LEFT); </p><p><b> break; </b></p><p> case KeyEvent.VK_RIGHT
33、: </p><p> snakeModel.changeDirection(SnakeModel.RIGHT); </p><p><b> break; </b></p><p> case KeyEvent.VK_ADD: </p><p> case KeyEvent.VK_PAGE_UP: </p
34、><p> snakeModel.speedUp();// 加速 </p><p><b> break; </b></p><p> case KeyEvent.VK_SUBTRACT: </p><p> case KeyEvent.VK_PAGE_DOWN: </p><p> sna
35、keModel.speedDown();// 減速 </p><p><b> break; </b></p><p> case KeyEvent.VK_SPACE: </p><p> case KeyEvent.VK_P: </p><p> snakeModel.changePauseState();//
36、 暫停或繼續(xù) </p><p><b> break; </b></p><p><b> default: </b></p><p><b> } </b></p><p><b> //重新開始 </b></p><p>
37、; if(keyCode==KeyEvent.VK_S || keyCode==KeyEvent.VK_ENTER){ </p><p> snakeModel.running=false; </p><p><b> begin(); </b></p><p><b> } </b></p><
38、;p><b> } </b></p><p> //repaint():繪制游戲界面(包括蛇和食物) </p><p> void repaint(){ </p><p> Graphics g=paintCanvas.getGraphics(); </p><p> //draw background
39、</p><p> g.setColor(Color.LIGHT_GRAY); </p><p> g.fillRect(0,0,DEFAULT_WIDTH,DEFAULT_HEIGHT); </p><p> //draw the snake </p><p> g.setColor(Color.BLACK); </p>
40、<p> LinkedList na=snakeModel.nodeArray; </p><p> Iterator it=na.iterator(); </p><p> while(it.hasNext()){ </p><p> Node n=(Node)it.next(); </p><p> drawNod
41、e(g,n); </p><p><b> } </b></p><p> // draw the food </p><p> g.setColor(Color.RED); </p><p> Node n=snakeModel.food; </p><p> drawNode(g,n
42、); </p><p> updateScore(); </p><p><b> } </b></p><p> //drawNode():繪畫某一結(jié)點(蛇身或食物) </p><p> private void drawNode(Graphics g,Node n){ </p><p>
43、; g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1); </p><p><b> } </b></p><p> //updateScore():改變計分牌 </p><p> public void updateScore(){ </p>
44、<p> String s="所得分?jǐn)?shù)為: "+snakeModel.score; </p><p> labelScore.setText(s); </p><p><b> } </b></p><p> //begin():游戲開始,放置貪吃蛇 </p><p> void
45、 begin(){ </p><p> if(snakeModel==null||!snakeModel.running){ </p><p> snakeModel=new SnakeModel(this,DEFAULT_WIDTH/nodeWidth, </p><p> DEFAULT_HEIGHT/nodeHeight); </p>&l
46、t;p> (new Thread(snakeModel)).start(); </p><p><b> } </b></p><p><b> } </b></p><p> //main():主函數(shù) </p><p> public static void main(String
47、[] args){ </p><p> GreedSnake gs=new GreedSnake(); </p><p><b> } </b></p><p><b> } </b></p><p> //Node:結(jié)點類 </p><p> class Node
48、{ </p><p><b> int x; </b></p><p><b> int y; </b></p><p> Node(int x,int y){ </p><p> this.x=x; </p><p> this.y=y; </p>
49、<p><b> } </b></p><p><b> } </b></p><p> //SnakeModel:貪吃蛇模型 </p><p> class SnakeModel implements Runnable{ </p><p> GreedSnake gs; <
50、;/p><p> boolean[][] matrix;// 界面數(shù)據(jù)保存在數(shù)組里 </p><p> LinkedList nodeArray=new LinkedList(); </p><p> Node food; </p><p> int maxX;//最大寬度 </p><p> int maxY;
51、//最大長度 </p><p> int direction=2;//方向 </p><p> boolean running=false; </p><p> int timeInterval=200;// 間隔時間(速度) </p><p> double speedChangeRate=0.75;// 速度改變程度 </p
52、><p> boolean paused=false;// 游戲狀態(tài) </p><p> int score=0; </p><p> int countMove=0; </p><p> // UP和DOWN是偶數(shù),RIGHT和LEFT是奇數(shù) </p><p> public static final int
53、UP=2; </p><p> public static final int DOWN=4; </p><p> public static final int LEFT=1; </p><p> public static final int RIGHT=3; </p><p> //GreedModel():初始化界面 <
54、/p><p> public SnakeModel(GreedSnake gs,int maxX,int maxY){ </p><p> this.gs=gs; </p><p> this.maxX=maxX; </p><p> this.maxY=maxY; </p><p> matrix=new bo
55、olean[maxX][]; </p><p> for(int i=0;i<maxX;++i){ </p><p> matrix[i]=new boolean[maxY]; </p><p> Arrays.fill(matrix[i],false);// 沒有蛇和食物的地區(qū)置false </p><p><b>
56、 } </b></p><p><b> //初始化貪吃蛇 </b></p><p> int initArrayLength=maxX>20 ? 10 : maxX/2; </p><p> for(int i=0;i<initArrayLength;++i){ </p><p> in
57、t x=maxX/2+i; </p><p> int y=maxY/2; </p><p> nodeArray.addLast(new Node(x,y)); </p><p> matrix[x][y]=true;// 蛇身處置true </p><p><b> } </b></p><
58、;p> food=createFood(); </p><p> matrix[food.x][food.y]=true;// 食物處置true </p><p><b> } </b></p><p> //changeDirection():改變運(yùn)動方向 </p><p> public void c
59、hangeDirection(int newDirection){ </p><p> if(direction%2!=newDirection%2){// 避免沖突 </p><p> direction=newDirection; </p><p><b> } </b></p><p><b>
60、} </b></p><p> //moveOn():貪吃蛇運(yùn)動函數(shù) </p><p> public boolean moveOn(){ </p><p> Node n=(Node)nodeArray.getFirst(); </p><p> int x=n.x; </p><p> int
61、 y=n.y; </p><p> switch(direction){ </p><p><b> case UP: </b></p><p><b> y--; </b></p><p><b> break; </b></p><p>
62、case DOWN: </p><p><b> y++; </b></p><p><b> break; </b></p><p> case LEFT: </p><p><b> x--; </b></p><p><b>
63、break; </b></p><p> case RIGHT: </p><p><b> x++; </b></p><p><b> break; </b></p><p><b> } </b></p><p> if((0
64、<=x&&x<maxX)&&(0<=y&&y<maxY)){ </p><p> if(matrix[x][y]){// 吃到食物或者撞到身體 </p><p> if(x==food.x&&y==food.y){// 吃到食物 </p><p> nodeArray.ad
65、dFirst(food);// 在頭部加上一結(jié)點 </p><p> //計分規(guī)則與移動長度和速度有關(guān) </p><p> int scoreGet=(10000-200*countMove)/timeInterval; </p><p> score+=scoreGet>0 ? scoreGet : 10; </p><p>
66、 countMove=0; </p><p> food=createFood(); </p><p> matrix[food.x][food.y]=true; </p><p> return true; </p><p><b> } </b></p><p> else retu
67、rn false;// 撞到身體 </p><p><b> } </b></p><p> else{//什么都沒有碰到 </p><p> nodeArray.addFirst(new Node(x,y));// 加上頭部 </p><p> matrix[x][y]=true; </p>&l
68、t;p> n=(Node)nodeArray.removeLast();// 去掉尾部 </p><p> matrix[n.x][n.y]=false; </p><p> countMove++; </p><p> return true; </p><p><b> } </b></p>
69、;<p><b> } </b></p><p> return false;//越界(撞到墻壁) </p><p><b> } </b></p><p> //run():貪吃蛇運(yùn)動線程 </p><p> public void run(){ </p>&
70、lt;p> running=true; </p><p> while(running){ </p><p><b> try{ </b></p><p> Thread.sleep(timeInterval); </p><p><b> } </b></p><
71、;p> catch(Exception e){ </p><p><b> break; </b></p><p><b> } </b></p><p> if(!paused){ </p><p> if(moveOn()){// 未結(jié)束 </p><p>
72、; gs.repaint(); </p><p><b> } </b></p><p> else{//游戲結(jié)束 </p><p> JOptionPane.showMessageDialog(null,"GAME OVER", </p><p> "Game Over"
73、;,JOptionPane.INFORMATION_MESSAGE); </p><p><b> break; </b></p><p><b> } </b></p><p><b> } </b></p><p><b> } </b><
74、;/p><p> running=false; </p><p><b> } </b></p><p> //createFood():生成食物及放置地點 </p><p> private Node createFood(){ </p><p><b> int x=0; &l
75、t;/b></p><p><b> int y=0; </b></p><p><b> do{ </b></p><p> Random r=new Random(); </p><p> x=r.nextInt(maxX); </p><p> y=r.
76、nextInt(maxY); </p><p><b> } </b></p><p> while(matrix[x][y]); </p><p> return new Node(x,y); </p><p><b> } </b></p><p> //spe
77、edUp():加快蛇運(yùn)動速度 </p><p> public void speedUp(){ </p><p> timeInterval*=speedChangeRate; </p><p><b> } </b></p><p> //speedDown():放慢蛇運(yùn)動速度 </p><
78、p> public void speedDown(){ </p><p> timeInterval/=speedChangeRate; </p><p><b> } </b></p><p> //changePauseState(): 改變游戲狀態(tài)(暫?;蚶^續(xù)) </p><p> public v
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java貪吃蛇游戲 課程設(shè)計
- java課程設(shè)計報告貪吃蛇游戲
- java課程設(shè)計貪吃蛇
- java課程設(shè)計--貪吃蛇
- 貪吃蛇java課程設(shè)計--貪吃蛇程序設(shè)計
- java貪吃蛇課程設(shè)計報告
- java-課程設(shè)計--貪吃蛇
- java課程設(shè)計--設(shè)計一個貪吃蛇游戲程序
- 基于java的游戲設(shè)計——貪吃蛇
- -基于java的貪吃蛇游戲開發(fā)
- 基于java的貪吃蛇游戲開發(fā)
- java貪吃蛇游戲畢業(yè)設(shè)計(源代碼+論文)
- qt課程設(shè)計--貪吃蛇游戲設(shè)計
- -java-j2me貪吃蛇游戲的設(shè)計
- c語言貪吃蛇游戲課程設(shè)計
- c語言課程設(shè)計--貪吃蛇游戲
- 貪吃蛇游戲的實現(xiàn)課程設(shè)計
- 貪吃蛇課程設(shè)計
- 貪吃蛇課程設(shè)計
- 貪吃蛇課程設(shè)計
評論
0/150
提交評論