欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    软件工程课设(共34页).docx

    • 资源ID:14056699       资源大小:433.29KB        全文页数:33页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    软件工程课设(共34页).docx

    精选优质文档-倾情为你奉上滨江学院软件工程课程设计题 目 俄罗斯方块游戏实现专业班级: 14软件1 学生姓名: 陆嘉纯学 号: 指导教师: 李振宏学 期: 15-16第2学期专心-专注-专业目录1. 课程设计概述62. 项目的可行性研究与需求分析62.1 项目可行性研究62.1.1 技术可行性62.1.2 经济可行性62.1.3 操作可行性73、项目设计的基本原理和采用的主要方法与技术73.1 设计基本原理73.2主要方法和技术73.2.1 键盘监听73.2.2 重绘73.2.3 形态方块的数组设置73.2.4 定时器设置线程73.2.5 方块的变形与消行84. 总体设计84.1 总体设计方案84.2 模块设计图84.2.1 MVC设计模型图84.3 模块说明84.3.1 模型层功能模块设计94.3.2 视图层功能模块设计94.3.3 控制层功能模块设计105. 详细设计105.1 模型层设计115.1.1 产生图形115.1.2 产生地图115.2 视图层设计125.2.1 方块的显示135.2.2 分数的显示135.3 控制层设计145.3.1 方块的移动与变形156. 编码实现176.1 游戏界面演示186.2 消行并得分演示186.3 游戏结束演示197. 测试用例设计、测试与运行记录197.1 游戏界面菜单选项的功能测试207.1.1“游戏”菜单测试 207.2 按键事件的功能测试 207.2.1 方块移动测试 207.2.2 方块反转测试 207.3方块堆砌与消行测试 207.3.1 底层碰撞 217.3.2 满行消除 217.4 测试结果分析 218. 课程设计完成结果分析与个人小结21参考文献:21致谢22附录23俄罗斯方块游戏实现陆嘉纯南京信息工程大学滨江学院计算机系,江苏 南京 摘要:在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件,所以并不是人人皆知。直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如家电、汽车等传统行业,也正因为如此,游戏人才的教育、培养远落后于产业的发展。 俄罗斯方块是个老少皆宜的小游戏,它实现由四块正方形的色块组成,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,然后程序根据这七种方块堆叠成各种不同的模型。关键词:俄罗斯方块;数据结构;JavaRealization Of The Game TetrisMatt JasonDepartmnet of Computer,Binjiang College,NUIST,Nanjing ,ChinaAbstract: In the current era with rapid development of electronic information, electronic games have been deeply People's Daily life, become the entertainment for young and old.But the game design combined with the ever-changing technology, integrates the complex in a product design, art, sound, and software, so not everyone knows.Until today, people in China to engage in game design is still very few, but the game industry, the rapid development of far beyond traditional industries, such as household appliances, automobile, also because of this, the game of talent education and training is far behind the development of the industry.Tetris is a game for young and old, it is composed of four square of color piece, the computer randomly generate different seven types of square, according to the control it in a certain amount of time on the computer clock, users according to the four keyboard direction key control flip, left, right and down operation, then the program according to the seven squares stack into a variety of different models.Key words:Tetris;Data Structure;Java1. 课程设计概述设计俄罗斯方块游戏程序,用户可以通过平移和转动自动落下的不同形状物体,填满一行来得分。开发智力和反应能力。(1)界面的左侧是游戏区域。新的图形会在顶部刷新,并且自动下落,可以通过方向左右键平移和方向上键顺时针旋转来控制图形落下的位置。(2)界面的右侧是选项和显示区,显示现在的得分,以及开始游戏、暂停游戏、结束游戏按钮。2. 项目的可行性研究与需求分析2.1 项目可行性研究2.1.1 技术可行性该程序是由Java语言实现,Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的Hot Java浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。另一方面,Java技术也不断更新。 1991年,Sun公司的James Gosling。Bill Joe等人,为电视、控制烤面包机等家用电器的交互操作开发了一个Oak(一种橡树的名字)软件,他是Java的前身。当时,Oak并没有引起人们的注意,直到1994年,随着互联网飞速发展,他们用Java编制了HotJava浏览器,得到了Sun公司首席执行官Scott McNealy的支持,得以研发和发展。为了促销和法律的原因,1995年Oak更名为Java。 Java分为三个体系JavaSE(Java2 Platform Standard Edition,java平台标准版),JavaEE(Java 2 Platform,Enterprise Edition,java平台企业版),JavaME(Java 2 Platform Micro Edition,java平台微型版)。 Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。 Java语言是一个支持网络计算的面向对象程序设计语言。Java语言吸收了Smalltalk语言和C+语言的优点,并增加了其它特性,如支持并发程序设计、网络通信、和多媒体数据控制等。2.1.2 经济可行性本系统开发应用之后主要用于游戏的实现,有开发周期短和高效率等优点。基于Java语言开发,开源免费,因此该项目的开发成本很低,从这一点上来说,该系统经济上可行。2.1.3 操作可行性由系统分系可以看出本程序的开发在技术上具有可行性。首先游戏对所要求的软、硬件的最低配置现在大多数的用户用机都能达到。现有的开发工具和技术完全能够实现。本程序对用户没有任何的特殊要求,实际操作基本上以键盘操作为主并辅以少量的鼠标操作,操作方式很方便。因此该项目具有良好的易用性。3、项目设计的基本原理和采用的主要方法与技术3.1 设计基本原理首先定义一个三维数组分别存放方块类型(包括7种:S、Z、L、J、I、O、T),用0和1代表当前方块是否显示。其次在窗体中添加地图,并设置边框的数值为2以作区分,对方块与地图进行碰撞检测,触碰左右边界则设置不得越界,触碰底边则另其停止移动。通过按键监听事件获得对键盘事件的监听来控制方块的移动与变形。若最下面一行的方块数值均为1则进行置0并获得游戏加分。3.2主要方法和技术3.2.1 键盘监听通过KeyListener中的KeyAdapter来进行对键盘的行为操作的时间监听,以此改变方块的位置和形态。3.2.2 重绘重构paint方法已实现对人机界面的panel重绘,将帧数画布变成连续的动画,形成方块下落过程。3.2.3 形态方块的数组设置普通的一、二维数组难以实现多种方块的形态构成及变化,因此创建一个四维数组容器来放置多种形态方块。第一维代表方块类型(包括7种:S、Z、L、J、I、O、T),第二维代表旋转次数,第三四维代表方块矩阵。3.2.4 定时器设置线程设置一个Timer来创建Thread,控制方块的下落速度。3.2.5 方块的变形与消行通过形态方块的数组设置来实现方块是否显示,变形是对显示方块的数值进行置0或1,而消行则是将数值置0进行消行。4. 总体设计4.1 总体设计方案本游戏设计按照MVC设计模式,将游戏的输入、处理、输出流程按照Model、View、Controller的方式进行分离,即将游戏划分成三个模块:模型层、视图层、控制层。4.2 模块设计图4.2.1 MVC设计模型图4.3 模块说明4.3.1 模型层功能模块设计4.3.2 视图层功能模块设计4.3.3 控制层功能模块设计5. 详细设计5.1 模型层设计5.1.1 产生图形首先创建方块的数据结构,定义一个4*4的矩阵,共16个小格。用0和1来表示当前方格是否显示,由此可以绘制多种图形。5.1.2 产生地图与方块的数值不同,在窗体四周绘制一圈方块,并设置每个块的值为2,以作区分。5.2 视图层设计5.2.1 方块的显示根据nextBlock方法来产生随机数,获取一个随机图形,进行显示。然后根据paint方法来进行画面的绘制。5.2.2 分数的显示在游戏主界面的旁边加上分数字符串,以来显示玩家的得分。5.3 控制层设计5.3.1 方块的移动与变形通过控制按键来实现方块的移动,继承KeyListener来对键盘事件进行监听。按下上键,实现turn方法,进行方块的state改变,则进行变形操作;按下下键,实现down方法,对方块的location的纵坐标递增,则进行加速下落;按左右键,对方块的location的横坐标进行加减操作,则进行图形的左右移动。6. 编码实现6.1 游戏界面演示6.2 消行并得分演示6.3 游戏结束演示7. 测试用例设计、测试与运行记录7.1 游戏界面菜单选项的功能测试 7.1.1“游戏”菜单测试 (1)点击“游戏”->“新游戏” 输出:游戏开始 结果:正常 (2)点击“游戏”->“暂停” 输出:弹出游戏结束提示框 结果:正常 (3)点击“游戏”->“继续”输出:游戏继续进行结果:正常7.2 按键事件的功能测试  7.2.1 方块移动测试     游戏过程中,点击“左、右、下”方向键 输出:方块正常移动,不会移出边界 结果:正常   7.2.2 方块反转测试     游戏过程中,点击向上方向键 输出:方块无边界和障碍物阻挡的情况下可反转 结果:正常  7.3方块堆砌与消行测试 7.3.1 底层碰撞 输出:方块成功堆砌在底部 结果:正常   7.3.2 满行消除 输出:所有满行被消除,方块依次下移 结果:正常  7.4 测试结果分析    经过测试,本游戏实现了基本的功能,不过整体功能还不是很强大,作为开发的第一个版本,游戏在很多方面还需要进一步完善。8. 课程设计完成结果分析与个人小结此次课程设计,通过俄罗斯方块这个小程序的一系列制作与分析,软件工程的程序制作流程以及OOP的概念已经深入我心。通过此次课程设计,我在软件工程这门课程方面获得了很大了提高,能够用深层次分析的方法去思考问题以及解决问题,通过需求分析、概要设计和详细设计来进一步的理解程序。参考文献:1 明日科技Java从入门到精通(第3版)M明日科技,译3版北京:清华大学出版社,2012:230-2492 布鲁斯埃克尔Java编程思想(第4版)M陈昊鹏,译4版北京:机械工业出版社,2007:148-167致谢这次课程设计,我深刻领会到基础的重要性,课程设计不仅仅能帮助我检验所学知识的学习成果,更多的是可以帮助我更加清楚的认识自我,磨练意志与耐性,这会为我日后的工作和生活带来很大的帮助。通过一个学期的学习,这次的课程设计已接近尾声,由于经验的匮乏,难免有许多考虑不周全的地方,在这里衷心感谢李振宏老师的教学教导,以及一起学习的同学的支持与帮助。附录全部代码如下:import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.Timer;public class Tetris extends JFrame public static void main(String args) Tetris te = new Tetris();te.setVisible(true);/ 如果在界面中添加了编辑框等会抢占焦点的控件,则需要用下面的代码/ te.requestFocus(true);/让游戏面板获得焦点-抢到键盘的监听public static final int L = 30;private TetrisPanel tp;JMenuItem itemPause;JMenuItem itemContinue;JMenuItem itemContact;public Tetris() this.setTitle("Tetris");this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setLocation(600, 200);this.setSize(600, 730);this.setResizable(false);tp = new TetrisPanel();this.getContentPane().add(tp);/ 添加菜单JMenuBar menubar = new JMenuBar();this.setJMenuBar(menubar);JMenu menuGame = new JMenu("游戏");menubar.add(menuGame);JMenu aboutGame = new JMenu("关于");menubar.add(aboutGame);JMenuItem itemNew = new JMenuItem("新游戏");itemNew.setActionCommand("new");itemPause = new JMenuItem("暂停");itemPause.setActionCommand("pause");itemContinue = new JMenuItem("继续");itemContinue.setActionCommand("continue");itemContinue.setEnabled(false);menuGame.add(itemNew);menuGame.add(itemPause);menuGame.add(itemContinue);itemContact = new JMenuItem("联系我们");aboutGame.add(itemContact);MenuListener menuListener = new MenuListener();itemNew.addActionListener(menuListener);itemPause.addActionListener(menuListener);itemContinue.addActionListener(menuListener);/ 让整个JFrame添加键盘监听this.addKeyListener(tp.listener);class MenuListener implements ActionListener Overridepublic void actionPerformed(ActionEvent e) / 玩新游戏if (e.getActionCommand().equals("new") tp.newGame();if (e.getActionCommand().equals("pause") timer.stop();itemContinue.setEnabled(true);itemPause.setEnabled(false);if (e.getActionCommand().equals("continue") timer.restart();itemContinue.setEnabled(false);itemPause.setEnabled(true);private Timer timer;class TetrisPanel extends JPanel / 方块的形状:/ 第一维代表方块类型(包括7种:S、Z、L、J、I、O、T)/ 第二维代表旋转次数/ 第三维代表方块矩阵/ shapestypeturnStatei i-> blocki/4i%4int shapes = new int /* * 模板 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0, * 0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0, * 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0 */ I (把版本1中的横条从第1行换到第2行) 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 ,/ S 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 , 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 ,/ Z 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ,/ J 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/ O 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/ L 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/ T 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 ;private int blockType;/ 方块类型private int turnState;/ 旋转状态private int x;/ 方块的位置x-列的位置-列号private int y;/ 方块的位置y-行的位置-行号private int map = new int1323;/ 地图:12列22行。为防止越界,数组开成:13列23行private int delay = 1000;public TimerKeyLister listener = new TimerKeyLister();private int score = 0;/ 分数public TetrisPanel() newGame();nextBlock();/ timer = new Timer(delay,listener);/ timer.start();public void newGame() blockType = (int) (Math.random() * 1000) % 7;turnState = (int) (Math.random() * 1000) % 4;x = 4;y = 0;for (int i = 0; i < 12; i+) / 走列for (int j = 0; j < 21; j+) / 走行if (i = 0 | i = 11) / 3为界面边框的格mapij = 3;/ 按理只要用0和1以外的整数就可以,但这里用3有特殊作用-后面用 else mapij = 0;mapi21 = 3;/ 3为界面边框的格if (timer != null) timer.stop();delay = 1000;timer = new Timer(delay, listener);timer.start();private void nextBlock() blockType = (int) (Math.random() * 1000) % 7;turnState = (int) (Math.random() * 1000) % 4;x = 4;y = 0;/ game Overif (crash(x, y, blockType, turnState) = 0) timer.stop();int option = JOptionPane.showConfirmDialog(this, "Game Over!,还敢来吗.");if (option = JOptionPane.OK_OPTION) newGame(); else if (option = JOptionPane.NO_OPTION) System.exit(0);private void down() if (crash(x, y + 1, blockType, turnState) = 0) / 注意,这里用y+1,是判断块往下掉一格后,map中对应位置是否为堆积块或框架add(x, y, blockType, turnState);/ 把当前方块的信息保存到地图nextBlock(); else y+;repaint();private void left() if (x >= 0) x -= crash(x - 1, y, blockType, turnState);repaint();private void right() if (x < 8) x += crash(x + 1, y, blockType, turnState);repaint();private void turn() if (crash(x, y, blockType, (turnState + 1) % 4) = 1) turnState = (turnState + 1) % 4;repaint();private void add(int x, int y, int blockType, int turnState) for (int a = 0; a < 4; a+) for (int b = 0; b < 4; b+) if (shapesblockTypeturnStatea * 4 + b = 1) mapx + b + 1y + a = 1;tryDelLine();/ 消行private void tryDelLine() for (int b = 0; b < 21; b+) int c = 1;for (int a = 0; a < 12; a+) c &= mapab;/ 全部是1,c的结果才是1if (c = 1) / 有一行需要消/ 依次往下移动一行for (int d = b; d > 0; d-) for (int e = 0; e < 11; e+) maped = maped - 1;/ 加分score += 10;delay /= 1.05;timer.setDelay(delay);/ 参数例子: 4,3,2,3/ 判断有无碰撞private int crash(int x, int y, int blockType, int turnState) for (int a = 0; a < 4; a+) for (int b = 0; b < 4; b+) / if( (shapesblockTypeturnStatea*4+b=1 &&/ mapx+b+1y+a =1) |/ (shapesblockTypeturnStatea*4+b=1 &&/ mapx+b+1y+a =3 ) )/ if (shapesblockTypeturnStatea * 4 + b & mapx + b + 1y + a) = 1) return 0;/ 碰撞return 1;/ 没有碰撞Overridepublic void paint(Graphics g) / blockType =6;/ turnState = 3;/ x=4;/ y=6;super.paint(g);/ 消除残影g.setColor(new Color(153, 51, 205);/ 画当前方块for (int j = 0; j < 16; j+) if (shapesblockTypeturnStatej = 1) g.fillRect(j % 4 + x + 1) * L, (j / 4 + y) * L, L, L);g.setColor(Color.cyan);g.drawRect(j % 4 + x + 1) * L, (j / 4 + y) * L, L, L);g.setColor(new Color(153, 51, 205);/ 画界面框架 以及 堆积块-整个地图g.setColor(Color.red);for (int i = 0; i < 12; i+) / 走列for (int j = 0; j < 22; j+) / 走行if (mapij = 3) g.drawRect(i * L, j * L, L, L); else if (mapij = 1) g.fillRect(i * L, j * L, L, L);g.setColor(Color.GREEN);g.drawRect(i * L, j * L, L, L);g.setColor(Color.red);/ 显示分数,同时为版面美观,在界面上再加点东西/ 画方块区右侧部分g.setColor(Color.red);g.setFont(new Font("aa", Font.B

    注意事项

    本文(软件工程课设(共34页).docx)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开