貪吃蛇課程設計_第1頁
貪吃蛇課程設計_第2頁
貪吃蛇課程設計_第3頁
貪吃蛇課程設計_第4頁
貪吃蛇課程設計_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 面向對象程序設計課程設計報告題 目: 貪吃蛇游戲設計與實現 院 (系): 信息科學與工程學院 專業(yè)班級: 計科1302班 學生姓名: 毛慧劍 學 號: 20131101057 指導教師: 蘇瑩 2015年8月31日至2015年9月25日華中科技大學武昌分校制 面向對象程序設計 課程設計任務書一、設計(調查報告/論文)題目貪吃蛇游戲設計與實現二、設計(調查報告/論文)主要內容內容:玩家可以通過鍵盤或鼠標控制游戲區(qū)。游戲設定不同級別,級別越高難度越大,玩家可以根據自己的需要自由設定初始游戲級別,當玩家取得的分數到達一定水平時游戲自動進入下一個級別。游戲以最終玩家獲得的分數來判斷玩家水平的高低。使

2、用Eclipse 和JDK1.6工具,操作系統為WINDOWS,采用面向對象方法完成,包括總體設計、詳細設計、編碼實現、測試。設計要求如下:游戲由模塊組成:游戲區(qū)模塊,游戲控制模塊,級別設置模塊和幫助模塊。游戲區(qū)模塊,為玩家提供主體游戲功能,能夠處理玩家的各種游戲操作,顯示得分情況,并最終顯示游戲結果。游戲控制模塊,該模塊為玩家提供游戲控制功能,應包括開始游戲,暫停游戲和退出游戲三部分功能。級別設置模塊為玩家提供自行設置游戲的初始級別功能,主要提供初級,中級和高級三個游戲初始級別設置。 三、原始資料1.面向對象程序設計課程設計指導書2. 耿祥義JAVA大學實用教程北京:清華大學出版社,2009

3、四、要求的設計(調查/論文)成果1.課程設計報告2.課程設計軟件五、進程安排布置任務,查找資料、需求分析2天總體設計1天詳細設計2天編制源程序實現4天測試與修改1天撰寫課設報告2天六、主要參考資料1 張廣彬. Java課程設計案例精編(第二版).北京:清華大學出版社, 2011. 2 耿祥義. Java課程設計(第二版).北京:清華大學出版社, 2008.3 耿祥義JAVA大學實用教程北京:清華大學出版社,20094 鄒林達陳國君 Java2程序設計基礎北京:清華大學出版社,2010指導教師(簽名): 20 年 月 日目錄1需求與總體設計11.1總體設計思路11.2系統主要功能圖11.3系統主

4、要類圖22詳細設計32.1 Login類32.2 SnakeFrame類32.3 SnakeModel類32.4 SnakePanel類32. 5 LocationRO類. .42.6 Location類.43.編碼實現43.1 Login類的詳細代碼43.2 SnakeFrame類的詳細代碼73.3 SnakeModel類的詳細代碼123.4 SnakePanel類的詳細代碼173.5 LocationRO類的詳細代碼223.6 Location類的詳細代碼234系統運行與測試254.1程序主界面254.2游戲開始界面254.3游戲操作界面254.4游戲難度設置界面264.5游戲窗口大小設置

5、274.6游戲軟件開發(fā)人員介紹275系統使用步驟28總結291需求與總體設計1.1總體設計思路 本系統要進行的是貪吃蛇游戲的開發(fā)。這個游戲是在窗口的平臺上進行相關操作的。為了滿足大部分用戶的要求,本游戲必須實現的功能有如下要求:(1)貪吃蛇游戲是大家很常見的小游戲,在生活工作之余大家可以玩它,已達到放松各種壓力的目的。 (2)游戲可以進行升級,也就是增加吃食物的難度,以便使大家更有挑戰(zhàn)性,不覺得太無趣。(3)游戲界面大小可以任意指定,數據從文件讀入。(4)利用swing實現良好的GUI界面。(5)基本功能與要求:給出1條小蛇和隨機出一個食物當小蛇吃到食物時就加分.良好的用戶界面,有分數顯示,并

