java課程設(shè)計--貪吃蛇_第1頁
已閱讀1頁,還剩78頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  JAVA 課程設(shè)計報告</p><p>  題 目: 貪吃蛇AI版 </p><p>  一、課程設(shè)計的目的及意義</p><p><b>  1.課程設(shè)計的目的</b></p><p>  了解java 的基本使用方法</p><p>  熟悉ecl

2、ipse的運行環(huán)境</p><p>  用java面向?qū)ο蟮姆椒▉碓O(shè)計一個貪吃蛇的小游戲</p><p>  基本實現(xiàn)貪吃蛇的應(yīng)用功能</p><p><b>  2.課程設(shè)計的意義</b></p><p>  貪吃蛇游戲一款非常經(jīng)典的手機游戲,因為它比較簡單有趣,無論老少都比較適合。貪吃蛇的設(shè)計對每一個Java語言設(shè)計

3、者進行語言提高和進階都是一個很好的鍛煉機會。 </p><p>  貪吃蛇游戲的設(shè)計比較復(fù)雜,它涉及面廣、牽涉方面多,如果不好好考慮和設(shè)計,將難以成功開發(fā)出這個游戲。在這個游戲的設(shè)計中,牽涉到圖形界面的顯示與更新、數(shù)據(jù)的收集與更新,并且在這個游戲的開發(fā)中,還要應(yīng)用類的繼承機制以及一些設(shè)計模式。因此,如何設(shè)計和開發(fā)好這個貪吃蛇游戲,對于提高Java開發(fā)水平和系統(tǒng)的設(shè)計能力有極大的幫助。在設(shè)計開發(fā)過程中,需

4、要處理好各個類之間的繼承關(guān)系,還要處理各個類相應(yīng)的封裝,并且還要協(xié)調(diào)好各個模塊之間的邏輯依賴關(guān)系和數(shù)據(jù)通信關(guān)系。</p><p>  正是因為如此,本次課程設(shè)計的目的在于學習Java程序設(shè)計基本技術(shù),熟悉游戲“貪吃蛇”的需求,熟悉項目開發(fā)的完整過程。學會怎樣進行一個項目的需求分析、概要設(shè)計、詳細設(shè)計等軟件開發(fā)過程,熟練地掌握Java程序設(shè)計的基本技術(shù)和方法,熟練地掌握eclipse的使用方法,培養(yǎng)起初步的項目分析

5、能力和程序設(shè)計能力。</p><p><b>  二、系統(tǒng)描述</b></p><p>  2.1 設(shè)計的主要內(nèi)容 </p><p>  貪吃蛇游戲設(shè)計與實現(xiàn),主要分為以下二個模塊:游戲主界面模塊游戲控制模塊。在此只實現(xiàn)游戲的游戲主界面模塊、游戲控制模塊。并且只是實現(xiàn)開始、暫停、退出等功能。 </p>

6、<p>  2.2設(shè)計要達到的目標 </p><p>  本次設(shè)計要達到的目標分別從以下模塊進行闡述:  </p><p><b>  游戲主界面模塊: </b></p><p>  游戲的主界面是進入游戲后,能夠給玩家第一感官的部分,主要包括游戲圖形區(qū)域界面、游戲的速度選擇更新界面、游戲分數(shù)

7、的顯示更新界面、新生方塊的預(yù)覽、游戲開始按鈕、暫停游戲按鈕、退出游戲按鈕以及游戲排行榜按鈕。從很大程度上決定了玩家對游戲的興趣問題,因此,游戲的主界面應(yīng)該力求美觀,爽心悅目。</p><p><b>  游戲控制模塊: </b></p><p>  這個模塊是游戲的中心環(huán)節(jié),主要完成控制游戲的開始、暫停、退出等功能。為了能夠給玩家一個很好的游戲環(huán)境,這部分應(yīng)

8、該做到易懂、易操作。</p><p>  2.3  設(shè)計實現(xiàn)功能和目標 </p><p>  本設(shè)計所開發(fā)的是基于Java的一個貪吃蛇游戲軟件,主要實現(xiàn)游戲的開始、暫停、退出、等功能,分為: 游戲主界面模塊、游戲控制模塊以二個模塊。</p><p><b>  性能: </b></p>&l

