版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 一、設計任務書</b></p><p> ?。ㄒ唬┱n程設計的目的與任務 </p><p> 課程設計是課程教學中的一項重要內(nèi)容,是完成教學計劃達到教學目標的重要環(huán)節(jié),是教學計劃中綜合性較強的實踐教學環(huán)節(jié),它對幫助學生全面牢固地掌握課堂教學內(nèi)容、培養(yǎng)學生的實踐和實際動手能力、提高學生全面素質(zhì)具有很重要的意義?!禞ava語言程序設計》是一
2、門實用性和實踐性都很強的課程,課程設計環(huán)節(jié)應占有更加重要的地位。</p><p> 本課程設計的目的和任務,是通過學生用Java語言設計一個完整的應用程序,使學生綜合應用所學知識完成軟件的分析、設計、調(diào)試和總結(jié),可加深和鞏固對理論教學和實驗教學內(nèi)容的掌握,使學生進一步掌握使用面向?qū)ο蠹夹g(shù)開發(fā)完整系統(tǒng)的方法。</p><p> (二)本課程設計的基本理論</p><p
3、> 本課程設計基于面向?qū)ο蟪绦蛟O計思想,從面向?qū)ο蟮木幊碳夹g(shù)入手,涉及圖形用戶界面設計、異常處理、輸入輸出等知識點,是Java語言程序設計課程的一個綜合應用。</p><p> ?。ㄈ┱n程設計的方式與基本要求</p><p><b> 1. 課程設計方式</b></p><p> 課程設計的題目應提前兩周布置給學生,每2-3人為1
4、組,每組可以從給定的選題表中選擇一個題目,以便學生作好充分準備。1周的課程設計主要分成以下幾個階段: </p><p> (1)系統(tǒng)分析與設計</p><p> (2)在前期資料查閱的基礎(chǔ)上,學生對所選的課題進行功能分析與設計,并與指導老師進行充分的溝通。</p><p> (3)程序編制與調(diào)試</p><p> (4)學生在指導老師
5、的指導下獨立完成程序的編制與調(diào)試,指導老師應實時考察學生的實際編程與調(diào)試能力。</p><p><b> (5)總結(jié)報告</b></p><p> (6)最終提交完整的設計文檔、源代碼和可執(zhí)行文件。學生根據(jù)規(guī)定的課程設計報告格式撰寫設計報告與總結(jié)。</p><p> (7)答辯與考核階段</p><p> (8)
6、指導教師對每位學生進行當面提問,學生以語言表達和實際操作的方式進行答辯。指導教師將綜合每一學生1周的表現(xiàn)及能力進行綜合評分。</p><p><b> 2.基本要求</b></p><p> (1)設計的軟件系統(tǒng)要實現(xiàn)題目要求的功能。</p><p> (2)整個課程設計的各個環(huán)節(jié)都要求學生自己動手。</p><p&g
7、t; (3)要求學生熟練掌握Java語言設計一個完整的應用程序的設計方法和步驟(軟件的分析、設計、調(diào)試和總結(jié))。</p><p> (4)對課程設計進行總結(jié),撰寫課程設計報告;</p><p><b> 二、程序功能簡介</b></p><p> 能夠顯示貪吃蛇的運動,回車、R、S是開始,空格、P是暫停。能夠通過鍵盤上的上下左右鍵,控制
8、貪吃蛇的移動方向。當吃到食物時,蛇就自動長大一格,并且獲得一分;當蛇撞墻或撞到自己就結(jié)束游戲。結(jié)束后能顯示獲得分數(shù)。</p><p><b> 三、系統(tǒng)設計</b></p><p><b> ?。ㄒ唬┰O計分析</b></p><p><b> 要點分析:</b></p><p&
9、gt; ?。?)數(shù)據(jù)結(jié)構(gòu):matrix[][]用來存儲地圖上面的信息,如果什么也沒有設置為false,如果有食物或蛇,設置為true;nodeArray,一個LinkedList,用來保存蛇的每一節(jié);food用來保存食物的位置;而Node類是保存每個位置的信息。</p><p><b> ?。?)重要函數(shù):</b></p><p> changeDirection(
10、int newDirection) ,用來改變蛇前進的方向,而且只是保存頭部的前進方向,因為其他的前進方向已經(jīng)用位置來指明了。 其中newDirection必須和原來的direction不是相反方向,所以相反方向的值用了同樣的奇偶性。在測試的時候使用了direction%2!=newDirection%2 進行判斷。moveOn(),用來更新蛇的位置,對于當前方向,把頭部位置進行相應改變。如果越界,結(jié)束;否則,檢測是否遇到食物(加頭部)
11、或身體(結(jié)束);如果什么都沒有,加上頭部,去掉尾部。由于用了LinkedList數(shù)據(jù)結(jié)構(gòu),省去了相當多的麻煩。</p><p><b> (二)程序代碼</b></p><p> 文件名:SnakeModel.java</p><p> package sy;</p><p> import java.awt.*
12、;</p><p> import java.awt.event.*;</p><p> import javax.swing.*;</p><p> import java.util.*;</p><p> public class GreedSnake implements KeyListener</p><p
13、><b> {</b></p><p> JFrame mainFrame;</p><p> Canvas paintCanvas;</p><p> JLabel labelScore;//計分牌</p><p> SnakeModel snakeModel=null;// 蛇</p>
14、<p> public static final int canvasWidth=200;</p><p> public static final int canvasHeight=300;</p><p> public static final int nodeWidth=10;</p><p> public static final in
15、t nodeHeight=10;</p><p> //GreedSnake():初始化游戲界面</p><p> public GreedSnake()</p><p><b> {</b></p><p><b> //設置界面元素</b></p><p> m
16、ainFrame=new JFrame("GreedSnake");</p><p> Container cp=mainFrame.getContentPane();</p><p> labelScore=new JLabel("Score:");</p><p> cp.add(labelScore,BorderL
17、ayout.NORTH);</p><p> paintCanvas=new Canvas();</p><p> paintCanvas.setSize(canvasWidth+1,canvasHeight+1);</p><p> paintCanvas.addKeyListener(this);</p><p> cp.add(
18、paintCanvas,BorderLayout.CENTER);</p><p> JPanel panelButtom=new JPanel();</p><p> panelButtom.setLayout(new BorderLayout());</p><p> JLabel labelHelp;// 幫助信息</p><p>
19、; labelHelp=new JLabel("PageUp, PageDown for speed:",JLabel.CENTER);</p><p> panelButtom.add(labelHelp,BorderLayout.NORTH);</p><p> labelHelp=new JLabel("ENTER or R or S for st
20、art;",JLabel.CENTER);</p><p> panelButtom.add(labelHelp,BorderLayout.CENTER);</p><p> labelHelp=new JLabel("SPACE or P for pause",JLabel.CENTER);</p><p> panelButt
21、om.add(labelHelp,BorderLayout.SOUTH);</p><p> cp.add(panelButtom,BorderLayout.SOUTH);</p><p> mainFrame.addKeyListener(this);</p><p> mainFrame.pack();</p><p> main
22、Frame.setResizable(false);</p><p> mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p><p> mainFrame.setVisible(true);</p><p><b> begin();</b></p>&l
23、t;p><b> }</b></p><p> //keyPressed():按鍵檢測</p><p> public void keyPressed(KeyEvent e)</p><p><b> {</b></p><p> int keyCode=e.getKeyCode()
24、;</p><p> if(snakeModel.running) switch(keyCode)</p><p><b> {</b></p><p> case KeyEvent.VK_UP:</p><p> snakeModel.changeDirection(SnakeModel.UP);</p&
25、gt;<p><b> break;</b></p><p> case KeyEvent.VK_DOWN:</p><p> snakeModel.changeDirection(SnakeModel.DOWN);</p><p><b> break;</b></p><p&g
26、t; case KeyEvent.VK_LEFT:</p><p> snakeModel.changeDirection(SnakeModel.LEFT);</p><p><b> break;</b></p><p> case KeyEvent.VK_RIGHT:</p><p> snakeModel
27、.changeDirection(SnakeModel.RIGHT);</p><p><b> break;</b></p><p> case KeyEvent.VK_ADD:</p><p> case KeyEvent.VK_PAGE_UP:</p><p> snakeModel.speedUp();/
28、/ 加速</p><p><b> break;</b></p><p> case KeyEvent.VK_SUBTRACT:</p><p> case KeyEvent.VK_PAGE_DOWN:</p><p> snakeModel.speedDown();// 減速</p><p&
29、gt;<b> break;</b></p><p> case KeyEvent.VK_SPACE:</p><p> case KeyEvent.VK_P:</p><p> snakeModel.changePauseState();// 暫?;蚶^續(xù)</p><p><b> break;<
30、;/b></p><p><b> default:</b></p><p><b> }</b></p><p><b> //重新開始</b></p><p> if(keyCode==KeyEvent.VK_R || keyCode==KeyEvent.VK
31、_S</p><p> || keyCode==KeyEvent.VK_ENTER)</p><p><b> {</b></p><p> snakeModel.running=false;</p><p><b> begin();</b></p><p><
32、;b> }</b></p><p><b> }</b></p><p> //keyReleased():空函數(shù)</p><p> public void keyReleased(KeyEvent e)</p><p><b> {</b></p><
33、;p><b> }</b></p><p> //keyTyped():空函數(shù)</p><p> public void keyTyped(KeyEvent e)</p><p><b> {</b></p><p><b> }</b></p>
34、<p> //repaint():繪制游戲界面(包括蛇和食物)</p><p> void repaint()</p><p><b> {</b></p><p> Graphics g=paintCanvas.getGraphics();</p><p> //draw background<
35、;/p><p> g.setColor(Color.WHITE);</p><p> g.fillRect(0,0,canvasWidth,canvasHeight);</p><p> //draw the snake</p><p> g.setColor(Color.BLACK);</p><p> Lin
36、kedList na=snakeModel.nodeArray;</p><p> Iterator it=na.iterator();</p><p> while(it.hasNext())</p><p><b> {</b></p><p> Node n=(Node)it.next();</p&g
37、t;<p> drawNode(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&
38、gt; drawNode(g,n);</p><p> updateScore();</p><p><b> }</b></p><p> //drawNode():繪畫某一結(jié)點(蛇身或食物)</p><p> private void drawNode(Graphics g,Node n)</p>
39、;<p><b> {</b></p><p> g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);</p><p><b> }</b></p><p> //updateScore():改變計分牌</p>
40、<p> public void updateScore()</p><p><b> {</b></p><p> String s="Score:"+snakeModel.score;</p><p> labelScore.setText(s);</p><p><b
41、> }</b></p><p> //begin():游戲開始,放置貪吃蛇</p><p> void begin()</p><p><b> {</b></p><p> if(snakeModel==null||!snakeModel.running)</p><p&
42、gt;<b> {</b></p><p> snakeModel=new SnakeModel(this,canvasWidth/nodeWidth,</p><p> this.canvasHeight/nodeHeight);</p><p> (new Thread(snakeModel)).start();</p>
43、<p><b> }</b></p><p><b> }</b></p><p> //main():主函數(shù)</p><p> public static void main(String[] args)</p><p><b> {</b></
44、p><p> GreedSnake gs=new GreedSnake();</p><p><b> }</b></p><p><b> }</b></p><p> //Node:結(jié)點類</p><p> class Node</p><p&g
45、t;<b> {</b></p><p><b> int x;</b></p><p><b> int y;</b></p><p> Node(int x,int y)</p><p><b> {</b></p><p
46、><b> this.x=x;</b></p><p><b> this.y=y;</b></p><p><b> }</b></p><p><b> }</b></p><p> //SnakeModel:貪吃蛇模型</p&g
47、t;<p> class SnakeModel implements Runnable</p><p><b> {</b></p><p> GreedSnake gs;</p><p> boolean[][] matrix;// 界面數(shù)據(jù)保存在數(shù)組里</p><p> LinkedList
48、nodeArray=new LinkedList();</p><p> Node food;</p><p> int maxX;//最大寬度</p><p> int maxY;//最大長度</p><p> int direction=2;//方向</p><p> boolean running=fa
49、lse;</p><p> int timeInterval=200;// 間隔時間(速度)</p><p> double speedChangeRate=0.75;// 速度改變程度</p><p> boolean paused=false;// 游戲狀態(tài)</p><p> int score=0;</p><
50、;p> int countMove=0;</p><p> // UP和DOWN是偶數(shù),RIGHT和LEFT是奇數(shù)</p><p> public static final int UP=2;</p><p> public static final int DOWN=4;</p><p> public static fin
51、al int LEFT=1;</p><p> public static final int RIGHT=3;</p><p> //GreedModel():初始化界面</p><p> public SnakeModel(GreedSnake gs,int maxX,int maxY)</p><p><b> {&l
52、t;/b></p><p> this.gs=gs;</p><p> this.maxX=maxX;</p><p> this.maxY=maxY;</p><p> matrix=new boolean[maxX][];</p><p> for(int i=0;i<maxX;++i)<
53、;/p><p><b> {</b></p><p> matrix[i]=new boolean[maxY];</p><p> Arrays.fill(matrix[i],false);// 沒有蛇和食物的地區(qū)置false</p><p><b> }</b></p><
54、p><b> //初始化貪吃蛇</b></p><p> int initArrayLength=maxX>20 ? 10 : maxX/2;</p><p> for(int i=0;i<initArrayLength;++i)</p><p><b> {</b></p><
55、;p> int 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>
56、<p> food=createFood();</p><p> matrix[food.x][food.y]=true;// 食物處置true</p><p><b> }</b></p><p> //changeDirection():改變運動方向</p><p> public void
57、changeDirection(int newDirection)</p><p><b> {</b></p><p> if(direction%2!=newDirection%2)// 避免沖突</p><p><b> {</b></p><p> direction=newDire
58、ction;</p><p><b> }</b></p><p><b> }</b></p><p> //moveOn():貪吃蛇運動函數(shù)</p><p> public boolean moveOn()</p><p><b> {</b&g
59、t;</p><p> Node n=(Node)nodeArray.getFirst();</p><p> int x=n.x;</p><p> int y=n.y;</p><p> switch(direction)</p><p><b> {</b></p>
60、<p><b> case UP:</b></p><p><b> y--;</b></p><p><b> break;</b></p><p> case DOWN:</p><p><b> y++;</b></p>
61、;<p><b> break;</b></p><p> case LEFT:</p><p><b> x--;</b></p><p><b> break;</b></p><p> case RIGHT:</p><p>
62、;<b> x++;</b></p><p><b> break;</b></p><p><b> }</b></p><p> if((0<=x&&x<maxX)&&(0<=y&&y<maxY))</p>
63、<p><b> {</b></p><p> if(matrix[x][y])// 吃到食物或者撞到身體</p><p><b> {</b></p><p> if(x==food.x&&y==food.y)// 吃到食物</p><p><b>
64、 {</b></p><p> nodeArray.addFirst(food);// 在頭部加上一結(jié)點</p><p> //計分規(guī)則與移動長度和速度有關(guān)</p><p> int scoreGet=(10000-200*countMove)/timeInterval;</p><p> score+=scoreGet
65、>0 ? scoreGet : 10;</p><p> countMove=0;</p><p> food=createFood();</p><p> matrix[food.x][food.y]=true;</p><p> return true;</p><p><b> }<
66、;/b></p><p> else return false;// 撞到身體</p><p><b> }</b></p><p> else//什么都沒有碰到</p><p><b> {</b></p><p> nodeArray.addFirst(n
67、ew Node(x,y));// 加上頭部</p><p> matrix[x][y]=true;</p><p> n=(Node)nodeArray.removeLast();// 去掉尾部</p><p> matrix[n.x][n.y]=false;</p><p> countMove++;</p><
68、p> return true;</p><p><b> }</b></p><p><b> }</b></p><p> return false;//越界(撞到墻壁)</p><p><b> }</b></p><p> //r
69、un():貪吃蛇運動線程</p><p> public void run()</p><p><b> {</b></p><p> running=true;</p><p> while(running)</p><p><b> {</b></p>
70、;<p><b> try</b></p><p><b> {</b></p><p> Thread.sleep(timeInterval);</p><p> }catch(Exception e)</p><p><b> {</b></p
71、><p><b> break;</b></p><p><b> }</b></p><p> if(!paused)</p><p><b> {</b></p><p> if(moveOn())// 未結(jié)束</p><p
72、><b> {</b></p><p> gs.repaint();</p><p><b> }</b></p><p> else//游戲結(jié)束</p><p><b> {</b></p><p> JOptionPane.show
73、MessageDialog(null,"GAME OVER",</p><p> "Game Over",JOptionPane.INFORMATION_MESSAGE);</p><p><b> break;</b></p><p><b> }</b></p>
74、<p><b> }</b></p><p><b> }</b></p><p> running=false;</p><p><b> }</b></p><p> //createFood():生成食物及放置地點</p><p
75、> private Node createFood()</p><p><b> {</b></p><p><b> int x=0;</b></p><p><b> int y=0;</b></p><p><b> do</b>&l
76、t;/p><p><b> {</b></p><p> Random r=new Random();</p><p> x=r.nextInt(maxX);</p><p> y=r.nextInt(maxY);</p><p> }while(matrix[x][y]);</p&g
77、t;<p> return new Node(x,y);</p><p><b> }</b></p><p> //speedUp():加快蛇運動速度</p><p> public void speedUp()</p><p><b> {</b></p>
78、<p> timeInterval*=speedChangeRate;</p><p><b> }</b></p><p> //speedDown():放慢蛇運動速度</p><p> public void speedDown()</p><p><b> {</b><
79、;/p><p> timeInterval/=speedChangeRate;</p><p><b> }</b></p><p> //changePauseState(): 改變游戲狀態(tài)(暫?;蚶^續(xù))</p><p> public void changePauseState()</p><
80、p><b> {</b></p><p> paused=!paused;</p><p><b> }</b></p><p><b> }</b></p><p><b> 四、運行結(jié)果</b></p><p>
81、<b> 五、設計體會</b></p><p> 通過努力,我們完成了貪吃蛇游戲的程序,實現(xiàn)了它的預期的功能,能夠通過鍵盤上的上下左右鍵控制貪吃蛇的運動。這是圖形界面類的程序設計,我們對其有了更深層次的了解,還用到了數(shù)組和結(jié)點等知識。本次課程設計,使我們把書本上的知識運用到實踐上,進一步鞏固了所學。更使我們了解到Java的強大功能,因為手機上的很多其他程序也都是用Java編寫的。通過本次
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論