版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> JAVA設計貪吃蛇游戲</p><p><b> 1.課程設計目的</b></p><p> 《JAVA程序設計》是計算機相關專業(yè)的必修專業(yè)基礎課程,其實踐性、應用性很強。實踐教學環(huán)節(jié)是必不可少的一個重要環(huán)節(jié)。本課程的程序設計專題實際是計算機相關專業(yè)學生學習完《JAVA程序設計》課程后,進行的一次全面的綜合訓練,JAVA程序設計的設計目的是加
2、深對理論教學內容的理解和掌握,使學生較系統(tǒng)地掌握程序設計及其在網(wǎng)絡開發(fā)中的廣泛應用,基本方法及技巧,為學生綜合運用所學知識,利用軟件工程為基礎進行軟件開發(fā)、并在實踐應用方面打下一定基礎。</p><p><b> 2.設計方案論證</b></p><p><b> 2.1設計思路</b></p><p> 貪吃蛇游戲
3、設計與實現(xiàn),主要分為以下二個模塊:游戲主界面模塊和游戲控制模塊。在此只實現(xiàn)游戲的游戲主界面模塊、游戲控制模塊。并且只是實現(xiàn)移動速度、暫停、重新開始等功能。</p><p><b> 游戲主界面模塊:</b></p><p> 游戲的主界面是進入游戲后,能夠給玩家第一感官的部分,主要包括游戲圖形區(qū)域界面、游戲的速度選擇更新界面、新生方塊的預覽、游戲速度控制按鈕、暫停
4、游戲按鈕、重新開始游戲按鈕以及游戲排行榜按鈕。從很大程度上決定了玩家對游戲的興趣問題,因此,游戲的主界面應該力求美觀,爽心悅目。</p><p><b> 游戲控制模塊:</b></p><p> 這個模塊是游戲的中心環(huán)節(jié),主要完成控制游戲的速度、暫停、重新開始等功能。為了能夠給玩家一個很好的游戲環(huán)境,這部分應該做到易懂、易操作。</p><p
5、> 本設計所開發(fā)的是基于Java的一個貪吃蛇游戲軟件,主要實現(xiàn)游戲的速度控制、游戲的暫停、游戲的退出等功能,分為: 游戲主界面模塊、游戲控制模塊以二個模塊。</p><p><b> 性能:</b></p><p> 本軟件在設計方面本著方便、實用及娛樂性高的宗旨,在對界面進行設計的過程中,始終堅持清晰明了,在性能方面能夠實現(xiàn)效率高,不易出錯等優(yōu)點。<
6、;/p><p><b> 2.2概要設計</b></p><p> 2.3.1自定義類說明</p><p> 類名:Exception</p><p> 作用:用來處理當蛇撞到墻或自己的身體時程序的運行</p><p> 繼承的父類:GreedSnake類</p><p&
7、gt;<b> 實現(xiàn)的接口:沒有</b></p><p><b> 2.3詳細設計</b></p><p><b> 2.3.1程序概述</b></p><p> 本程序是一個利用Java應用軟件制作的貪食蛇小游戲。</p><p> 在游戲過程中,用戶通過點擊小鍵盤
8、區(qū)的方向鍵來控制蛇的運行方向;通過Pageup和pagedown鍵來控制蛇的移動速度,每單擊一次,蛇的移動速度改變一次,改變頻率為0.75。游戲運行過程中,如果想暫停,只需要按Space或P鍵即可。重新開始游戲的按鍵為Enter、S或R。當蛇沒有吃到食物且碰到墻壁或自己的身體時游戲結束。</p><p> 本程序的另一個功能是在程序運行窗口的左上角顯示,用戶在游戲過程中所得的分數(shù),不過缺點是無法保存分數(shù)。<
9、;/p><p> 2.4.2程序流程圖</p><p> 本次游戲設計的處理流程如圖1所示。</p><p> 2.3.3 總設計模塊的劃分</p><p> 根據(jù)游戲需求中游戲所要實現(xiàn)的功能,整個游戲分為二個模塊進行具體的設計,如圖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.設計結果與分析</b></p><p> 本程序在運行后,能夠正常的相應按鍵事件。由于程序的主要部分已經(jīng)集成為一個對象SnakeModel,所以利用鍵盤就可以實現(xiàn)操作。蛇前行的過程中,可以任意向其左或右方向改變方向,但按其前進方向和前進的反方向都沒有反應。點擊PageUp, PageDown鍵后,蛇的移動速度會根據(jù)點擊的次數(shù)而改變。每點擊一次,速度的改變頻率為0.75
13、。點擊Space或P鍵后游戲就暫停了。點擊Enter或R或S鍵后系統(tǒng)則重新載入,即游戲重新開始。運行結果如下圖4所示:</p><p> 圖4 程序運行圖 </p><p> 當蛇沒有吃到食物且碰到邊界或碰撞到自己的身體時,游戲結束,此時得分為0。如果想重新開始即按ENTER或S鍵,運行結果如下圖5所示:</p><p><b> 圖5 程序結束圖
14、</b></p><p><b> 程序異常處理</b></p><p> 在蛇的運行線程過程中,當蛇撞到墻或自己的身體時,將拋出一個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> 通過這次課程設計,我對這學期所學的JAVA語言程序設計有一個更深刻的了解,將所
16、學的知識應用于實踐,由于所學知識有限,為了使游戲能夠實現(xiàn)自己預先的構想,我通過上網(wǎng)和去圖書館找程序,比較好的流程圖及功能模塊,不斷閱讀修改代碼使程序達到預期所要實現(xiàn)的目標,完成課程設計后,可以感覺到自己對Java程序的又有了新的認識。</p><p> 在做Java設計之前也有做過其他的課程設計,大多規(guī)模很小。在數(shù)據(jù)庫、各種應用軟件和游戲中,我仍覺得對游戲的設計有極大的熱情。因為其各個模塊間的聯(lián)系十分緊密,代碼
17、重復執(zhí)行率高,當經(jīng)過無數(shù)次的調試、修改后,能最終看到成品,有無比自豪的心情。大學期間做過圖書館管理程序等簡單的數(shù)據(jù)庫管理系統(tǒng)的課程設計,思想大致相似,變化范圍有限,沒有太多自己可發(fā)揮的余地。綜合運用以前所學習的知識,設計一個JAVA手機游戲,并能實現(xiàn)以下的功能:游戲暫停、游戲重新開始、游戲的結束。總之,通過本次的課程設計,使我平時學到的理論知識得到了很好地升華,理論與實際得到一次很好的結合,為我今后參加工作打下了堅實的基礎,使我受益匪淺
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> //設置界面元素 </b></p><p> mainFrame=new JFrame("貪吃蛇游戲"); </p><p> Container cp=mainFrame.getContentPane(); </p><p> labelScore=new JLabel("所得分數(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():繪畫某一結點(蛇身或食物) </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="所得分數(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:結點類 </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():改變運動方向 </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():貪吃蛇運動函數(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);// 在頭部加上一結點 </p><p> //計分規(guī)則與移動長度和速度有關 </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():貪吃蛇運動線程 </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()){// 未結束 </p><p>
72、; gs.repaint(); </p><p><b> } </b></p><p> else{//游戲結束 </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():加快蛇運動速度 </p><p> public void speedUp(){ </p><p> timeInterval*=speedChangeRate; </p><p><b> } </b></p><p> //speedDown():放慢蛇運動速度 </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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java貪吃蛇游戲 課程設計
- java課程設計報告貪吃蛇游戲
- java課程設計貪吃蛇
- java課程設計--貪吃蛇
- 貪吃蛇java課程設計--貪吃蛇程序設計
- java貪吃蛇課程設計報告
- java-課程設計--貪吃蛇
- java課程設計--設計一個貪吃蛇游戲程序
- 基于java的游戲設計——貪吃蛇
- -基于java的貪吃蛇游戲開發(fā)
- 基于java的貪吃蛇游戲開發(fā)
- java貪吃蛇游戲畢業(yè)設計(源代碼+論文)
- qt課程設計--貪吃蛇游戲設計
- -java-j2me貪吃蛇游戲的設計
- c語言貪吃蛇游戲課程設計
- c語言課程設計--貪吃蛇游戲
- 貪吃蛇游戲的實現(xiàn)課程設計
- 貪吃蛇課程設計
- 貪吃蛇課程設計
- 貪吃蛇課程設計
評論
0/150
提交評論