9、t;p>  本軟件在設(shè)計方面本著方便、實用及娛樂性高的宗旨,在對界面進行設(shè)計的過程中,始終堅持清晰明了,在性能方面能夠?qū)崿F(xiàn)效率高,不易出錯等優(yōu)點。  </p><p><b>  游戲主界面模塊: </b></p><p>  主要包括游戲圖形區(qū)域界面、游戲開始按鈕、暫停游戲按鈕、關(guān)閉按鈕。游戲的主界面應(yīng)該力求美觀,爽心悅目。

10、60; </p><p><b>  游戲控制模塊: </b></p><p>  主要完成控制游戲的開始、暫停、退出等功能,這部分應(yīng)該做到易懂、易操作而且準確率高,不易出錯。 </p><p>  2.4 游戲設(shè)計環(huán)境 </p><p>  本次課程設(shè)計所涉及和實現(xiàn)的是用Java

11、編程語言和eclipse開發(fā)工具開發(fā)的貪吃蛇游戲。 </p><p>  本次設(shè)計的系統(tǒng)環(huán)境及工具如下:       </p><p>  運行環(huán)境:裝java環(huán)境的windows系統(tǒng)      </p><p>  編程語言:

12、Java </p><p>  使用工具:eclipse</p><p><b>  三、分析與設(shè)計</b></p><p>  3.1功能模塊的劃分</p><p>  本軟件實現(xiàn)的基本功能如下:</p><p>  􀁺 游戲區(qū):玩家可以在游戲區(qū)中堆積方塊,并能夠在游

13、戲過程中隨時了解得分</p><p>  情況和下一個將要出現(xiàn)方塊的提示。</p><p>  􀁺 游戲控制:玩家可以通過游戲控制功能來控制游戲開始,暫停,結(jié)束游戲,</p><p>  游戲難度的設(shè)置以及音效控制。</p><p>  􀁺 游戲方塊的設(shè)計:游戲的核心代碼,算法的實現(xiàn),各個形狀的方塊的各種操

14、</p><p><b>  作的實現(xiàn)。</b></p><p><b>  3.2 整體結(jié)構(gòu)圖</b></p><p><b>  整體結(jié)構(gòu) 如圖1</b></p><p><b>  圖1 整體結(jié)構(gòu)圖</b></p><p> 

15、 3.3 主界面的框架及設(shè)計圖</p><p>  游戲界面主框架主要包括游戲菜單界面、游戲區(qū)域界面、游戲信息更新界面。</p><p>  菜單界面包括選項、難度設(shè)置、模式設(shè)置及幫助。</p><p>  游戲信息更新界面包括模式更新、難度更新及得分更新。</p><p>  設(shè)計圖 (如圖2)</p><p>&

16、lt;b>  圖2 整體結(jié)構(gòu)圖</b></p><p><b>  3.4程序模塊分析</b></p><p>  程序只有兩個java文件,一個LinkedListQueueTest.java是為了實現(xiàn)隊列,另一個Snake.java則是貪吃蛇的類,里面分有幾個內(nèi)部類。下面是Snake類中的定義的變量、構(gòu)造函數(shù)和main函數(shù):</p>

17、<p>  private JPanel contentPane; //窗體內(nèi)容網(wǎng)格</p><p>  private JMenuBar File=new JMenuBar();//菜單</p><p>  private JMenu mainFile = new JMenu("選項");//添加菜單</p><p>  priva

18、te Icon icon=new ImageIcon("C:\\Users\\YH\\Desktop\\java\\新建.png");</p><p>  private Icon icon1=new ImageIcon("C:\\Users\\YH\\Desktop\\java\\開始游戲.png");</p><p>  private Icon

19、 icon2=new ImageIcon("C:\\Users\\YH\\Desktop\\java\\退出.png");</p><p>  private Icon icon3=new ImageIcon("C:\\Users\\YH\\Desktop\\java\\提示.png");</p><p>  private JMenuItem ma

20、inNew=new JMenuItem("開始游戲",icon1);//為 開始游戲 選項 添加圖片</p><p>  private JMenuItem mainPause=new JMenuItem("暫停游戲",icon);</p><p>  private JMenuItem mainRestart=new JMenuItem(&quo

21、t;重新開始",icon);</p><p>  private JMenuItem mainExit=new JMenuItem("退出",icon2);</p><p>  private JMenu mainSet = new JMenu("難度設(shè)置");//添加 等級菜單</p><p>  private