6、且可調節(jié)小蛇運動速度。良好的方塊形狀設計,繪制小蛇和食物,小蛇有六個方塊組成,食物由1個方塊組成。小蛇可通過鍵盤方向鍵(上、下、左、右鍵)進行向上、向下、向左、向右移動。當小蛇吃掉一個食物后會變長,并且吃完食物時食物會消失,并立即隨即生成一個新的食物.1.2系統主要功能圖貪吃蛇實現的基本功能:生成登錄窗口界面,登錄進入游戲,可以設置游戲的窗口大小和難度等級 游戲途中有暫停 繼續(xù) 開始等基本功能。同時還設有游戲幫助等具體游戲操作指示、在加入了軟件開發(fā)人員的相關信息介紹結束游戲之后得分在窗口下自動統計得出貪吃蛇游戲設計游戲設置結束游戲得出分數 控制方向進入游戲 登陸界面 圖1-1系統功能圖1.3系

7、統主要類圖 圖1-2類圖2詳細設計2.1 Login類Login類,登陸界面要求輸入登陸者輸入用戶名和密碼,分別設Go和Cancel兩個登陸選項。 2.1.1 Login屬性: 用戶名 密碼Go(進入游戲) Cancel(取消)操作: Enter() Close()2.2 SnakeFrame類創(chuàng)建游戲窗口主界面。采用圖形界面設計,有窗體,菜單欄和游戲操作界面。2.3 SnakeModel類此類為蛇的初始化狀態(tài)及模型,所有的游戲的開始都通過此類初始化及對蛇的操作。SnakeModel屬性: rows,cols,snakeHead,runingDiriction,locRO,snake,play

8、Blocks snakeFood,gameScore,AddScore操作: LocationRO getSnakeHead(),LocationRO getSnakeTail(), Location getRuningDiriction(),LinkedList getSnake(), LinkedList getOthers(), getScore(),getAddScore(), setSnakeHead(Location snakeHead),LocationRO getSnakeFood(), setSnakeFood(),moveTo(Object a,LinkedList fro

9、mlist,LinkedList tolist), init(),SnakeModel(int rows1,int cols1),move(Location direction)2.4 SnakePanel類此類為游戲界面創(chuàng)建蛇的面板和蛇的移動控制實現SnakePanel屬性:gridsPanel, row; col; gridsPanel;direction;snake; snakeBody; otherBlocks;snakeHead; snakeFood; gameScore=0; speed; AddScore; t; isEnd; notExit;操作:SnakePanel(Snak

10、eFrame parent,int row,int col),newGame(long speed)stopGame(),returnGame(),getGameScore(),updateTextFiled(String str)updateColors(),run(),keyPressed(KeyEvent event)keyReleased(KeyEvent event),keyTyped(KeyEvent event)change(SnakeFrame parent,int row2, int col2)2.5 LocationRO類隨機生成的食物位置。用來隨機生成食物。引導蛇的移動方

11、向。2.6 Location類對蛇的位置的描述類Location屬性: x y操作:Location(int x,int y) ,getX(),getY(),setX(int x),setY(int y) ,equalOrRev(Location e),equals(Location e) ,reverse(Location e)3編碼實現1.Login類/登陸界面public class Login extends JFrame private TextField f1;/創(chuàng)建文本框private TextField f2;private JButton b1;/創(chuàng)建按鈕private JB

