《贪吃蛇课程设计.doc》由会员分享,可在线阅读,更多相关《贪吃蛇课程设计.doc(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date贪吃蛇课程设计 小型软件开发 面向对象程序设计课程设计报告题 目: 贪吃蛇游戏设计与实现 院 (系): 信息科学与工程学院 专业班级: 计科1302班 学生姓名: 毛慧剑 学 号: 20131101057 指导教师: 苏莹 2015年8月31日至2015年9月25日华中科技大学武昌分校制 面向对象程序设计 课程设计任务书一、设计(调查报告/论文)题目贪吃蛇游戏设计与实
2、现二、设计(调查报告/论文)主要内容内容:玩家可以通过键盘或鼠标控制游戏区。游戏设定不同级别,级别越高难度越大,玩家可以根据自己的需要自由设定初始游戏级别,当玩家取得的分数到达一定水平时游戏自动进入下一个级别。游戏以最终玩家获得的分数来判断玩家水平的高低。使用Eclipse 和JDK1.6工具,操作系统为WINDOWS,采用面向对象方法完成,包括总体设计、详细设计、编码实现、测试。设计要求如下:游戏由模块组成:游戏区模块,游戏控制模块,级别设置模块和帮助模块。游戏区模块,为玩家提供主体游戏功能,能够处理玩家的各种游戏操作,显示得分情况,并最终显示游戏结果。游戏控制模块,该模块为玩家提供游戏控制
3、功能,应包括开始游戏,暂停游戏和退出游戏三部分功能。级别设置模块为玩家提供自行设置游戏的初始级别功能,主要提供初级,中级和高级三个游戏初始级别设置。 三、原始资料1.面向对象程序设计课程设计指导书2. 耿祥义JAVA大学实用教程北京:清华大学出版社,2009四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计软件五、进程安排布置任务,查找资料、需求分析2天总体设计1天详细设计2天编制源程序实现4天测试与修改1天撰写课设报告2天六、主要参考资料1 张广彬. Java课程设计案例精编(第二版).北京:清华大学出版社, 2011. 2 耿祥义. Java课程设计(第二版).北京:清华大学出版
4、社, 2008.3 耿祥义JAVA大学实用教程北京:清华大学出版社,20094 邹林达陈国君 Java2程序设计基础北京:清华大学出版社,2010指导教师(签名): 20 年 月 日目录1需求与总体设计11.1总体设计思路11.2系统主要功能图11.3系统主要类图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
5、.4 SnakePanel类的详细代码173.5 LocationRO类的详细代码223.6 Location类的详细代码234系统运行与测试254.1程序主界面254.2游戏开始界面254.3游戏操作界面254.4游戏难度设置界面264.5游戏窗口大小设置274.6游戏软件开发人员介绍275系统使用步骤28总结29-1需求与总体设计1.1总体设计思路 本系统要进行的是贪吃蛇游戏的开发。这个游戏是在窗口的平台上进行相关操作的。为了满足大部分用户的要求,本游戏必须实现的功能有如下要求:(1)贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松各种压力的目的。 (2)游戏可以进行
6、升级,也就是增加吃食物的难度,以便使大家更有挑战性,不觉得太无趣。(3)游戏界面大小可以任意指定,数据从文件读入。(4)利用swing实现良好的GUI界面。(5)基本功能与要求:给出1条小蛇和随机出一个食物当小蛇吃到食物时就加分.良好的用户界面,有分数显示,并且可调节小蛇运动速度。良好的方块形状设计,绘制小蛇和食物,小蛇有六个方块组成,食物由1个方块组成。小蛇可通过键盘方向键(上、下、左、右键)进行向上、向下、向左、向右移动。当小蛇吃掉一个食物后会变长,并且吃完食物时食物会消失,并立即随即生成一个新的食物.1.2系统主要功能图贪吃蛇实现的基本功能:生成登录窗口界面,登录进入游戏,可以设置游戏的
7、窗口大小和难度等级 游戏途中有暂停 继续 开始等基本功能。同时还设有游戏帮助等具体游戏操作指示、在加入了软件开发人员的相关信息介绍结束游戏之后得分在窗口下自动统计得出贪吃蛇游戏设计游戏设置结束游戏得出分数 控制方向进入游戏 登陆界面 图1-1系统功能图1.3系统主要类图 图1-2类图2详细设计2.1 Login类Login类,登陆界面要求输入登陆者输入用户名和密码,分别设Go和Cancel两个登陆选项。 2.1.1 Login属性: 用户名 密码Go(进入游戏) Cancel(取消)操作: Enter() Close()2.2 SnakeFrame类创建游戏窗口主界面。采用图形界面设计,有窗体
8、,菜单栏和游戏操作界面。2.3 SnakeModel类此类为蛇的初始化状态及模型,所有的游戏的开始都通过此类初始化及对蛇的操作。SnakeModel属性: rows,cols,snakeHead,runingDiriction,locRO,snake,playBlocks snakeFood,gameScore,AddScore操作: LocationRO getSnakeHead(),LocationRO getSnakeTail(), Location getRuningDiriction(),LinkedList getSnake(), LinkedList getOthers(), g
9、etScore(),getAddScore(), setSnakeHead(Location snakeHead),LocationRO getSnakeFood(), setSnakeFood(),moveTo(Object a,LinkedList fromlist,LinkedList tolist), init(),SnakeModel(int rows1,int cols1),move(Location direction)2.4 SnakePanel类此类为游戏界面创建蛇的面板和蛇的移动控制实现SnakePanel属性:gridsPanel, row; col; gridsPane
10、l;direction;snake; snakeBody; otherBlocks;snakeHead; snakeFood; gameScore=0; speed; AddScore; t; isEnd; notExit;操作:SnakePanel(SnakeFrame parent,int row,int col),newGame(long speed)stopGame(),returnGame(),getGameScore(),updateTextFiled(String str)updateColors(),run(),keyPressed(KeyEvent event)keyRele
11、ased(KeyEvent event),keyTyped(KeyEvent event)change(SnakeFrame parent,int row2, int col2)2.5 LocationRO类随机生成的食物位置。用来随机生成食物。引导蛇的移动方向。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编码实
12、现1.Login类/登陆界面public class Login extends JFrame private TextField f1;/创建文本框private TextField f2;private JButton b1;/创建按钮private JButton b2;public Login() /登陆界面Container cp=getContentPane();/获取容器cp.setLayout(new GridLayout(4,1);/设置布局管理为网格四行一列Label l1=new Label(用户名);/创建标签了l1,l2Label l2=new Label(密 码);
13、 Panel p1=new Panel();/创建面板,p1,p2,p3,p4Panel p2=new Panel();Panel p3=new Panel();MyPanel1 p4=new MyPanel1();/创建插入图片平面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
14、(f2);p3.add(b1);p3.add(b2);cp.add(p4);/面板p4,p1,p2,p3分别加入容器cpcp.add(p1);cp.add(p2);cp.add(p3);b1.addActionListener(new Enter();/添加按钮事件响应b2.addActionListener(new Close(); JFrame.setDefaultLookAndFeelDecorated(true); SnakeFrame frame=new SnakeFrame();/创建游戏主界面 frame.setSize(frame.col*11+11,frame.row*11+
15、100); frame.setResizable(false); frame.setLocation(500,200);/设置窗体位置 frame.setTitle(疯狂贪吃蛇); frame.setVisible(true); else JOptionPane.showMessageDialog(null, 用户名或密码错误,请重新登录!);/错误用户提示class Close implements ActionListener /关闭登陆按钮响应public void actionPerformed(ActionEvent e) JButton bt=(JButton)e.getSourc
16、e();if(bt=b2) System.exit(0);/退出/主函数 程序开始public 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(i
17、mgs/201.jpg);/添加图片public 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 newgam
18、eitem=new JMenuItem(开始);/菜单条目JMenuItem stopitem=new JMenuItem(暂停);JMenuItem runitem=new JMenuItem(继续);JMenuItem exititem=new JMenuItem(退出); /设置菜单JMenu optionMenu=new JMenu(设置); /* * 等级选项 * ButtonGroup 创建一组按钮选项 * JRadioButtonMenuItem 是属于一组菜单项中的一个菜单项,该组中只能选择一个项。 * 被选择的项显示其选择状态。选择此项的同时,其他任何以前被选择的项都切换到未
19、选择状态。 * Panel 是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板。 */ JMenu degreeMenu=new JMenu(等级); ButtonGroup groupDegree = new ButtonGroup(); JRadioButtonMenuItem oneItem= new JRadioButtonMenuItem(初级); JRadioButtonMenuItem twoItem= new JRadioButtonMenuItem(中级); JRadioButtonMenuItem threeItem= new JRadioB
20、uttonMenuItem(高级); / 设置“窗口大小”菜单 JMenu windowsMenu = new JMenu(窗口大小); JMenu windowsMenu1 = new JMenu(视图); ButtonGroup groupDegree1 = new ButtonGroup(); JRadioButtonMenuItem minItem= new JRadioButtonMenuItem(小); JRadioButtonMenuItem midItem= new JRadioButtonMenuItem(中); JRadioButtonMenuItem maxItem= n
21、ew JRadioButtonMenuItem(大); / 设置“作者信息”菜单 JMenu XinXi=new JMenu(关于开发者); JMenuItem XinXiItem=new JMenuItem(软件相关); /设置“帮助”菜单 JMenu helpMenu=new JMenu(帮助); JMenuItem helpItem=new JMenuItem(操作指南); /可以被选定或取消选定的菜单项. final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem(显示网格); JLabel scorelabel;/为分数创
22、建标签 public JTextField scoreField;/显示分数的文本框 private long speedtime=200; private String helpstr = 游戏说明:n1 :方向键控制蛇移动的方向.+ n2 :单击菜单文件-开始开始游戏.+ n3 :单击菜单文件-暂停或者单击键盘空格键暂停游戏.+ n4 :单击菜单文件-继续继续游戏.+ n5 :单击菜单设置-等级可以设置难度等级.+ n6 :单击菜单设置-显示网格可以设置是否显示网格.+ n7 :红色为食物,吃一个得30分同时蛇身加长.+ n8 :蛇不可以出界或自身相交,否则结束游戏.;SnakeFrame
23、() scoreField.setHorizontalAlignment(0);/设置图标和文本的水平对齐方式JPanel toolPanel=new JPanel();toolPanel.add(scorelabel);toolPanel.add(scoreField);contentpane.add(toolPanel);/事件监听 使得按钮可以响应 showGridItem.addActionListener(this);public void actionPerformed(ActionEvent e) / 事件响应 从接口 ActionListener 复制的描述 ,发生操作时调用。
24、 try/异常捕获 if(e.getSource()=helpItem) JOptionPane.showConfirmDialog(p,helpstr,操纵说明,JOptionPane.PLAIN_MESSAGE); else if(e.getSource()=exititem) JOptionPane.showConfirmDialog(null, 你确定退出游戏吗?, , JOptionPane.showMessageDialog(this,疯狂贪吃蛇nn武昌首义学院n信息科学与工程学院n计算机科学与技术 +n学号:20131101057 +n姓名: 毛慧剑n指导老师:苏莹n2015年9
25、月, 软件相关,JOptionPane.INFORMATION_MESSAGE); else if(e.getSource()=midItem) row=40;col=60; p.change(this,row,col); this.setSize(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
26、.SnakeModelimport java.util.LinkedList;import javax.swing.JOptionPane;public class SnakeModel private int rows,cols;/行列数private Location snakeHead,runingDiriction;/运行方向private LocationRO locRO;/LocationRO类数组private LinkedList snake,playBlocks;/蛇及其它区域块private LocationRO snakeFood;/目标食物private int gam
27、eScore=0; /分数private boolean AddScore=false;/加分 /获得蛇头public LocationRO getSnakeHead() return (LocationRO)(snake.getLast();/蛇尾public LocationRO getSnakeTail()return (LocationRO)(snake.getFirst();/运行路线public Location getRuningDiriction()return runingDiriction;/获得蛇实体区域public LinkedList getSnake()return
28、 snake;private void setSnakeHead(Location snakeHead)this.snakeHead=snakeHead; /获得目标食物public LocationRO getSnakeFood()return snakeFood;/随机设置目标食物private void moveTo(Object a,LinkedList fromlist,LinkedList tolist)fromlist.remove(a);tolist.add(a); public void init()playBlocks.clear();snake.clear();gameS
29、core=0; for(int i=0;irows;i+) for(int j=0;jcols;j+) playBlocks.add(locROij); /初始化蛇的形状 for(int i=4;i6;i+) moveTo(locRO4i,playBlocks,snake); /蛇头位置 snakeHead=new Location(4,6); /设置随机块 snakeFood=new LocationRO(0,0); setSnakeFood(); /初始化运动方向 init();/ /*定义布尔型move方法,如果运行成功则返回true,否则返回false/*参数direction是Loc
30、ation类型,/*direction 的值:(-1,0)表示向上;(1,0)表示向下;/*(0,-1)表示向左;(0,1)表示向右;/*/public boolean move(Location direction)/判断设定的方向跟运行方向是不是相反if (direction.reverse(runingDiriction)snakeHead.setX(snakeHead.getX()+runingDiriction.getX();snakeHead.setY(snakeHead.getY()+runingDiriction.getY();elsesnakeHead.setX(snakeH
31、ead.getX()+direction.getX();snakeHead.setY(snakeHead.getY()+direction.getY();/如果蛇吃到了目标食物tryif (snakeHead.getX()=snakeFood.getX()&(snakeHead.getY()=snakeFood.getY()moveTo(locROsnakeHead.getX()snakeHead.getY(),playBlocks,snake);setSnakeFood();gameScore+=30;AddScore=true;elseAddScore=false;/是否出界if(snak
32、eHead.getX()rows)&(snakeHead.getY()=0&(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.
33、getX()snakeHead.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; /
34、面板网格private Location direction;/方向定位private SnakeModel snake; /贪吃蛇private LinkedList snakeBody; /蛇的身体private LinkedList otherBlocks; /其他区域private LocationRO snakeHead; /蛇的头部private LocationRO snakeFood; /目标食物private Color bodyColor=Color.blue;/蛇的身体颜色private Color headColor=Color.red; /蛇的头部颜色private
35、Color foodColor=Color.pink; /目标食物颜色private Color othersColor=Color.white;/其他区域颜色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,in
36、t col)change(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; /继续public void returnGame
37、()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
38、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();gri
39、dsPanelt.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);/实现KeyListener接口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);
限制150内