2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論