版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 一、設(shè)計任務(wù)書</b></p><p> (一)課程設(shè)計的目的與任務(wù) </p><p> 課程設(shè)計是課程教學(xué)中的一項重要內(nèi)容,是完成教學(xué)計劃達(dá)到教學(xué)目標(biāo)的重要環(huán)節(jié),是教學(xué)計劃中綜合性較強的實踐教學(xué)環(huán)節(jié),它對幫助學(xué)生全面牢固地掌握課堂教學(xué)內(nèi)容、培養(yǎng)學(xué)生的實踐和實際動手能力、提高學(xué)生全面素質(zhì)具有很重要的意義?!禞ava語言程序設(shè)計》是一
2、門實用性和實踐性都很強的課程,課程設(shè)計環(huán)節(jié)應(yīng)占有更加重要的地位。</p><p> 本課程設(shè)計的目的和任務(wù),是通過學(xué)生用Java語言設(shè)計一個完整的應(yīng)用程序,使學(xué)生綜合應(yīng)用所學(xué)知識完成軟件的分析、設(shè)計、調(diào)試和總結(jié),可加深和鞏固對理論教學(xué)和實驗教學(xué)內(nèi)容的掌握,使學(xué)生進(jìn)一步掌握使用面向?qū)ο蠹夹g(shù)開發(fā)完整系統(tǒng)的方法。</p><p> ?。ǘ┍菊n程設(shè)計的基本理論</p><p
3、> 本課程設(shè)計基于面向?qū)ο蟪绦蛟O(shè)計思想,從面向?qū)ο蟮木幊碳夹g(shù)入手,涉及圖形用戶界面設(shè)計、異常處理、輸入輸出等知識點,是Java語言程序設(shè)計課程的一個綜合應(yīng)用。</p><p> ?。ㄈ┱n程設(shè)計的方式與基本要求</p><p><b> 1. 課程設(shè)計方式</b></p><p> 課程設(shè)計的題目應(yīng)提前兩周布置給學(xué)生,每2-3人為1
4、組,每組可以從給定的選題表中選擇一個題目,以便學(xué)生作好充分準(zhǔn)備。1周的課程設(shè)計主要分成以下幾個階段: </p><p> (1)系統(tǒng)分析與設(shè)計</p><p> (2)在前期資料查閱的基礎(chǔ)上,學(xué)生對所選的課題進(jìn)行功能分析與設(shè)計,并與指導(dǎo)老師進(jìn)行充分的溝通。</p><p> (3)程序編制與調(diào)試</p><p> (4)學(xué)生在指導(dǎo)老師
5、的指導(dǎo)下獨立完成程序的編制與調(diào)試,指導(dǎo)老師應(yīng)實時考察學(xué)生的實際編程與調(diào)試能力。</p><p><b> (5)總結(jié)報告</b></p><p> (6)最終提交完整的設(shè)計文檔、源代碼和可執(zhí)行文件。學(xué)生根據(jù)規(guī)定的課程設(shè)計報告格式撰寫設(shè)計報告與總結(jié)。</p><p> (7)答辯與考核階段</p><p> (8)
6、指導(dǎo)教師對每位學(xué)生進(jìn)行當(dāng)面提問,學(xué)生以語言表達(dá)和實際操作的方式進(jìn)行答辯。指導(dǎo)教師將綜合每一學(xué)生1周的表現(xiàn)及能力進(jìn)行綜合評分。</p><p><b> 2.基本要求</b></p><p> (1)設(shè)計的軟件系統(tǒng)要實現(xiàn)題目要求的功能。</p><p> (2)整個課程設(shè)計的各個環(huán)節(jié)都要求學(xué)生自己動手。</p><p&g
7、t; (3)要求學(xué)生熟練掌握J(rèn)ava語言設(shè)計一個完整的應(yīng)用程序的設(shè)計方法和步驟(軟件的分析、設(shè)計、調(diào)試和總結(jié))。</p><p> (4)對課程設(shè)計進(jìn)行總結(jié),撰寫課程設(shè)計報告;</p><p><b> 二、程序功能簡介</b></p><p> 能夠顯示貪吃蛇的運動,回車、R、S是開始,空格、P是暫停。能夠通過鍵盤上的上下左右鍵,控制
8、貪吃蛇的移動方向。當(dāng)吃到食物時,蛇就自動長大一格,并且獲得一分;當(dāng)蛇撞墻或撞到自己就結(jié)束游戲。結(jié)束后能顯示獲得分?jǐn)?shù)。</p><p><b> 三、系統(tǒng)設(shè)計</b></p><p><b> ?。ㄒ唬┰O(shè)計分析</b></p><p><b> 要點分析:</b></p><p&
9、gt; (1)數(shù)據(jù)結(jié)構(gòu):matrix[][]用來存儲地圖上面的信息,如果什么也沒有設(shè)置為false,如果有食物或蛇,設(shè)置為true;nodeArray,一個LinkedList,用來保存蛇的每一節(jié);food用來保存食物的位置;而Node類是保存每個位置的信息。</p><p><b> (2)重要函數(shù):</b></p><p> changeDirection(
10、int newDirection) ,用來改變蛇前進(jìn)的方向,而且只是保存頭部的前進(jìn)方向,因為其他的前進(jìn)方向已經(jīng)用位置來指明了。 其中newDirection必須和原來的direction不是相反方向,所以相反方向的值用了同樣的奇偶性。在測試的時候使用了direction%2!=newDirection%2 進(jìn)行判斷。moveOn(),用來更新蛇的位置,對于當(dāng)前方向,把頭部位置進(jìn)行相應(yīng)改變。如果越界,結(jié)束;否則,檢測是否遇到食物(加頭部)
11、或身體(結(jié)束);如果什么都沒有,加上頭部,去掉尾部。由于用了LinkedList數(shù)據(jù)結(jié)構(gòu),省去了相當(dāng)多的麻煩。</p><p><b> ?。ǘ┏绦虼a</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> //設(shè)置界面元素</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> 五、設(shè)計體會</b></p><p> 通過努力,我們完成了貪吃蛇游戲的程序,實現(xiàn)了它的預(yù)期的功能,能夠通過鍵盤上的上下左右鍵控制貪吃蛇的運動。這是圖形界面類的程序設(shè)計,我們對其有了更深層次的了解,還用到了數(shù)組和結(jié)點等知識。本次課程設(shè)計,使我們把書本上的知識運用到實踐上,進(jìn)一步鞏固了所學(xué)。更使我們了解到Java的強大功能,因為手機上的很多其他程序也都是用Java編寫的。通過本次
溫馨提示
- 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è)計--貪吃蛇程序設(shè)計
- java課程設(shè)計---java設(shè)計貪吃蛇游戲
- java課程設(shè)計報告貪吃蛇游戲
- java課程設(shè)計貪吃蛇
- java課程設(shè)計--貪吃蛇
- java貪吃蛇課程設(shè)計報告
- 課程設(shè)計--- 貪吃蛇小游戲程序設(shè)計
- java-課程設(shè)計--貪吃蛇
- qt課程設(shè)計--貪吃蛇游戲設(shè)計
- c語言貪吃蛇游戲課程設(shè)計
- c語言課程設(shè)計--貪吃蛇游戲
- 貪吃蛇游戲的實現(xiàn)課程設(shè)計
- 基于java的游戲設(shè)計——貪吃蛇
- 貪吃蛇課程設(shè)計
- 貪吃蛇課程設(shè)計
- 貪吃蛇課程設(shè)計
- 課程設(shè)計--安卓手機游戲---貪吃蛇
- 貪吃蛇課程設(shè)計報告
- 貪吃蛇課程設(shè)計報告
評論
0/150
提交評論