JAVA課程設(shè)計(jì)-貪吃蛇_(dá)第1頁
JAVA課程設(shè)計(jì)-貪吃蛇_(dá)第2頁
JAVA課程設(shè)計(jì)-貪吃蛇_(dá)第3頁
JAVA課程設(shè)計(jì)-貪吃蛇_(dá)第4頁
JAVA課程設(shè)計(jì)-貪吃蛇_(dá)第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PAGE1《Java語言程序設(shè)計(jì)》課程設(shè)計(jì)題目20設(shè)計(jì)一個(gè)貪吃蛇游戲程序?qū)I(yè)信息管理與信息系統(tǒng)班級(jí)信管101學(xué)號(hào)201052275107學(xué)生姓名沈園同組成員楊貴文指導(dǎo)教師李永剛編寫日期2011年7月1日PAGEPAGE2一、設(shè)計(jì)任務(wù)書(一)課程設(shè)計(jì)的目的與任務(wù)課程設(shè)計(jì)是課程教學(xué)中的一項(xiàng)重要內(nèi)容,是完成教學(xué)計(jì)劃達(dá)到教學(xué)目標(biāo)的重要環(huán)節(jié),是教學(xué)計(jì)劃中綜合性較強(qiáng)的實(shí)踐教學(xué)環(huán)節(jié),它對(duì)幫助學(xué)生全面牢固地掌握課堂教學(xué)內(nèi)容、培養(yǎng)學(xué)生的實(shí)踐和實(shí)際動(dòng)手能力、提高學(xué)生全面素質(zhì)具有很重要的意義。《Java語言程序設(shè)計(jì)》是一門實(shí)用性和實(shí)踐性都很強(qiáng)的課程,課程設(shè)計(jì)環(huán)節(jié)應(yīng)占有更加重要的地位。本課程設(shè)計(jì)的目的和任務(wù),是通過學(xué)生用Java語言設(shè)計(jì)一個(gè)完整的應(yīng)用程序,使學(xué)生綜合應(yīng)用所學(xué)知識(shí)完成軟件的分析、設(shè)計(jì)、調(diào)試和總結(jié),可加深和鞏固對(duì)理論教學(xué)和實(shí)驗(yàn)教學(xué)內(nèi)容的掌握,使學(xué)生進(jìn)一步掌握使用面向?qū)ο蠹夹g(shù)開發(fā)完整系統(tǒng)的方法。(二)本課程設(shè)計(jì)的基本理論本課程設(shè)計(jì)基于面向?qū)ο蟪绦蛟O(shè)計(jì)思想,從面向?qū)ο蟮木幊碳夹g(shù)入手,涉及圖形用戶界面設(shè)計(jì)、異常處理、輸入輸出等知識(shí)點(diǎn),是Java語言程序設(shè)計(jì)課程的一個(gè)綜合應(yīng)用。(三)課程設(shè)計(jì)的方式與基本要求1.課程設(shè)計(jì)方式課程設(shè)計(jì)的題目應(yīng)提前兩周布置給學(xué)生,每2-3人為1組,每組可以從給定的選題表中選擇一個(gè)題目,以便學(xué)生作好充分準(zhǔn)備。1周的課程設(shè)計(jì)主要分成以下幾個(gè)階段:(1)系統(tǒng)分析與設(shè)計(jì)(2)在前期資料查閱的基礎(chǔ)上,學(xué)生對(duì)所選的課題進(jìn)行功能分析與設(shè)計(jì),并與指導(dǎo)老師進(jìn)行充分的溝通。(3)程序編制與調(diào)試(4)學(xué)生在指導(dǎo)老師的指導(dǎo)下獨(dú)立完成程序的編制與調(diào)試,指導(dǎo)老師應(yīng)實(shí)時(shí)考察學(xué)生的實(shí)際編程與調(diào)試能力。(5)總結(jié)報(bào)告(6)最終提交完整的設(shè)計(jì)文檔、源代碼和可執(zhí)行文件。學(xué)生根據(jù)規(guī)定的課程設(shè)計(jì)報(bào)告格式撰寫設(shè)計(jì)報(bào)告與總結(jié)。(7)答辯與考核階段(8)指導(dǎo)教師對(duì)每位學(xué)生進(jìn)行當(dāng)面提問,學(xué)生以語言表達(dá)和實(shí)際操作的方式進(jìn)行答辯。指導(dǎo)教師將綜合每一學(xué)生1周的表現(xiàn)及能力進(jìn)行綜合評(píng)分。2.基本要求(1)設(shè)計(jì)的軟件系統(tǒng)要實(shí)現(xiàn)題目要求的功能。(2)整個(gè)課程設(shè)計(jì)的各個(gè)環(huán)節(jié)都要求學(xué)生自己動(dòng)手。(3)要求學(xué)生熟練掌握J(rèn)ava語言設(shè)計(jì)一個(gè)完整的應(yīng)用程序的設(shè)計(jì)方法和步驟(軟件的分析、設(shè)計(jì)、調(diào)試和總結(jié))。(4)對(duì)課程設(shè)計(jì)進(jìn)行總結(jié),撰寫課程設(shè)計(jì)報(bào)告;二、程序功能簡(jiǎn)介能夠顯示貪吃蛇的運(yùn)動(dòng),回車、R、S是開始,空格、P是暫停。能夠通過鍵盤上的上下左右鍵,控制貪吃蛇的移動(dòng)方向。當(dāng)吃到食物時(shí),蛇就自動(dòng)長(zhǎng)大一格,并且獲得一分;當(dāng)蛇撞墻或撞到自己就結(jié)束游戲。結(jié)束后能顯示獲得分?jǐn)?shù)。三、系統(tǒng)設(shè)計(jì)(一)設(shè)計(jì)分析要點(diǎn)分析:(1)數(shù)據(jù)結(jié)構(gòu):matrix[][]用來存儲(chǔ)地圖上面的信息,如果什么也沒有設(shè)置為false,如果有食物或蛇,設(shè)置為true;nodeArray,一個(gè)LinkedList,用來保存蛇的每一節(jié);food用來保存食物的位置;而Node類是保存每個(gè)位置的信息。(2)重要函數(shù):changeDirection(intnewDirection),用來改變蛇前進(jìn)的方向,而且只是保存頭部的前進(jìn)方向,因?yàn)槠渌那斑M(jìn)方向已經(jīng)用位置來指明了。其中newDirection必須和原來的direction不是相反方向,所以相反方向的值用了同樣的奇偶性。在測(cè)試的時(shí)候使用了direction%2!=newDirection%2進(jìn)行判斷。moveOn(),用來更新蛇的位置,對(duì)于當(dāng)前方向,把頭部位置進(jìn)行相應(yīng)改變。如果越界,結(jié)束;否則,檢測(cè)是否遇到食物(加頭部)或身體(結(jié)束);如果什么都沒有,加上頭部,去掉尾部。由于用了LinkedList數(shù)據(jù)結(jié)構(gòu),省去了相當(dāng)多的麻煩。(二)程序代碼文件名:SnakeModel.javapackagesy;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.*;publicclassGreedSnakeimplementsKeyListener{JFramemainFrame;CanvaspaintCanvas;JLabellabelScore;//計(jì)分牌SnakeModelsnakeModel=null;//蛇publicstaticfinalintcanvasWidth=200;publicstaticfinalintcanvasHeight=300;publicstaticfinalintnodeWidth=10;publicstaticfinalintnodeHeight=10;//GreedSnake():初始化游戲界面publicGreedSnake(){//設(shè)置界面元素mainFrame=newJFrame("GreedSnake");Containercp=mainFrame.getContentPane();labelScore=newJLabel("Score:");cp.add(labelScore,BorderLayout.NORTH);paintCanvas=newCanvas();paintCanvas.setSize(canvasWidth+1,canvasHeight+1);paintCanvas.addKeyListener(this);cp.add(paintCanvas,BorderLayout.CENTER);JPanelpanelButtom=newJPanel();panelButtom.setLayout(newBorderLayout());JLabellabelHelp;//幫助信息labelHelp=newJLabel("PageUp,PageDownforspeed:",JLabel.CENTER);panelButtom.add(labelHelp,BorderLayout.NORTH);labelHelp=newJLabel("ENTERorRorSforstart;",JLabel.CENTER);panelButtom.add(labelHelp,BorderLayout.CENTER);labelHelp=newJLabel("SPACEorPforpause",JLabel.CENTER);panelButtom.add(labelHelp,BorderLayout.SOUTH);cp.add(panelButtom,BorderLayout.SOUTH);mainFrame.addKeyListener(this);mainFrame.pack();mainFrame.setResizable(false);mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);mainFrame.setVisible(true);begin();}//keyPressed():按鍵檢測(cè)publicvoidkeyPressed(KeyEvente){intkeyCode=e.getKeyCode();if(snakeModel.running)switch(keyCode){caseKeyEvent.VK_UP:snakeModel.changeDirection(SnakeModel.UP);break;caseKeyEvent.VK_DOWN:snakeModel.changeDirection(SnakeModel.DOWN);break;caseKeyEvent.VK_LEFT:snakeModel.changeDirection(SnakeModel.LEFT);break;caseKeyEvent.VK_RIGHT:snakeModel.changeDirection(SnakeModel.RIGHT);break;caseKeyEvent.VK_ADD:caseKeyEvent.VK_PAGE_UP:snakeModel.speedUp();//加速break;caseKeyEvent.VK_SUBTRACT:caseKeyEvent.VK_PAGE_DOWN:snakeModel.speedDown();//減速break;caseKeyEvent.VK_SPACE:caseKeyEvent.VK_P:snakeModel.changePauseState();//暫?;蚶^續(xù)break;default:}//重新開始if(keyCode==KeyEvent.VK_R||keyCode==KeyEvent.VK_S||keyCode==KeyEvent.VK_ENTER){snakeModel.running=false;begin();}}//keyReleased():空函數(shù)publicvoidkeyReleased(KeyEvente){}//keyTyped():空函數(shù)publicvoidkeyTyped(KeyEvente){}//repaint():繪制游戲界面(包括蛇和食物)voidrepaint(){Graphicsg=paintCanvas.getGraphics();//drawbackgroundg.setColor(Color.WHITE);g.fillRect(0,0,canvasWidth,canvasHeight);//drawthesnakeg.setColor(Color.BLACK);LinkedListna=snakeModel.nodeArray;Iteratorit=na.iterator();while(it.hasNext()){Noden=(Node)it.next();drawNode(g,n);}//drawthefoodg.setColor(Color.RED);Noden=snakeModel.food;drawNode(g,n);updateScore();}//drawNode():繪畫某一結(jié)點(diǎn)(蛇身或食物)privatevoiddrawNode(Graphicsg,Noden){g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);}//updateScore():改變計(jì)分牌publicvoidupdateScore(){Strings="Score:"+snakeModel.score;labelScore.setText(s);}//begin():游戲開始,放置貪吃蛇voidbegin(){if(snakeModel==null||!snakeModel.running){snakeModel=newSnakeModel(this,canvasWidth/nodeWidth,this.canvasHeight/nodeHeight);(newThread(snakeModel)).start();}}//main():主函數(shù)publicstaticvoidmain(String[]args){GreedSnakegs=newGreedSnake();}}//Node:結(jié)點(diǎn)類classNode{intx;inty;Node(intx,inty){this.x=x;this.y=y;}}//SnakeModel:貪吃蛇模型classSnakeModelimplementsRunnable{GreedSnakegs;boolean[][]matrix;//界面數(shù)據(jù)保存在數(shù)組里L(fēng)inkedListnodeArray=newLinkedList();Nodefood;intmaxX;//最大寬度intmaxY;//最大長(zhǎng)度intdirection=2;//方向booleanrunning=false;inttimeInterval=200;//間隔時(shí)間(速度)doublespeedChangeRate=0.75;//速度改變程度booleanpaused=false;//游戲狀態(tài)intscore=0;intcountMove=0;//UP和DOWN是偶數(shù),RIGHT和LEFT是奇數(shù)publicstaticfinalintUP=2;publicstaticfinalintDOWN=4;publicstaticfinalintLEFT=1;publicstaticfinalintRIGHT=3;//GreedModel():初始化界面publicSnakeModel(GreedSnakegs,intmaxX,intmaxY){this.gs=gs;this.maxX=maxX;this.maxY=maxY;matrix=newboolean[maxX][];for(inti=0;i<maxX;++i){matrix[i]=newboolean[maxY];Arrays.fill(matrix[i],false);//沒有蛇和食物的地區(qū)置false}//初始化貪吃蛇intinitArrayLength=maxX>20?10:maxX/2;for(inti=0;i<initArrayLength;++i){intx=maxX/2+i;inty=maxY/2;nodeArray.addLast(newNode(x,y));matrix[x][y]=true;//蛇身處置true}food=createFood();matrix[food.x][food.y]=true;//食物處置true}//changeDirection():改變運(yùn)動(dòng)方向publicvoidchangeDirection(intnewDirection){if(direction%2!=newDirection%2)//避免沖突{direction=newDirection;}}//moveOn():貪吃蛇運(yùn)動(dòng)函數(shù)publicbooleanmoveOn(){Noden=(Node)nodeArray.getFirst();intx=n.x;inty=n.y;switch(direction){caseUP:y--;break;caseDOWN:y++;break;caseLEFT:x--;break;caseRIGHT:x++;break;}if((0<=x&&x<maxX)&&(0<=y&&y<maxY)){if(matrix[x][y])//吃到食物或者撞到身體{if(x==food.x&&y==food.y)//吃到食物{nodeArray.addFirst(food);//在頭部加上一結(jié)點(diǎn)//計(jì)分規(guī)則與移動(dòng)長(zhǎng)度和速度有關(guān)intscoreGet=(10000-200*countMove)/timeInterval;score+=scoreGet>0?scoreGet:10;countMove=0;food=createFood();matrix[food.x][food.y]=true;returntrue;}elsereturnfalse;//撞到身體}else//什么都沒有碰到{nodeArray.addFirst(newNode(x,y));//加上頭部matrix[x][y]=true;n=(Node)nodeArray.removeLast();//去掉尾部matrix[n.x][n.y]=false;countMove++;returntrue;}}returnfalse;//越界(撞到墻壁)}//run():貪吃蛇運(yùn)動(dòng)線程publicvoidrun(){running=true;while(running){try{Thread.sleep(timeInterval);}catch(Exceptione){break;}if(!pause

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論