《Java 》课程设计报告模板.doc
南京晓庄学院JAVA程序设计课程设计报告题 目:贪吃蛇游戏系统的设计与实现姓 名:刘婷婷 学 号: 班 级:12软转1班 指导教师:王铮 完成时间2015年6月25号 成 绩:信息工程学院2015年6月目录1 引言11.1 系统开发背景11.2 完成的主要工作12需求分析和总体设计22.1 需求分析与设计思路22.1.1关键技术说明22.1.2需求分析2213系统目录结构说明22.2 系统功能设计22.2.1 蛇、食物的表示22.2.2 蛇的移动32.2.3 蛇的移动方向32.2.4 如何显示蛇身32.2.5 蛇身的移动方向32.2.6 吃到食物的判定33.1 系统模块实现43.1.1 英雄榜模块实现43.1.2 自定义模块实现83.1.3 计时器模块实现113.1.4 外挂模块实现11其实我是这学期才开始接触Java语言,所以做出这个游戏对我来说还蛮难的,其次,eclipse这个软件我也只是在刚结束的软件开发综述的课程里刚接触,所以做这个游戏的一开始很难,什么都要不停的请教同学,在做这个游戏的过程中也是不断查阅文献资料来完成的。做这个游戏过程中,我觉得最简单的应该算是计时器模块,最难得就是自定义模块,虽然设计内容繁多,过程繁琐但我的收获却更加丰富。124系统运行界面13游戏开始界面13点击高级,出现16*30界面,左边显示雷数:9914点击自定义15点击排行榜15游戏成功16游戏开始点击外挂,标记处雷区175 课程设计总结18扫雷游戏系统的设计与实现1 引言1.1 系统开发背景贪吃蛇是世界知名的益智类小游戏,选择这个题目一方面的原因是为了将我们自己的所学知识加以运用;另一方面,虽然很小就接触这个游戏,但是它的制作方法对我们而言还是很神秘的。我们希望通过自己的所学知识把它剖析开来,通过自己的动手实践,真正的了解它的本质和精髓。希望通过这次实践,我们能从中提高自己的编程能力。并从中学会从零开始分析设计程序。本游戏的开发语言为Java。开发工具选用EclipseJava是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。这里采用Java作为开发语言主要是基于Java的面向对象和可移植性。Eclipse 是一个开放源代码的、基于Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。1.2 完成的主要工作本系统主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求:(1) 利用方向键来改变蛇的运行方向。(2) 空格键暂停或继续游戏,并在随机的地方产生食物。(3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。2需求分析和总体设计2.1 需求分析与设计思路 2.1.1关键技术说明 贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。 贪吃蛇的核心算法时如何实现移动和吃掉食物,没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。 本次设计我将主要运用java语言来完成。Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同的软硬件平台上运行。2.1.2需求分析本软件是针对贪吃蛇小游戏的Java程序,利用方向键来改变蛇的运行方向,空格键暂停或继续游戏,并在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。213系统目录结构说明对系统包结构、文件结构列表说明,如表2-1、2-2所示。表2-1文件名作用Dir.java指蛇的运动方向Egg.java代表食物,实现组成蛇身的单位-食物Snack.java代表蛇,该文件实现蛇类Yard.java代表蛇的活动区域2.2 系统功能设计2.2.1 蛇、食物的表示 我们可以把显示区域想象成一个大大地表格,里面的格子就是组成蛇的基本单位,一个格子代表一个食物,也可以代表蛇身的一部分,几块连在一起就是一条蛇。2.2.2 蛇的移动蛇向前移动一步,可以看作是蛇头前面增加了一个节点,蛇的尾巴上少了一个节点(即去尾部加头部)2.2.3 蛇的移动方向这里讨论蛇的移动方向控制。蛇的下一步移动到哪里,是由方向来控制的。这里我们用L,U,R,D代表蛇运动的4个方向。2.2.4 如何显示蛇身显示蛇身,其实就是填充,即用颜色填充格子。2.2.5 蛇身的移动方向(1) 相反方向 和上一次移动的方向相反的方向是相反方向,这种输入应该被忽略。这样可以防止蛇从自己的身体中穿过。(2) 无效方向 在蛇的这一次移动之后和下一次移动之前这个时间间隔内输入多个非相反方向,只是最后一个是有效方向,其他的都是无效方向。 蛇的最终运动方向以有效方向为准。2.2.6 吃到食物的判定 这里是判定蛇头是否和食物重合就可以了,因为蛇的身体都是走蛇头走过的地方。3详细设计3.1 系统模块实现3.1.1 英雄榜模块实现一、 实现原理点击游戏菜单下的扫雷英雄榜,弹出排行榜,有相应等级(初级、中级、高级)和成绩(扫雷完成时间)及玩家姓,开始时成绩都为999,玩家都为匿名,顺利完成一局扫雷后会自动弹出 提示框提示输入姓名,提交后再次打开排行榜,刚刚提交的等级,成绩和玩家会改变和保存。二、 关键代码分析public class ShowWin extends JDialog private JLabel jlabel1;/级别、成绩、玩家标签private JLabel jlabel2;private JLabel jlabel3;private JLabel jlabel4;/初、中、高三个级别标签private JLabel jlabel5;private JLabel jlabel6;private JLabel time1;/初、中、高三个最短时间private JLabel time2;private JLabel time3;private JLabel name1;/初、中、高三个最短时间玩家姓名private JLabel name2;private JLabel name3;private JButton jbutton1;/确定和重新设置2个按钮private JButton jbutton2;private SartFrame sartsrame;private JPanel jpanel;public ShowWin(SartFrame sartsrame)this.sartsrame=sartsrame;this.setTitle("扫雷排行榜");/左上角对话框名字this.setVisible(true);this.setSize(220,210);/设置对话框长和宽this.setResizable(false);this.setLocationRelativeTo(sartsrame);this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);init();public JLabel getJLabel1() return jlabel1;public void setJLabel1(JLabel jlabel1) this.jlabel1 = jlabel1;public JLabel getJLabel2() return jlabel2;public void setJLabel2(JLabel jlabel2) this.jlabel2 = jlabel2;public JLabel getJLabel3() return jlabel3;public void setJLabel3(JLabel jlabel3) this.jlabel3 = jlabel3;public JLabel getJLabel4() return jlabel4;public void setJLabel4(JLabel jlabel4) this.jlabel4 = jlabel4;public JLabel getJLabel5() return jlabel5;public void setJLabel5(JLabel jlabel5) this.jlabel5 = jlabel5;public JLabel getJLabel6() return jlabel6;public void setJLabel6(JLabel jlabel6) this.jlabel6 = jlabel6;public JLabel getTime1() return time1;public void setTime1(JLabel time1) this.time1 = time1;public JLabel getTime2() return time2;public void setTime2(JLabel time2) this.time2 = time2;public JLabel getTime3() return time3;public void setTime3(JLabel time3) this.time3 = time3;public JLabel getName1() return name1;public void setName1(JLabel name1) this.name1 = name1;public JLabel getName2() return name2;public void setName2(JLabel name2) this.name2 = name2;public JLabel getName3() return name3;public void setName3(JLabel name3) this.name3 = name3;public void init()HeroListener heroListener = new HeroListener();jlabel1 = new JLabel(" 级别");jlabel2 = new JLabel(" 成绩");jlabel3 = new JLabel(" 玩家");jlabel4 = new JLabel(" 初级:");jlabel5 = new JLabel(" 中级:");jlabel6 = new JLabel(" 高级:");time1 = new JLabel(""+Tools.time1);time2 = new JLabel(""+Tools.time2);time3 = new JLabel(""+Tools.time3);name1 = new JLabel(" "+Tools.name1);name2 = new JLabel(" "+Tools.name2);name3 = new JLabel(" "+Tools.name3);jbutton1=new JButton("确定");jbutton1.addActionListener(heroListener);jbutton2=new JButton("重新设置");jbutton2.addActionListener(heroListener);jpanel=new JPanel();Box box1 = Box.createVerticalBox();/设置级别和初中高级四个位置在垂直方向box1.add(jlabel1);box1.add(Box.createVerticalStrut(10);box1.add(jlabel4);box1.add(Box.createVerticalStrut(10);box1.add(jlabel5);box1.add(Box.createVerticalStrut(10);box1.add(jlabel6);Box box2 = Box.createVerticalBox();/设置成绩和三个级别最短时间位置在垂直方向box2.add(jlabel2);box2.add(Box.createVerticalStrut(10);box2.add(time1);box2.add(Box.createVerticalStrut(10);box2.add(time2);box2.add(Box.createVerticalStrut(10);box2.add(time3);Box box3 = Box.createVerticalBox();/设置玩家和三级别用时最短玩家姓在垂直方向box3.add(jlabel3);box3.add(Box.createVerticalStrut(10);box3.add(name1);box3.add(Box.createVerticalStrut(10);box3.add(name2);box3.add(Box.createVerticalStrut(10);box3.add(name3);Box box4 = Box.createHorizontalBox();/设置确定按钮水平方向位置box4.add(jbutton1); box4.add(Box.createHorizontalStrut(20); /设置重新设置按钮水平方向位置box4.add(jbutton2);Box box5 = Box.createHorizontalBox();box5.add(box1);box5.add(box2);box5.add(box3);Box box6 = Box.createVerticalBox();box6.add(Box.createVerticalStrut(20);box6.add(box5);box6.add(Box.createVerticalStrut(20);box6.add(box4);jpanel.add(box6);this.add(jpanel);class HeroListener implements ActionListenerpublic void actionPerformed(ActionEvent e)String command = e.getActionCommand();/确定按钮命令处理if(command.equals("确定")dispose();/重新设置按钮命令处理else Tools.time1 = 999;Tools.time2 = 999;Tools.time3 = 999;Tools.name1 = " 匿名"Tools.name2 = " 匿名"Tools.name3 = " 匿名"time1.setText(""+Tools.time1);name1.setText(Tools.name1);time2.setText(""+Tools.time2);name2.setText(Tools.name2);time3.setText(""+Tools.time3);name3.setText(Tools.name3);/dispose();3.1.2 自定义模块实现一、 实现原理点击游戏菜单下的自定义,用户可自行定义雷区的行数、列数和雷数,行数和列数需大于9小于30有效,雷数大于等于10小于总格数的4/5有效,否则会弹出相应警告。确定后生成新的雷区。二、 关键代码分析public class About extends JDialog private JLabel labx,laby,labmine;/行列数和雷数private JTextField jTextField1,jTextField2,jTextField3;/三个文本框private JButton butyes,butno;/确定和取消两个按钮SartFrame sartFrame;public About(SartFrame sartFrame) this.sartFrame = sartFrame;this.setTitle("");/设置对话框标题为空this.setLocationRelativeTo(null);/设置相对位置值this.setModal(true);this.setSize(new Dimension(200,200);/设置自定义对话框长宽/this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.init();/初始化this.setVisible(true);/可见private void init() / TODO 自动生成方法存根JPanel jPanel = new JPanel(); labx = new JLabel(""); jTextField1=new JTextField(12); /设置行数的文本字段长度 jTextField2=new JTextField(12); /设置列数的文本字段长度 jTextField3=new JTextField(12); /设置雷数的文本字段长度 JLabel jLabelTotalx=new JLabel("行数:");/行数、列数、雷数三个标签 JLabel jLabelTotaly=new JLabel("列数:"); JLabel jLabelTotalMine=new JLabel("雷数:");jPanel.add(jLabelTotalx);jPanel.add(jTextField1);/ jTextField1排在行数后面jPanel.add(jLabelTotaly);jPanel.add(jTextField2); / jTextField2排在列数后面jPanel.add(jLabelTotalMine);jPanel.add(jTextField3); / jTextField3排在雷数后面butyes = new JButton("确定");/面板上加上确定和取消两个按钮butno = new JButton("取消");jPanel.add(butyes);jPanel.add(butno);/确定按钮功能实现,根据自定义设置生成新的雷区butyes.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) try Tools.totalx=Integer.parseInt(jTextField1.getText();Tools.totaly=Integer.parseInt(jTextField2.getText();Tools.totalMine=Integer.parseInt(jTextField3.getText();/行列数必须大于9小于30才有效if(Tools.totalx>9&&Tools.totalx<30)if(Tools.totaly>9&&Tools.totaly<30)/雷数大于等于10小于行列数的乘积(即所有格子)的4/5才有效if(Tools.totalMine>=10&&Tools.totalMine<Tools.totalx*Tools.totaly*4/5)sartFrame.restart();About.this.dispose();/满足行列数和雷数条件生成新的雷区/出错情况提示elseJOptionPane.showMessageDialog(null, "布雷有误请重试!n布雷数应少于总格子数!", "提示消息", JOptionPane.NO_OPTION);else JOptionPane.showMessageDialog(null, "您输入的列数有误n请重试!", "提示消息", JOptionPane.NO_OPTION);else JOptionPane.showMessageDialog(null, "您输入的行数有误n请重试!", "提示消息", JOptionPane.NO_OPTION); catch (Exception e2) JOptionPane.showMessageDialog(null, "必须是数字类型", "提示消息", JOptionPane.NO_OPTION);return;);/点击取消按钮执行命令butno.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) About.this.dispose(););this.add(jPanel);3.1.3 计时器模块实现一 、 实现原理游戏开始点击雷区开始计时,从左到右读数分别为百秒,十秒,秒游戏结束计时器停止,最多纪录999秒,超过时间按999秒计算。二 、 关键代码分析public class Timers implements ActionListenerprivate int times;/定义时间MineState mineState; public Timers(MineState mineState)this.mineState = mineState;Overridepublic void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stubTools.time+;if(Tools.time>999)Tools.time=999;/用时最多999s,超过按999算elseint g = Tools.time%10;/定义秒int s = Tools.time/10%10;/定义十秒int b = Tools.time/100;/定义百秒mineState.getUsedtimeG().setIcon(Tools.timeCountg); /显示秒mineState.getUsedtimeS().setIcon(Tools.timeCounts); /显示十秒mineState.getUsedtimeB().setIcon(Tools.timeCountb); /显示百秒3.1.4 外挂模块实现一 、 实现原理游戏开始后点击帮助菜单下的外挂,游戏自行判断,雷区的雷都会被标记出来。二 、 关键代码分析JMenuItem weiGuaItem = new JMenuItem("外挂(W)");aboutMenu.add(weiGuaItem);weiGuaItem.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (MineMenu.this.sartFrame.isStart() / 判断每一个雷块是否是雷for (MineLabel mineLabel : MineMenu.this.sartFrame.getMineField().getMineLabel() for (MineLabel m : mineLabel) if (m.isMine() m.setIcon(Tools.iihole);/如果是雷进行标记);三、 分析总结其实我是这学期才开始接触Java语言,所以做出这个游戏对我来说还蛮难的,其次,eclipse这个软件我也只是在刚结束的软件开发综述的课程里刚接触,所以做这个游戏的一开始很难,什么都要不停的请教同学,在做这个游戏的过程中也是不断查阅文献资料来完成的。做这个游戏过程中,我觉得最简单的应该算是计时器模块,最难得就是自定义模块,虽然设计内容繁多,过程繁琐但我的收获却更加丰富。4系统运行界面游戏开始界面点击上方笑脸开始,显示初级9*9界面,左边显示雷数:10点击游戏菜单点击中级,出现16*15界面,左边显示雷数:40点击高级,出现16*30界面,左边显示雷数:99点击自定义点击排行榜游戏成功再次点击英雄榜游戏开始点击外挂,标记处雷区5 课程设计总结 课程设计可以说是对我大学4年学习成果的考核和总结。在这段时间里我通过自己的努力以及王老师的耐心指导,本着严谨求实、开拓创新的精神,完成了这次课程设计。这次设计是我从理论构思到实际工程论证的设计,它使我更深刻的理解了在大学里学到的知识。让我把大学里所学的知识从头梳理和使用了一遍,巩固了我的知识,也接触到一些未曾接触过的东西,收获不浅。参考文献1王李超J ava设计扫雷游戏M 百度文库,2015.2JAVAjby扫雷小游戏M 源码天空,2015.