22、JMenuItem rbtnLow=new JMenuItem("低級",icon);//為 設(shè)置難度 選項 添加圖片</p><p>  private JMenuItem rbtnMid=new JMenuItem("中級",icon);//為 設(shè)置難度 選項 添加圖片</p><p>  private JMenuItem rbtnHigh

23、=new JMenuItem("高級",icon);//為 設(shè)置難度 選項 添加圖片</p><p>  private JMenuItem rbtnHigher=new JMenuItem("大師級",icon);//為 設(shè)置難度 選項 添加圖片</p><p>  private JMenuItem rbtnbfser=new JMenuIt

24、em("暴走級",icon);</p><p>  private JMenu mainkind = new JMenu("模式設(shè)置");//添加 模式菜單</p><p>  private JMenuItem rbtnp=new JMenuItem("普通模式",icon);</p><p>  pri

25、vate JMenuItem rbtnrand=new JMenuItem("隨機模式",icon);//為 設(shè)置模式 選項 添加圖片</p><p>  private JMenuItem rbtnbfs=new JMenuItem("AI模式(bfs)",icon);</p><p>  private JMenu mainHelp = new

26、 JMenu("幫助");</p><p>  private JMenuItem m=new JMenuItem("提示",icon3);</p><p>  private JMenuItem b=new JMenuItem("申明",icon3);</p><p>  private JPanel p

27、nlTop = new JPanel(); //頂部按鈕和分數(shù)面板</p><p>  private JPanel pnlLeft = new JPanel(); //左側(cè)面板</p><p>  private JPanel playPanel = new JPanel(); //游戲區(qū)面板</p><p>  private BorderLayout bord

28、erLayout1 = new BorderLayout(); //容器布局管理器</p><p>  private static final int UP = 1,LEFT = 2,DOWN = 3,RIGHT = 4;//蛇運動方向</p><p>  private static final int ROWS = 30; //游戲區(qū)行數(shù)</p><p>  

29、private static final int COLS = 50; //游戲區(qū)列數(shù)</p><p>  private boolean isPause = false; //游戲暫停標志</p><p>  private boolean isEnd; //游戲結(jié)束標志</p><p>  private boolean isrand=false;</p&

30、gt;<p>  private boolean isbfs=false;</p><p>  private SnakeBody snake; //貪食蛇</p><p>  private int score = 0; //當前得分</p><p>  private int x, y;</p><p>  SnakeThr

31、ead thread = new SnakeThread(); //游戲主線程</p><p>  private GridLayout grid1 = new GridLayout(ROWS,COLS,0,0);</p><p>  //游戲區(qū)布局 分成rows行,cols列的格子,水平間距和垂直間距均為0</p><p>  private JButton[]

32、[] blocks; //游戲區(qū)的所有方塊</p><p>  JPanel jPanel2 = new JPanel();</p><p>  JLabel jLabel1 = new JLabel("得分:");</p><p>  JLabel lblScroe = new JLabel("0");</p>

33、<p>  JLabel levels = new JLabel("難度:");</p><p>  JLabel kinds = new JLabel("模式:");</p><p>  JLabel kind = new JLabel("普通模式");</p><p>  JLabel le

34、vel = new JLabel("1");</p><p>  JLabel space = new JLabel(" ");</p><p>  JLabel space1 = new JLabel(" ");</p&

35、gt;<p>  public Snake() {//構(gòu)造函數(shù)</p><p>  super("貪食蛇AI版");</p><p>  //JFrame frame=new JFrame("測試程序");</p><p>  this.setJMenuBar(File);//添加菜單</p>&l

36、t;p>  mainFile.addSeparator();//添加分界線</p><p>  File.setBackground(getForeground());//設(shè)置菜單背景</p><p>  File.add(mainFile);</p><p>  File.add(mainSet);</p><p>  File.ad

37、d(mainkind);</p><p>  File.add(mainHelp);</p><p>  mainFile.add(mainNew);//選項菜單 添加 開始游戲</p><p>  mainFile.add(mainPause);</p><p>  mainFile.add(mainRestart);//選項菜單 添加 重

38、新開始</p><p>  mainFile.add(mainExit);//選項菜單 添加 退出</p><p>  mainSet.add(rbtnLow);//設(shè)置菜單 添加 設(shè)置難度</p><p>  mainSet.add(rbtnMid);//設(shè)置菜單 添加 設(shè)置難度</p><p>  mainSet.add(rbtnHigh

39、);//設(shè)置菜單 添加 設(shè)置難度</p><p>  mainSet.add(rbtnHigher);//設(shè)置菜單 添加 設(shè)置難度</p><p>  mainSet.add(rbtnbfser);</p><p>  mainkind.add(rbtnp);</p><p>  mainkind.add(rbtnrand);</p&g

