软件工程课设Word格式.docx
《软件工程课设Word格式.docx》由会员分享,可在线阅读,更多相关《软件工程课设Word格式.docx(32页珍藏版)》请在冰点文库上搜索。
![软件工程课设Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/8c9a8b44-6972-477f-8805-5e8d7ec6d9b2/8c9a8b44-6972-477f-8805-5e8d7ec6d9b21.gif)
7.2.1
方块移动测试
7.2.2
方块反转测试
7.3.1
底层碰撞
21
7.3.2
满行消除
俄罗斯方块游戏实现
陆嘉纯
南京信息工程大学滨江学院计算机系,江苏南京210044
摘要:
在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。
但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件,所以并不是人人皆知。
直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如家电、汽车等传统行业,也正因为如此,游戏人才的教育、培养远落后于产业的发展。
俄罗斯方块是个老少皆宜的小游戏,它实现由四块正方形的色块组成,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,然后程序根据这七种方块堆叠成各种不同的模型。
关键词:
俄罗斯方块;
数据结构;
Java
RealizationOfTheGameTetris
MattJason
DepartmnetofComputer,BinjiangCollege,NUIST,Nanjing210044,China
Abstract:
Inthecurrenterawithrapiddevelopmentofelectronicinformation,electronicgameshavebeendeeplyPeople'
sDailylife,becometheentertainmentforyoungandold.
Butthegamedesigncombinedwiththeever-changingtechnology,integratesthecomplexinaproductdesign,art,sound,andsoftware,sonoteveryoneknows.
Untiltoday,peopleinChinatoengageingamedesignisstillveryfew,butthegameindustry,therapiddevelopmentoffarbeyondtraditionalindustries,suchashouseholdappliances,automobile,alsobecauseofthis,thegameoftalenteducationandtrainingisfarbehindthedevelopmentoftheindustry.
Tetrisisagameforyoungandold,itiscomposedoffoursquareofcolorpiece,thecomputerrandomlygeneratedifferentseventypesofsquare,accordingtothecontrolitinacertainamountoftimeonthecomputerclock,usersaccordingtothefourkeyboarddirectionkeycontrolflip,left,rightanddownoperation,thentheprogramaccordingtothesevensquaresstackintoavarietyofdifferentmodels.
Keywords:
Tetris;
DataStructure;
1.课程设计概述
设计俄罗斯方块游戏程序,用户可以通过平移和转动自动落下的不同形状物体,填满一行来得分。
开发智力和反应能力。
(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
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.1MVC设计模型图
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
游戏界面菜单选项的功能测试
(1)点击“游戏”->
“新游戏”
输出:
游戏开始
结果:
正常
(2)点击“游戏”->
“暂停”
弹出游戏结束提示框
(3)点击“游戏”->
“继续”
游戏继续进行
正常
7.2
按键事件的功能测试
游戏过程中,点击“左、右、下”方向键
方块正常移动,不会移出边界
游戏过程中,点击向上方向键
方块无边界和障碍物阻挡的情况下可反转
7.3方块堆砌与消行测试
方块成功堆砌在底部
所有满行被消除,方块依次下移
7.4
测试结果分析
经过测试,本游戏实现了基本的功能,不过整体功能还不是很强大,作为开发的第一个版本,游戏在很多方面还需要进一步完善。
8.课程设计完成结果分析与个人小结
此次课程设计,通过俄罗斯方块这个小程序的一系列制作与分析,软件工程的程序制作流程以及OOP的概念已经深入我心。
通过此次课程设计,我在软件工程这门课程方面获得了很大了提高,能够用深层次分析的方法去思考问题以及解决问题,通过需求分析、概要设计和详细设计来进一步的理解程序。
参考文献:
[1]明日科技.Java从入门到精通(第3版)[M].明日科技,译.3版.北京:
清华大学出版社,2012:
230-249.
[2]布鲁斯埃克尔.Java编程思想(第4版)[M].陈昊鹏,译.4版.北京:
机械工业出版社,2007:
148-167.
致谢
这次课程设计,我深刻领会到基础的重要性,课程设计不仅仅能帮助我检验所学知识的学习成果,更多的是可以帮助我更加清楚的认识自我,磨练意志与耐性,这会为我日后的工作和生活带来很大的帮助。
通过一个学期的学习,这次的课程设计已接近尾声,由于经验的匮乏,难免有许多考虑不周全的地方,在这里衷心感谢李振宏老师的教学教导,以及一起学习的同学的支持与帮助。
附录
全部代码如下:
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjavax.swing.JFrame;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.Timer;
publicclassTetrisextendsJFrame{
publicstaticvoidmain(String[]args){
Tetriste=newTetris();
te.setVisible(true);
//如果在界面中添加了编辑框等会抢占焦点的控件,则需要用下面的代码
//te.requestFocus(true);
//让游戏面板获得焦点--抢到键盘的监听
}
publicstaticfinalintL=30;
privateTetrisPaneltp;
JMenuItemitemPause;
JMenuItemitemContinue;
JMenuItemitemContact;
publicTetris(){
this.setTitle("
Tetris"
);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocation(600,200);
this.setSize(600,730);
this.setResizable(false);
tp=newTetrisPanel();
this.getContentPane().add(tp);
//添加菜单
JMenuBarmenubar=newJMenuBar();
this.setJMenuBar(menubar);
JMenumenuGame=newJMenu("
游戏"
menubar.add(menuGame);
JMenuaboutGame=newJMenu("
关于"
menubar.add(aboutGame);
JMenuItemitemNew=newJMenuItem("
新游戏"
itemNew.setActionCommand("
new"
itemPause=newJMenuItem("
暂停"
itemPause.setActionCommand("
pause"
itemContinue=newJMenuItem("
继续"
itemContinue.setActionCommand("
continue"
itemContinue.setEnabled(false);
menuGame.add(itemNew);
menuGame.add(itemPause);
menuGame.add(itemContinue);
itemContact=newJMenuItem("
联系我们"
aboutGame.add(itemContact);
MenuListenermenuListener=newMenuListener();
itemNew.addActionListener(menuListener);
itemPause.addActionListener(menuListener);
itemContinue.addActionListener(menuListener);
//让整个JFrame添加键盘监听
this.addKeyListener(tp.listener);
classMenuListenerimplementsActionListener{
@Override
publicvoidactionPerformed(ActionEvente){
//玩新游戏
if(e.getActionCommand().equals("
)){
tp.newGame();
}
timer.stop();
itemContinue.setEnabled(true);
itemPause.setEnabled(false);
timer.restart();
itemContinue.setEnabled(false);
itemPause.setEnabled(true);
}
privateTimertimer;
classTetrisPanelextendsJPanel{
//方块的形状:
//第一维代表方块类型(包括7种:
S、Z、L、J、I、O、T)
//第二维代表旋转次数
//第三维代表方块矩阵
//shapes[type][turnState][i]i-->
block[i/4][i%4]
intshapes[][][]=newint[][][]{
/*
*模板{{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}},
//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}