12、utton b2;public Login() /登陸界面Container cp=getContentPane();/獲取容器cp.setLayout(new GridLayout(4,1);/設置布局管理為網格四行一列Label l1=new Label("用戶名");/創(chuàng)建標簽了l1,l2Label l2=new Label("密 碼"); Panel p1=new Panel();/創(chuàng)建面板,p1,p2,p3,p4Panel p2=new Panel();Panel p3=new Panel();MyPanel1 p4=new MyPanel1(

13、);/創(chuàng)建插入圖片平面p4f1=new TextField(10);f2=new TextField(10);f2.setEchoChar('*');/回顯字符為* 用于輸入密碼,設置為不可見b1=new JButton("確定");/新建按鈕b1,b2b2=new JButton("取消");p1.add(l1);/第一行添加label 1p1.add(f1);p2.add(l2);p2.add(f2);p3.add(b1);p3.add(b2);cp.add(p4);/面板p4,p1,p2,p3分別加入容器cpcp.add(p1);c

14、p.add(p2);cp.add(p3);b1.addActionListener(new Enter();/添加按鈕事件響應b2.addActionListener(new Close(); JFrame.setDefaultLookAndFeelDecorated(true); SnakeFrame frame=new SnakeFrame();/創(chuàng)建游戲主界面 frame.setSize(frame.col*11+11,frame.row*11+100); frame.setResizable(false); frame.setLocation(500,200);/設置窗體位置 fram

15、e.setTitle("瘋狂貪吃蛇"); frame.setVisible(true); else JOptionPane.showMessageDialog(null, "用戶名或密碼錯誤,請重新登錄!");/錯誤用戶提示class Close implements ActionListener /關閉登陸按鈕響應public void actionPerformed(ActionEvent e) JButton bt=(JButton)e.getSource();if(bt=b2) System.exit(0);/退出/主函數 程序開始public

16、static void main(String args) Login log=new Login(); log.setTitle("瘋狂貪吃蛇界面登陸"); log.setBounds(500, 200, 300, 300); log.setBackground(Color.blue); log.setVisible(true);class MyPanel1 extends JPanel /插入登陸界面圖片Image img=Toolkit.getDefaultToolkit().getImage("imgs/201.jpg");/添加圖片public

17、 void paint(Graphics g) g.drawImage(img,0,0,this);2.SnakeFrame 類public class SnakeFrame extends JFrame implements ActionListenerint row=30;int col=45;SnakePanel p=new SnakePanel(this,row,col);JMenuBar menubar=new JMenuBar();/菜單條JMenu fileMenu=new JMenu("文件");/菜單JMenuItem newgameitem=new JM

18、enuItem("開始");/菜單條目JMenuItem stopitem=new JMenuItem("暫停");JMenuItem runitem=new JMenuItem("繼續(xù)");JMenuItem exititem=new JMenuItem("退出"); /"設置"菜單JMenu optionMenu=new JMenu("設置"); /* * 等級選項 * ButtonGroup 創(chuàng)建一組按鈕選項 * JRadioButtonMenuItem 是屬于一組菜單

19、項中的一個菜單項,該組中只能選擇一個項。 * 被選擇的項顯示其選擇狀態(tài)。選擇此項的同時,其他任何以前被選擇的項都切換到未選擇狀態(tài)。 * Panel 是最簡單的容器類。應用程序可以將其他組件放在面板提供的空間內,這些組件包括其他面板。 */ JMenu degreeMenu=new JMenu("等級"); ButtonGroup groupDegree = new ButtonGroup(); JRadioButtonMenuItem oneItem= new JRadioButtonMenuItem("初級"); JRadioButtonMenuIte

20、m twoItem= new JRadioButtonMenuItem("中級"); JRadioButtonMenuItem threeItem= new JRadioButtonMenuItem("高級"); / 設置“窗口大小”菜單 JMenu windowsMenu = new JMenu("窗口大小"); JMenu windowsMenu1 = new JMenu("視圖"); ButtonGroup groupDegree1 = new ButtonGroup(); JRadioButtonMenuI

21、tem minItem= new JRadioButtonMenuItem("小"); JRadioButtonMenuItem midItem= new JRadioButtonMenuItem("中"); JRadioButtonMenuItem maxItem= new JRadioButtonMenuItem("大"); / 設置“作者信息”菜單 JMenu XinXi=new JMenu("關于開發(fā)者"); JMenuItem XinXiItem=new JMenuItem("軟件相關"

22、;); /設置“幫助”菜單 JMenu helpMenu=new JMenu("幫助"); JMenuItem helpItem=new JMenuItem("操作指南"); /可以被選定或取消選定的菜單項. final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem("顯示網格"); JLabel scorelabel;/為分數創(chuàng)建標簽 public JTextField scoreField;/顯示分數的文本框 private long speedtime=200; p

23、rivate String helpstr = "游戲說明:n1 :方向鍵控制蛇移動的方向."+ "n2 :單擊菜單'文件->開始'開始游戲."+ "n3 :單擊菜單'文件->暫停'或者單擊鍵盤空格鍵暫停游戲."+ "n4 :單擊菜單'文件->繼續(xù)'繼續(xù)游戲."+ "n5 :單擊菜單'設置->等級'可以設置難度等級."+ "n6 :單擊菜單'設置->顯示網格'可以設置是否顯示網

24、格."+ "n7 :紅色為食物,吃一個得30分同時蛇身加長."+ "n8 :蛇不可以出界或自身相交,否則結束游戲."SnakeFrame() scoreField.setHorizontalAlignment(0);/設置圖標和文本的水平對齊方式JPanel toolPanel=new JPanel();toolPanel.add(scorelabel);toolPanel.add(scoreField);contentpane.add(toolPanel);/事件監(jiān)聽 使得按鈕可以響應 showGridItem.addActionListen

25、er(this);public void actionPerformed(ActionEvent e) / 事件響應 從接口 ActionListener 復制的描述 ,發(fā)生操作時調用。 try/異常捕獲 if(e.getSource()=helpItem) JOptionPane.showConfirmDialog(p,helpstr,"操縱說明",JOptionPane.PLAIN_MESSAGE); else if(e.getSource()=exititem) JOptionPane.showConfirmDialog(null, "你確定退出游戲嗎?&q

26、uot;, " ", JOptionPane.showMessageDialog(this,"瘋狂貪吃蛇nn武昌首義學院n信息科學與工程學院n計算機科學與技術" +"n學號:20131101057" +"n姓名: 毛慧劍n指導老師:蘇瑩n2015年9月", "軟件相關",JOptionPane.INFORMATION_MESSAGE); else if(e.getSource()=midItem) row=40;col=60; p.change(this,row,col); this.setSi

27、ze(col*11+11,row*11+100); else if(e.getSource()=maxItem) row=50;col=70; p.change(this,row,col); this.setSize(col*11+11,row*11+100); catch(Exception ee)ee.printStackTrace();/異常處理3.SnakeModelimport java.util.LinkedList;import javax.swing.JOptionPane;public class SnakeModel private int rows,cols;/行列數pr

28、ivate Location snakeHead,runingDiriction;/運行方向private LocationRO locRO;/LocationRO類數組private LinkedList snake,playBlocks;/蛇及其它區(qū)域塊private LocationRO snakeFood;/目標食物private int gameScore=0; /分數private boolean AddScore=false;/加分 /獲得蛇頭public LocationRO getSnakeHead() return (LocationRO)(snake.getLast();

29、/蛇尾public LocationRO getSnakeTail()return (LocationRO)(snake.getFirst();/運行路線public Location getRuningDiriction()return runingDiriction;/獲得蛇實體區(qū)域public LinkedList getSnake()return snake;private void setSnakeHead(Location snakeHead)this.snakeHead=snakeHead; /獲得目標食物public LocationRO getSnakeFood()retur

30、n snakeFood;/隨機設置目標食物private void moveTo(Object a,LinkedList fromlist,LinkedList tolist)fromlist.remove(a);tolist.add(a); public void init()playBlocks.clear();snake.clear();gameScore=0; for(int i=0;i<rows;i+) for(int j=0;j<cols;j+) playBlocks.add(locROij); /初始化蛇的形狀 for(int i=4;i<6;i+) moveT

31、o(locRO4i,playBlocks,snake); /蛇頭位置 snakeHead=new Location(4,6); /設置隨機塊 snakeFood=new LocationRO(0,0); setSnakeFood(); /初始化運動方向 init();/ /*定義布爾型move方法,如果運行成功則返回true,否則返回false/*參數direction是Location類型,/*direction 的值:(-1,0)表示向上;(1,0)表示向下;/*(0,-1)表示向左;(0,1)表示向右;/*/public boolean move(Location direction)/

32、判斷設定的方向跟運行方向是不是相反if (direction.reverse(runingDiriction)snakeHead.setX(snakeHead.getX()+runingDiriction.getX();snakeHead.setY(snakeHead.getY()+runingDiriction.getY();elsesnakeHead.setX(snakeHead.getX()+direction.getX();snakeHead.setY(snakeHead.getY()+direction.getY();/如果蛇吃到了目標食物tryif (snakeHead.getX(

33、)=snakeFood.getX()&&(snakeHead.getY()=snakeFood.getY()moveTo(locROsnakeHead.getX()snakeHead.getY(),playBlocks,snake);setSnakeFood();gameScore+=30;AddScore=true;elseAddScore=false;/是否出界if(snakeHead.getX()<rows)&&(snakeHead.getY()<cols)&&(snakeHead.getX()>=0&&(

34、snakeHead.getY()>=0)/如果不出界,判斷是否與自身相交if(snake.contains(locROsnakeHead.getX()snakeHead.getY()/如果相交,結束游戲JOptionPane.showMessageDialog(null, "Game Over!", "游戲結束", JOptionPane.INFORMATION_MESSAGE);return false;else/如果不相交,就把snakeHead加到snake里面,并且把尾巴移出moveTo(locROsnakeHead.getX()snake

35、Head.getY(),playBlocks,snake);moveTo(snake.getFirst(),snake,playBlocks);elsereturn true;4、SnakePanel類public class SnakePanel extends JPanel implements Runnable,KeyListenerJFrame parent=new JFrame();private int row; /網格行數 30-341 60-671 40-451private int col; /列數private JPanel gridsPanel; /面板網格private

36、 Location direction;/方向定位private SnakeModel snake; /貪吃蛇private LinkedList snakeBody; /蛇的身體private LinkedList otherBlocks; /其他區(qū)域private LocationRO snakeHead; /蛇的頭部private LocationRO snakeFood; /目標食物private Color bodyColor=Color.blue;/蛇的身體顏色private Color headColor=Color.red; /蛇的頭部顏色private Color foodC

37、olor=Color.pink; /目標食物顏色private Color othersColor=Color.white;/其他區(qū)域顏色private int gameScore=0; /總分private long speed; /速度(難度設置)private boolean AddScore;/加分private Thread t; /線程private boolean isEnd; /暫停private static boolean notExit; /構造器,初始化操作public SnakePanel(SnakeFrame parent,int row,int col)chang

38、e(parent,row,col); /開始游戲public void newGame(long speed)this.speed=speed;if (notExit) snake.init();/初始化elserequestFocus();direction.setX(0);direction.setY(1);gameScore=0;updateTextFiled(""+gameScore);isEnd=false; /暫停游戲public void stopGame()requestFocus();isEnd=true; /繼續(xù)public void returnGam

39、e()requestFocus();isEnd=false; /獲得總分public int getGameScore()return gameScore;/更新總分private void updateTextFiled(String str)(SnakeFrame)parent).scoreField.setText(str);/更新各相關單元顏色private void updateColors() / 設定蛇身顏色snakeBody=snake.getSnake();Iterator i =snakeBody.iterator();while(i.hasNext()LocationRO

40、 t=(LocationRO)(i.next();gridsPanelt.getX()t.getY().setBackground(bodyColor);/設定蛇頭顏色snakeHead=snake.getSnakeHead();gridsPanelsnakeHead.getX()snakeHead.getY().setBackground(headColor);/設定背景顏色otherBlocks=snake.getOthers();i =otherBlocks.iterator();while(i.hasNext()LocationRO t=(LocationRO)(i.next();gr

41、idsPanelt.getX()t.getY().setBackground(othersColor);/設定臨時塊的顏色/實現Runnable接口public void run() while(true)tryThread.sleep(speed);catch (InterruptedException e) if(!isEnd)isEnd=!snake.move(direction);updateColors(); if(snake.getAddScore()gameScore+=10;updateTextFiled(""+gameScore);/實現KeyListen

42、er接口public void keyPressed(KeyEvent event) int keyCode = event.getKeyCode(); if(notExit) if (keyCode = KeyEvent.VK_LEFT) /向左 direction.setX(0); direction.setY(-1); else if (keyCode = KeyEvent.VK_RIGHT) /向右 direction.setX(0); direction.setY(1); else if (keyCode = KeyEvent.VK_UP) /向上 direction.setX(-1

43、); direction.setY(0); else if (keyCode = KeyEvent.VK_DOWN) /向下 direction.setX(1); direction.setY(0); else if (keyCode = KeyEvent.VK_SPACE) /空格鍵 isEnd=!isEnd;public void keyReleased(KeyEvent event)public void keyTyped(KeyEvent event)public void change(SnakeFrame parent,int row2, int col2) this.row=ro

44、w2;this.col=col2;this.parent=parent;gridsPanel=new JPanelrowcol;5. LocationRO類public class LocationRO private int x;private int y;LocationRO(int x,int y) this.x=x;this.y=y;int getX() return x; int getY()return y;public boolean equalOrRev(LocationRO e) return (e.getX()=getX()&&(e.getY()=getY()|(e.getX()=getX()&&(e.getY()=-1*getY()|(e.getX()=-1*getX()&&(e.getY()=getY();public boolean equals(LocationRO e) return(e.getX()=getX()&&(e.getY()=getY();public boolean reverse(LocationR

溫馨提示

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

評論

0/150

提交評論