40、t;<p>  mainkind.add(rbtnbfs);</p><p>  mainHelp.add(m);</p><p>  mainHelp.add(b);</p><p>  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p><p>  contentPane

41、= (JPanel)this.getContentPane();</p><p>  //contentPane.setLayout(borderLayout2);</p><p>  this.setResizable(false);</p><p>  this.setSize(512, 414);//窗口大小</p><p>  thi

42、s.setLocation(430, 80);</p><p>  keyAction keyAct = new keyAction();//監(jiān)聽輸入 下方已定義</p><p>  this.addKeyListener(keyAct);</p><p>  rbtnLow.addKeyListener(keyAct);//初級</p><p

43、>  rbtnMid.addKeyListener(keyAct);//中級</p><p>  rbtnHigh.addKeyListener(keyAct);//高級</p><p>  rbtnHigher.addKeyListener(keyAct);//高級</p><p>  mainNew.addKeyListener(keyAct);//開始游

44、戲</p><p>  mainRestart.addKeyListener(keyAct);//重新開始</p><p>  mainExit.addKeyListener(keyAct);//退出</p><p>  rbtnrand.addKeyListener(keyAct);</p><p>  mainPause.addKeyLi

45、stener(keyAct);</p><p>  rbtnbfs.addKeyListener(keyAct);</p><p>  rbtnbfser.addKeyListener(keyAct);//暴走級難度</p><p>  rbtnp.addKeyListener(keyAct);//普通模式</p><p>  m.addKe

46、yListener(keyAct);</p><p>  b.addKeyListener(keyAct);</p><p>  btnAction btnAct = new btnAction();//監(jiān)聽 需要進行的操作</p><p>  rbtnLow.addActionListener(btnAct);//初級</p><p>  

47、rbtnMid.addActionListener(btnAct);//中級</p><p>  rbtnHigh.addActionListener(btnAct);//高級</p><p>  rbtnHigher.addActionListener(btnAct);//大師級</p><p>  mainNew.addActionListener(btnAct

48、);//開始游戲</p><p>  mainRestart.addActionListener(btnAct);//重新開始</p><p>  mainExit.addActionListener(btnAct);//退出</p><p>  rbtnrand.addActionListener(btnAct);//大師級</p><p>

49、;  mainPause.addActionListener(btnAct);</p><p>  rbtnbfs.addActionListener(btnAct);</p><p>  rbtnbfser.addActionListener(btnAct);</p><p>  rbtnp.addActionListener(btnAct);</p>

50、<p>  m.addActionListener(btnAct);</p><p>  b.addActionListener(btnAct);</p><p>  pnlLeft.setLayout(borderLayout1); //容器布局管理器</p><p>  playPanel.setLayout(grid1);//游戲區(qū)面板 <

51、;/p><p>  playPanel.setBackground(Color.BLACK);//游戲區(qū)背景</p><p>  playPanel.setBorder(BorderFactory.createEtchedBorder());</p><p>  pnlLeft.add(playPanel);//添加游戲區(qū)</p><p>  p

52、nlTop.setBackground(Color.gray);</p><p>  pnlTop.add(kinds);</p><p>  pnlTop.add(kind);</p><p>  pnlTop.add(space1);</p><p>  pnlTop.add(levels);</p><p>  

53、pnlTop.add(level);</p><p>  pnlTop.add(space);</p><p>  //pnlTop.add(levelAdd);</p><p>  pnlTop.add(jLabel1);//頂部面板添加 得分</p><p>  pnlTop.add(lblScroe);//頂部面板添加 分數(shù)</p

54、><p>  contentPane.add(pnlTop, BorderLayout.NORTH);//窗體內(nèi)容網(wǎng)格 添加 頂部面板 設(shè)置位置為上方</p><p>  contentPane.add(pnlLeft, BorderLayout.CENTER);//窗體內(nèi)容網(wǎng)格 添加 左邊面板 設(shè)置位置為中間</p><p>  //創(chuàng)建并初始化游戲區(qū)方塊</p

