版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> JAVA 課程設(shè)計(jì)報(bào)告</p><p> 題 目: 貪吃蛇AI版 </p><p> 一、課程設(shè)計(jì)的目的及意義</p><p><b> 1.課程設(shè)計(jì)的目的</b></p><p> 了解java 的基本使用方法</p><p> 熟悉ecl
2、ipse的運(yùn)行環(huán)境</p><p> 用java面向?qū)ο蟮姆椒▉?lái)設(shè)計(jì)一個(gè)貪吃蛇的小游戲</p><p> 基本實(shí)現(xiàn)貪吃蛇的應(yīng)用功能</p><p><b> 2.課程設(shè)計(jì)的意義</b></p><p> 貪吃蛇游戲一款非常經(jīng)典的手機(jī)游戲,因?yàn)樗容^簡(jiǎn)單有趣,無(wú)論老少都比較適合。貪吃蛇的設(shè)計(jì)對(duì)每一個(gè)Java語(yǔ)言設(shè)計(jì)
3、者進(jìn)行語(yǔ)言提高和進(jìn)階都是一個(gè)很好的鍛煉機(jī)會(huì)。 </p><p> 貪吃蛇游戲的設(shè)計(jì)比較復(fù)雜,它涉及面廣、牽涉方面多,如果不好好考慮和設(shè)計(jì),將難以成功開(kāi)發(fā)出這個(gè)游戲。在這個(gè)游戲的設(shè)計(jì)中,牽涉到圖形界面的顯示與更新、數(shù)據(jù)的收集與更新,并且在這個(gè)游戲的開(kāi)發(fā)中,還要應(yīng)用類(lèi)的繼承機(jī)制以及一些設(shè)計(jì)模式。因此,如何設(shè)計(jì)和開(kāi)發(fā)好這個(gè)貪吃蛇游戲,對(duì)于提高Java開(kāi)發(fā)水平和系統(tǒng)的設(shè)計(jì)能力有極大的幫助。在設(shè)計(jì)開(kāi)發(fā)過(guò)程中,需
4、要處理好各個(gè)類(lèi)之間的繼承關(guān)系,還要處理各個(gè)類(lèi)相應(yīng)的封裝,并且還要協(xié)調(diào)好各個(gè)模塊之間的邏輯依賴關(guān)系和數(shù)據(jù)通信關(guān)系。</p><p> 正是因?yàn)槿绱?,本次課程設(shè)計(jì)的目的在于學(xué)習(xí)Java程序設(shè)計(jì)基本技術(shù),熟悉游戲“貪吃蛇”的需求,熟悉項(xiàng)目開(kāi)發(fā)的完整過(guò)程。學(xué)會(huì)怎樣進(jìn)行一個(gè)項(xiàng)目的需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)等軟件開(kāi)發(fā)過(guò)程,熟練地掌握J(rèn)ava程序設(shè)計(jì)的基本技術(shù)和方法,熟練地掌握eclipse的使用方法,培養(yǎng)起初步的項(xiàng)目分析
5、能力和程序設(shè)計(jì)能力。</p><p><b> 二、系統(tǒng)描述</b></p><p> 2.1 設(shè)計(jì)的主要內(nèi)容 </p><p> 貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn),主要分為以下二個(gè)模塊:游戲主界面模塊游戲控制模塊。在此只實(shí)現(xiàn)游戲的游戲主界面模塊、游戲控制模塊。并且只是實(shí)現(xiàn)開(kāi)始、暫停、退出等功能。 </p>
6、<p> 2.2設(shè)計(jì)要達(dá)到的目標(biāo) </p><p> 本次設(shè)計(jì)要達(dá)到的目標(biāo)分別從以下模塊進(jìn)行闡述: </p><p><b> 游戲主界面模塊: </b></p><p> 游戲的主界面是進(jìn)入游戲后,能夠給玩家第一感官的部分,主要包括游戲圖形區(qū)域界面、游戲的速度選擇更新界面、游戲分?jǐn)?shù)
7、的顯示更新界面、新生方塊的預(yù)覽、游戲開(kāi)始按鈕、暫停游戲按鈕、退出游戲按鈕以及游戲排行榜按鈕。從很大程度上決定了玩家對(duì)游戲的興趣問(wèn)題,因此,游戲的主界面應(yīng)該力求美觀,爽心悅目。</p><p><b> 游戲控制模塊: </b></p><p> 這個(gè)模塊是游戲的中心環(huán)節(jié),主要完成控制游戲的開(kāi)始、暫停、退出等功能。為了能夠給玩家一個(gè)很好的游戲環(huán)境,這部分應(yīng)
8、該做到易懂、易操作。</p><p> 2.3 設(shè)計(jì)實(shí)現(xiàn)功能和目標(biāo) </p><p> 本設(shè)計(jì)所開(kāi)發(fā)的是基于Java的一個(gè)貪吃蛇游戲軟件,主要實(shí)現(xiàn)游戲的開(kāi)始、暫停、退出、等功能,分為: 游戲主界面模塊、游戲控制模塊以二個(gè)模塊。</p><p><b> 性能: </b></p>&l
9、t;p> 本軟件在設(shè)計(jì)方面本著方便、實(shí)用及娛樂(lè)性高的宗旨,在對(duì)界面進(jìn)行設(shè)計(jì)的過(guò)程中,始終堅(jiān)持清晰明了,在性能方面能夠?qū)崿F(xiàn)效率高,不易出錯(cuò)等優(yōu)點(diǎn)。 </p><p><b> 游戲主界面模塊: </b></p><p> 主要包括游戲圖形區(qū)域界面、游戲開(kāi)始按鈕、暫停游戲按鈕、關(guān)閉按鈕。游戲的主界面應(yīng)該力求美觀,爽心悅目。
10、60; </p><p><b> 游戲控制模塊: </b></p><p> 主要完成控制游戲的開(kāi)始、暫停、退出等功能,這部分應(yīng)該做到易懂、易操作而且準(zhǔn)確率高,不易出錯(cuò)。 </p><p> 2.4 游戲設(shè)計(jì)環(huán)境 </p><p> 本次課程設(shè)計(jì)所涉及和實(shí)現(xiàn)的是用Java
11、編程語(yǔ)言和eclipse開(kāi)發(fā)工具開(kāi)發(fā)的貪吃蛇游戲。 </p><p> 本次設(shè)計(jì)的系統(tǒng)環(huán)境及工具如下: </p><p> 運(yùn)行環(huán)境:裝java環(huán)境的windows系統(tǒng) </p><p> 編程語(yǔ)言:
12、Java </p><p> 使用工具:eclipse</p><p><b> 三、分析與設(shè)計(jì)</b></p><p> 3.1功能模塊的劃分</p><p> 本軟件實(shí)現(xiàn)的基本功能如下:</p><p> 游戲區(qū):玩家可以在游戲區(qū)中堆積方塊,并能夠在游
13、戲過(guò)程中隨時(shí)了解得分</p><p> 情況和下一個(gè)將要出現(xiàn)方塊的提示。</p><p> 游戲控制:玩家可以通過(guò)游戲控制功能來(lái)控制游戲開(kāi)始,暫停,結(jié)束游戲,</p><p> 游戲難度的設(shè)置以及音效控制。</p><p> 游戲方塊的設(shè)計(jì):游戲的核心代碼,算法的實(shí)現(xiàn),各個(gè)形狀的方塊的各種操
14、</p><p><b> 作的實(shí)現(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è)計(jì)圖</p><p> 游戲界面主框架主要包括游戲菜單界面、游戲區(qū)域界面、游戲信息更新界面。</p><p> 菜單界面包括選項(xiàng)、難度設(shè)置、模式設(shè)置及幫助。</p><p> 游戲信息更新界面包括模式更新、難度更新及得分更新。</p><p> 設(shè)計(jì)圖 (如圖2)</p><p>&
16、lt;b> 圖2 整體結(jié)構(gòu)圖</b></p><p><b> 3.4程序模塊分析</b></p><p> 程序只有兩個(gè)java文件,一個(gè)LinkedListQueueTest.java是為了實(shí)現(xiàn)隊(duì)列,另一個(gè)Snake.java則是貪吃蛇的類(lèi),里面分有幾個(gè)內(nèi)部類(lèi)。下面是Snake類(lèi)中的定義的變量、構(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("選項(xiàng)");//添加菜單</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\\開(kāi)始游戲.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("開(kāi)始游戲",icon1);//為 開(kāi)始游戲 選項(xiàng) 添加圖片</p><p> private JMenuItem mainPause=new JMenuItem("暫停游戲",icon);</p><p> private JMenuItem mainRestart=new JMenuItem(&quo
21、t;重新開(kāi)始",icon);</p><p> private JMenuItem mainExit=new JMenuItem("退出",icon2);</p><p> private JMenu mainSet = new JMenu("難度設(shè)置");//添加 等級(jí)菜單</p><p> private
22、JMenuItem rbtnLow=new JMenuItem("低級(jí)",icon);//為 設(shè)置難度 選項(xiàng) 添加圖片</p><p> private JMenuItem rbtnMid=new JMenuItem("中級(jí)",icon);//為 設(shè)置難度 選項(xiàng) 添加圖片</p><p> private JMenuItem rbtnHigh
23、=new JMenuItem("高級(jí)",icon);//為 設(shè)置難度 選項(xiàng) 添加圖片</p><p> private JMenuItem rbtnHigher=new JMenuItem("大師級(jí)",icon);//為 設(shè)置難度 選項(xiàng) 添加圖片</p><p> private JMenuItem rbtnbfser=new JMenuIt
24、em("暴走級(jí)",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("隨機(jī)模式",icon);//為 設(shè)置模式 選項(xiàng) 添加圖片</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(); //頂部按鈕和分?jǐn)?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;//蛇運(yùn)動(dòng)方向</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; //游戲暫停標(biāo)志</p><p> private boolean isEnd; //游戲結(jié)束標(biāo)志</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; //當(dāng)前得分</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("測(cè)試程序");</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);//選項(xiàng)菜單 添加 開(kāi)始游戲</p><p> mainFile.add(mainPause);</p><p> mainFile.add(mainRestart);//選項(xiàng)菜單 添加 重
38、新開(kāi)始</p><p> mainFile.add(mainExit);//選項(xiàng)菜單 添加 退出</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)聽(tīng)輸入 下方已定義</p><p> this.addKeyListener(keyAct);</p><p> rbtnLow.addKeyListener(keyAct);//初級(jí)</p><p
43、> rbtnMid.addKeyListener(keyAct);//中級(jí)</p><p> rbtnHigh.addKeyListener(keyAct);//高級(jí)</p><p> rbtnHigher.addKeyListener(keyAct);//高級(jí)</p><p> mainNew.addKeyListener(keyAct);//開(kāi)始游
44、戲</p><p> mainRestart.addKeyListener(keyAct);//重新開(kāi)始</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);//暴走級(jí)難度</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)聽(tīng) 需要進(jìn)行的操作</p><p> rbtnLow.addActionListener(btnAct);//初級(jí)</p><p>
47、rbtnMid.addActionListener(btnAct);//中級(jí)</p><p> rbtnHigh.addActionListener(btnAct);//高級(jí)</p><p> rbtnHigher.addActionListener(btnAct);//大師級(jí)</p><p> mainNew.addActionListener(btnAct
48、);//開(kāi)始游戲</p><p> mainRestart.addActionListener(btnAct);//重新開(kāi)始</p><p> mainExit.addActionListener(btnAct);//退出</p><p> rbtnrand.addActionListener(btnAct);//大師級(jí)</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);//頂部面板添加 分?jǐn)?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)隨機(jī)放置豆</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> 然后是蛇身類(lèi):</b></p><p> 用來(lái)控制蛇的運(yùn)動(dòng)方向及運(yùn)動(dòng)模式</p><p> 其中move函數(shù)是普通模式,通過(guò)從鍵盤(pán)輸入的鍵改變direction的值來(lái)控制rol[0]和row[0]的位置控制方向,并通過(guò)將兩個(gè)數(shù)組中的元素移動(dòng)到前一個(gè)元素的位置來(lái)實(shí)現(xiàn)蛇身的移動(dòng)。&
66、lt;/p><p> Rand函數(shù)是隨機(jī)模式,通過(guò)隨機(jī)direction的值,來(lái)使蛇的方向隨機(jī),且如果下一步撞墻或者撞到自己重新調(diào)用rand函數(shù),這樣就使得不會(huì)撞到墻也不會(huì)撞到自己</p><p> bfs函數(shù)是ai模式,顧名思義就是自動(dòng)吃食物,該模式通過(guò)使用廣度優(yōu)先搜索來(lái)搜索從蛇頭到食物的最快路徑來(lái)判斷下一步的方向,所以每次都把下一步四個(gè)方向的位置到食物的步數(shù)算出來(lái),取步數(shù)最小的方向走,
67、其中通過(guò)bfs2來(lái)確定改點(diǎn)到食物最小的步數(shù),如此就可以達(dá)到ai的效果,如果蛇四個(gè)方向都不能到達(dá)食物,則通過(guò)bfs3判斷按照當(dāng)前方向運(yùn)動(dòng)方向會(huì)不會(huì)死,如果會(huì)死則通過(guò)隨機(jī)方式改變方向,通過(guò)wihle來(lái)控制下一個(gè)隨機(jī)的方向一定不會(huì)死,當(dāng)然必死的情況會(huì)陷入死循環(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è)置最大長(zhǎng)度</p><p>
70、 col = new int[10000];</p><p> for (int i = 0; i <= len; i++) {//初始 位置</p><p> row[i] = 1;//初始橫坐標(biāo)</p><p> col[i] = len - i;//初始縱坐標(biāo)</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、/移動(dòng)</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> //移動(dòng)蛇身</b></p><p> for (int i = len; i > 0; i--) {//后一個(gè)變成前一個(gè)的位置</p><p> row[i] = row[i - 1];</p><p> col[i] = col[i - 1];</p>
75、<p><b> }</b></p><p> //根據(jù)蛇身運(yùn)動(dòng)方向,決定蛇頭位置</p><p> switch (direction) {</p><p> case UP: {</p><p> if (lastdirection == DOWN)//如果上次移動(dòng)和此次移動(dòng)方向 恰好相反,取
76、消改變移動(dòng)方向</p><p> row[0] += 1;</p><p><b> else </b></p><p><b> {</b></p><p> row[0] -= 1;</p><p> lastdirection = UP;//否則 更新 上次
77、 移動(dòng)方向</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> //當(dāng)蛇頭碰到墻時(shí)或蛇頭碰到蛇身時(shí),游戲結(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));//改變分?jǐn)?shù)</p><p><b&
86、gt; }</b></p><p> //吃豆后,蛇身加長(zhǎng),并隨機(jī)顯示下一個(gè)豆</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() {//移動(dòng)</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> //移動(dòng)蛇身</b></p><p> for (int i = len; i > 0; i--) {//后一個(gè)變成前一個(gè)的位置</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);//隨機(jī)</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ù)蛇身運(yùn)動(dòng)方向,決定蛇頭位置</p><p> switch (dir
95、ection) {</p><p> case UP: {</p><p> if (lastdirection == DOWN)//如果上次移動(dòng)和此次移動(dòng)方向 恰好相反,取消改變移動(dòng)方向</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)//如果上次移動(dòng)和此次移動(dòng)方向 恰好相反,取消改變移動(dòng)方向</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;//否則 更新 上次 移動(dòng)方向</p><
99、p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p> case LEFT: {</p><p> if (lastdirection == RIGHT)//如果上次移動(dòng)和此次移動(dòng)方向 恰
100、好相反,取消改變移動(dòng)方向</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)//如果上次移動(dòng)和此次移動(dòng)方向 恰好相反,取消改變移動(dòng)方向</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)//如果上次移動(dòng)和此次移動(dòng)方向 恰好相反,取消改變移動(dòng)方向</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> //當(dāng)蛇頭碰到墻時(shí)或蛇頭碰到蛇身時(shí),游戲結(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));//改變分?jǐn)?shù)</p>
115、<p><b> }</b></p><p> //吃豆后,蛇身加長(zhǎng),并隨機(jī)顯示下一個(gè)豆</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)//如果當(dāng)前是失誤的話 返回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;//求第一次的方向?。。。。。。?!</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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計(jì)--貪吃蛇
- 貪吃蛇java課程設(shè)計(jì)--貪吃蛇程序設(shè)計(jì)
- java貪吃蛇游戲 課程設(shè)計(jì)
- java貪吃蛇課程設(shè)計(jì)報(bào)告
- java-課程設(shè)計(jì)--貪吃蛇
- java課程設(shè)計(jì)---java設(shè)計(jì)貪吃蛇游戲
- java課程設(shè)計(jì)報(bào)告貪吃蛇游戲
- 貪吃蛇課程設(shè)計(jì)
- 貪吃蛇課程設(shè)計(jì)
- 貪吃蛇課程設(shè)計(jì)
- 貪吃蛇課程設(shè)計(jì)報(bào)告
- 貪吃蛇課程設(shè)計(jì)報(bào)告
- 貪吃蛇課程設(shè)計(jì)報(bào)告
- 貪吃蛇vc課程設(shè)計(jì)
- 貪吃蛇課程設(shè)計(jì)報(bào)告
- android貪吃蛇課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--設(shè)計(jì)一個(gè)貪吃蛇游戲程序
- c++課程設(shè)計(jì)----貪吃蛇
- c++貪吃蛇課程設(shè)計(jì)
- 貪吃蛇白盒測(cè)試課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論