55、><p>  blocks = new JButton[ROWS][COLS];</p><p>  for (int i = 0; i < ROWS; i++) {</p><p>  for (int j = 0; j < COLS; j++) {</p><p>  blocks[i][j] = new JButton();&l

56、t;/p><p>  blocks[i][j].setBackground(Color.lightGray);//設(shè)置底色</p><p>  blocks[i][j].setVisible(false);</p><p>  playPanel.add(blocks[i][j]);</p><p><b>  }</b>&

57、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //主函數(shù)</b></p><p>  public static void main(String[] args) {</p><p>  Sn

58、ake app = new Snake();</p><p>  app.validate();//更新</p><p>  app.setVisible(true);</p><p><b>  }</b></p><p>  public void start() {</p><p>  sn

59、ake = new SnakeBody(); //創(chuàng)建蛇身</p><p>  score = 0;</p><p>  isPause = false;</p><p>  isEnd = false; </p><p>  //btnPause.setText("暫停");</p><p>&l

60、t;b>  //初始化游戲區(qū)</b></p><p>  for (int i = 0; i < ROWS; i++) {</p><p>  for (int j = 0; j < COLS; j++) {</p><p>  blocks[i][j].setBackground(Color.lightGray);</p>

61、<p>  blocks[i][j].setVisible(false);</p><p><b>  }</b></p><p><b>  }</b></p><p>  //在游戲區(qū)內(nèi)隨機放置豆</p><p>  x = (int) (Math.random() * ROWS)

62、;</p><p>  y = (int) (Math.random() * COLS);</p><p>  while (blocks[x][y].isVisible()) {</p><p>  x = (int) (Math.random() * ROWS);</p><p>  y = (int) (Math.random() *

63、COLS);</p><p><b>  }</b></p><p>  blocks[x][y].setBackground(Color.yellow);</p><p>  blocks[x][y].setVisible(true);</p><p><b>  try {</b></p&

64、gt;<p>  thread.start();//如果 在start中 出現(xiàn)異常 跳到 catch中</p><p><b>  }</b></p><p>  catch (IllegalThreadStateException illegalThreadStateException) {}</p><p><b

65、>  }</b></p><p><b>  然后是蛇身類:</b></p><p>  用來控制蛇的運動方向及運動模式</p><p>  其中move函數(shù)是普通模式,通過從鍵盤輸入的鍵改變direction的值來控制rol[0]和row[0]的位置控制方向,并通過將兩個數(shù)組中的元素移動到前一個元素的位置來實現(xiàn)蛇身的移動。&

66、lt;/p><p>  Rand函數(shù)是隨機模式,通過隨機direction的值,來使蛇的方向隨機,且如果下一步撞墻或者撞到自己重新調(diào)用rand函數(shù),這樣就使得不會撞到墻也不會撞到自己</p><p>  bfs函數(shù)是ai模式,顧名思義就是自動吃食物,該模式通過使用廣度優(yōu)先搜索來搜索從蛇頭到食物的最快路徑來判斷下一步的方向,所以每次都把下一步四個方向的位置到食物的步數(shù)算出來,取步數(shù)最小的方向走,

67、其中通過bfs2來確定改點到食物最小的步數(shù),如此就可以達到ai的效果,如果蛇四個方向都不能到達食物,則通過bfs3判斷按照當前方向運動方向會不會死,如果會死則通過隨機方式改變方向,通過wihle來控制下一個隨機的方向一定不會死,當然必死的情況會陷入死循環(huán)。</p><p>  class SnakeBody {//蛇身</p><p>  public int row[];</p&g

68、t;<p>  public int col[];</p><p>  public int len = 3, direction = RIGHT, lastdirection = RIGHT;//初始狀態(tài)</p><p>  public long speed = 300;//初始速度</p><p>  public SnakeBody() {//

69、蛇身 構(gòu)造函數(shù)</p><p><b>  len = 3;</b></p><p>  direction = RIGHT;//方向</p><p>  lastdirection = RIGHT;</p><p>  row = new int[10000];//設(shè)置最大長度</p><p>

70、  col = new int[10000];</p><p>  for (int i = 0; i <= len; i++) {//初始 位置</p><p>  row[i] = 1;//初始橫坐標</p><p>  col[i] = len - i;//初始縱坐標</p><p><b>  }</b>&

71、lt;/p><p><b>  }</b></p><p>  public void setSpeed(int s) {//設(shè)置速度</p><p>  speed = s;</p><p><b>  }</b></p><p>  public void move() {/

72、/移動</p><p>  blocks[row[len]][col[len]].setVisible(false); //去掉蛇尾</p><p>  blocks[row[len]][col[len]].setBackground(Color.white); //修改顏色</p><p><b>  //顯示蛇身</b></p>

73、<p>  for (int i = 0; i < len; i++) {</p><p>  blocks[row[i]][col[i]].setBackground(Color.green);</p><p>  blocks[row[i]][col[i]].setVisible(true);</p><p><b>  }<

74、/b></p><p><b>  //移動蛇身</b></p><p>  for (int i = len; i > 0; i--) {//后一個變成前一個的位置</p><p>  row[i] = row[i - 1];</p><p>  col[i] = col[i - 1];</p>

75、<p><b>  }</b></p><p>  //根據(jù)蛇身運動方向,決定蛇頭位置</p><p>  switch (direction) {</p><p>  case UP: {</p><p>  if (lastdirection == DOWN)//如果上次移動和此次移動方向 恰好相反,取

76、消改變移動方向</p><p>  row[0] += 1;</p><p><b>  else </b></p><p><b>  {</b></p><p>  row[0] -= 1;</p><p>  lastdirection = UP;//否則 更新 上次

77、 移動方向</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  case LEFT: {</p><p>  if (lastdirection == RI

78、GHT)</p><p>  col[0] += 1;</p><p><b>  else {</b></p><p>  col[0] -= 1;</p><p>  lastdirection = LEFT;</p><p><b>  }</b></p>

79、<p><b>  break;</b></p><p><b>  }</b></p><p>  case DOWN: {</p><p>  if (lastdirection == UP)</p><p>  row[0] -= 1;</p><p>&l

80、t;b>  else {</b></p><p>  row[0] += 1;</p><p>  lastdirection = DOWN;</p><p><b>  }</b></p><p><b>  break;</b></p><p><

81、b>  }</b></p><p>  case RIGHT: {</p><p>  if (lastdirection == LEFT)</p><p>  col[0] -= 1;</p><p><b>  else {</b></p><p>  col[0] += 1

82、;</p><p>  lastdirection = RIGHT;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b&

83、gt;</p><p>  //當蛇頭碰到墻時或蛇頭碰到蛇身時,游戲結(jié)束</p><p>  if (row[0] >= ROWS || row[0] < 0 || col[0] >= COLS || col[0] < 0 ||</p><p>  blocks[row[0]][col[0]].getBackground().equals(C

84、olor.green)) {</p><p>  isEnd = true;</p><p>  JOptionPane.showMessageDialog(null, "游戲結(jié)束!");</p><p><b>  }</b></p><p><b>  //吃豆</b><

85、;/p><p>  if (blocks[row[0]][col[0]].getBackground().equals(Color.yellow)) {</p><p>  score += 100;</p><p>  lblScroe.setText(Integer.toString(score));//改變分數(shù)</p><p><b&

86、gt;  }</b></p><p>  //吃豆后,蛇身加長,并隨機顯示下一個豆</p><p>  if (blocks[row[0]][col[0]].getBackground().equals(Color.yellow)) {</p><p><b>  len++;</b></p><p>  x

87、 = (int) (Math.random() * ROWS);</p><p>  y = (int) (Math.random() * COLS);</p><p>  while (blocks[x][y].isVisible()) {</p><p>  x = (int) (Math.random() * ROWS);</p><p&g

88、t;  y = (int) (Math.random() * COLS);</p><p><b>  }</b></p><p>  blocks[x][y].setBackground(Color.yellow);</p><p>  blocks[x][y].setVisible(true);</p><p>&l

89、t;b>  }</b></p><p>  blocks[row[0]][col[0]].setBackground(Color.RED);</p><p>  blocks[row[0]][col[0]].setVisible(true); //顯示蛇頭</p><p><b>  }</b></p><

90、p>  public void rand() {//移動</p><p>  blocks[row[len]][col[len]].setVisible(false); //去掉蛇尾</p><p>  blocks[row[len]][col[len]].setBackground(Color.white); //修改顏色</p><p><b>

91、  //顯示蛇身</b></p><p>  for (int i = 0; i < len; i++) {</p><p>  blocks[row[i]][col[i]].setBackground(Color.green);</p><p>  blocks[row[i]][col[i]].setVisible(true);</p>

92、;<p><b>  }</b></p><p><b>  //移動蛇身</b></p><p>  for (int i = len; i > 0; i--) {//后一個變成前一個的位置</p><p>  row[i] = row[i - 1];</p><p>  co

93、l[i] = col[i - 1];</p><p><b>  }</b></p><p>  direction = (int) (Math.random() * 5);//隨機</p><p>  while(direction==0)</p><p>  direction = (int) (Math.rando

94、m() * 5);</p><p>  //System.out.print(direction);</p><p>  //direction=3;</p><p>  int x1=row[0],y1=col[0];</p><p>  //根據(jù)蛇身運動方向,決定蛇頭位置</p><p>  switch (dir

95、ection) {</p><p>  case UP: {</p><p>  if (lastdirection == DOWN)//如果上次移動和此次移動方向 恰好相反,取消改變移動方向</p><p><b>  x1 += 1;</b></p><p><b>  else </b><

96、;/p><p><b>  x1 -= 1;</b></p><p>  if (x1 >= ROWS ||x1 < 0 || y1 >= COLS || y1 < 0 ||</p><p>  blocks[x1][y1].getBackground().equals(Color.green)) {</p>

97、<p><b>  rand();</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  if (lastdirection == DOWN)//如果上次移動和此次移動方向 恰好相反,取消改變移動方向</p>&l

98、t;p>  row[0] += 1;</p><p><b>  else </b></p><p><b>  {</b></p><p>  row[0] -= 1;</p><p>  lastdirection = UP;//否則 更新 上次 移動方向</p><

99、p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  case LEFT: {</p><p>  if (lastdirection == RIGHT)//如果上次移動和此次移動方向 恰

100、好相反,取消改變移動方向</p><p><b>  y1 += 1;</b></p><p><b>  else </b></p><p><b>  y1 -= 1;</b></p><p>  if (x1 >= ROWS ||x1 < 0 || y1 &g

101、t;= COLS || y1 < 0 ||</p><p>  blocks[x1][y1].getBackground().equals(Color.green)) {</p><p><b>  rand();</b></p><p><b>  break;</b></p><p>&l

102、t;b>  }</b></p><p>  if (lastdirection == RIGHT)</p><p>  col[0] += 1;</p><p><b>  else {</b></p><p>  col[0] -= 1;</p><p>  lastdirec

103、tion = LEFT;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  case DOWN: {</p><p>  if (lastdirectio

104、n == UP)//如果上次移動和此次移動方向 恰好相反,取消改變移動方向</p><p><b>  x1 -= 1;</b></p><p><b>  else </b></p><p><b>  x1 += 1;</b></p><p>  if (x1 >=

105、ROWS ||x1 < 0 || y1 >= COLS || y1 < 0 ||</p><p>  blocks[x1][y1].getBackground().equals(Color.green)) {</p><p><b>  rand();</b></p><p><b>  break;</b&g

106、t;</p><p><b>  }</b></p><p>  if (lastdirection == UP)</p><p>  row[0] -= 1;</p><p><b>  else {</b></p><p>  row[0] += 1;</p>

107、<p>  lastdirection = DOWN;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  case RIGHT: {</p><

108、p>  if (lastdirection == LEFT)//如果上次移動和此次移動方向 恰好相反,取消改變移動方向</p><p><b>  y1 -= 1;</b></p><p><b>  else </b></p><p><b>  y1 += 1;</b></p>

109、<p>  if (x1 >= ROWS ||x1 < 0 || y1 >= COLS || y1 < 0 ||</p><p>  blocks[x1][y1].getBackground().equals(Color.green)) {</p><p><b>  rand();</b></p><p>

110、<b>  break;</b></p><p><b>  }</b></p><p>  if (lastdirection == LEFT)</p><p>  col[0] -= 1;</p><p><b>  else {</b></p><p&

111、gt;  col[0] += 1;</p><p>  lastdirection = RIGHT;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><

112、;b>  }</b></p><p>  //當蛇頭碰到墻時或蛇頭碰到蛇身時,游戲結(jié)束</p><p>  if (row[0] >= ROWS || row[0] < 0 || col[0] >= COLS || col[0] < 0 ||</p><p>  blocks[row[0]][col[0]].getBackg

113、round().equals(Color.green)) {</p><p>  isEnd = true;</p><p>  JOptionPane.showMessageDialog(null, "游戲結(jié)束!");</p><p><b>  }</b></p><p><b>  /

114、/吃豆</b></p><p>  if (blocks[row[0]][col[0]].getBackground().equals(Color.yellow)) {</p><p>  score += 100;</p><p>  lblScroe.setText(Integer.toString(score));//改變分數(shù)</p>

115、<p><b>  }</b></p><p>  //吃豆后,蛇身加長,并隨機顯示下一個豆</p><p>  if (blocks[row[0]][col[0]].getBackground().equals(Color.yellow)) {</p><p><b>  len++;</b></p&g

116、t;<p>  x = (int) (Math.random() * ROWS);</p><p>  y = (int) (Math.random() * COLS);</p><p>  while (blocks[x][y].isVisible()) {</p><p>  x = (int) (Math.random() * ROWS);<

117、;/p><p>  y = (int) (Math.random() * COLS);</p><p><b>  }</b></p><p>  blocks[x][y].setBackground(Color.yellow);</p><p>  blocks[x][y].setVisible(true);</p&

118、gt;<p><b>  }</b></p><p>  blocks[row[0]][col[0]].setBackground(Color.RED);</p><p>  blocks[row[0]][col[0]].setVisible(true); //顯示蛇頭</p><p><b>  } </b>

119、;</p><p>  int min1(int a,int b)//求最小值</p><p><b>  {</b></p><p>  return a<b?a:b;</p><p><b>  }</b></p><p>  int min(int a,int b

120、,int c,int d)//求最小值</p><p><b>  {</b></p><p>  return min1(min1(a,b),min1(c,d));</p><p><b>  }</b></p><p>  int bfs2(int a,int b,int c,int d)//b

121、fs求最短路</p><p><b>  {</b></p><p>  int[][] m={{1,0},{-1,0},{0,1},{0,-1}};</p><p>  LinkedListQueueTest q=new LinkedListQueueTest();</p><p>  struct now=new s

122、truct();</p><p>  if(a==c&&b==d)//如果當前是失誤的話 返回0</p><p><b>  return 0;</b></p><p>  if(a<0||b<0||a>=ROWS||b>=COLS)</p><p>  return 10000

123、;</p><p>  if(blocks[a][b].getBackground().equals(Color.green))</p><p>  return 1000;</p><p><b>  now.x=a;</b></p><p><b>  now.y=b;</b></p>

124、;<p>  int flag[][]= new int [1000][1000];</p><p>  flag[now.x][now.y]=1;</p><p>  now.step=0;</p><p>  q.enqueue(now);</p><p>  while(!q.isEmpty())</p>&

125、lt;p><b>  {</b></p><p>  now=(struct) q.front();</p><p>  q.dequeue();</p><p>  for(int i=0;i<4;i++)</p><p><b>  {</b></p><p>

126、;  struct next=new struct();</p><p>  next.x=now.x+m[i][0];</p><p>  next.y=now.y+m[i][1];</p><p><b>  /*</b></p><p><b>  if(n==1)</b></p>

127、<p><b>  {</b></p><p>  now.step=2;//求第一次的方向!?。。。。。。?lt;/p><p><b>  }</b></p><p><b>  */</b></p><p>  //System.out.println("

128、;fcsa"+now.x+' '+now.y+' '+next.x+' '+next.y);</p><p>  int x1=next.x;</p><p>  int y1=next.y;</p><p>  if(next.x>=0&&next.x<ROWS&&

129、;next.y>=0&&next.y<COLS&&flag[x1][y1]==0&&blocks[x1][y1].getBackground().equals(Color.green)!=true)</p><p><b>  {</b></p><p>  //System.out.println(&quo

130、t;yes");</p><p>  //System.out.println("fcsa"+now.x+' '+now.y+' '+next.x+' '+next.y+' '+q.size());</p><p>  next.step=now.step+1;</p><p&

131、gt;  if(next.x==c&&next.y==d)</p><p>  return next.step;</p><p>  flag[next.x][next.y]=1;</p><p>  q.enqueue(next);</p><p><b>  }</b></p><

132、;p><b>  }</b></p><p><b>  }</b></p><p>  return 10000;//到不了的話 返回10000 表示 到不了</p><p><b>  }</b></p><p>  int bfs3(int d,int x2,in

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論