课程设计.docx
- 文档编号:12122004
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:39
- 大小:229.59KB
课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(39页珍藏版)》请在冰豆网上搜索。
课程设计
存档资料成绩:
面向对象程序设计
课程设计报告书
所属课程名称面向对象程序设计
题目java俄罗斯方块小游戏
院(系)信息工程学院
班级计算机科学与技术1301B
学 号
学生姓名
指导教师王海荣
2015年5月25日
课程设计任务书
1.本课程设计的目的
(1)使学生巩固和提高面向对象程序设计编程技术
(2)培养学生掌握程序设计的基本思路和方法;
(3)加强学生研发、调试程序的能力;
(4)培养学生分析、解决问题的能力;
(5)提高学生的科技论文写作能力。
2.课程设计的任务及要求
1)任务:
2)创新要求:
3)课程设计论文编写要求
(1)课程设计任务及要求
(2)设计思路--工作原理、功能规划
(3)详细设计---数据分析、算法思路、类设计、功能实现(含程序流程图、主要代码及注释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。
(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)
(7)报告按规定排版打印,要求装订平整,否则要求返工;
(8)课设报告的装订顺序如下:
封面---任务书---中文摘要---目录----正文---附录(代码及相关图片)
4)评分标准:
(1)程序检查:
50分;
(2)课程设计报告:
50分;
5)参考文献:
课程设计评审意见
(1)程序检查(50分):
优( )、良( )、中( )、一般( )、差( );
(2)课设报告(50分):
优( )、良( )、中( )、一般( )、差( );
评阅人:
年月日
中文摘要
在这个世界上,熟悉Java历史的人非常多,如果要问一个人Java是从哪年诞生的,也许大多数人都会回答是1995年(这个非常好记,因为微软的Windows95也是在这一年发布的)。
但事实上Java早在上个世纪90年代初就开始酝酿了。
1991年4月,Sun公司的JamesGosling领导的绿色计划(GreenProject)开始着力发展一种分布式系统结构,使其能够在各种消费性电子产品上运行。
而Green项目组的成员一开始使用C++语言来完成这个项目,由于Green项目组的成员都具有C++背景,所以他们首先把目光锁定了C++编译器,Gosling首先改写了C++编译器,但很快他就感到C++的很多不足,需要研发一种新的语言Java来替代它,一杯飘香的咖啡成为了它的标志。
在17个月后,整个系统完成了,这个系统是更注重机顶盒式的操作系统,不过在当时市场不成熟的情况下,他们的项目没有获得成功,但Java语言却得到了Sun总裁McNealy的赏识。
直至1994年下半年,由于Internet的迅猛发展和环球信息网WWW的快速增长,第一个全球信息网络浏览器Mosaic诞生了;此时,工业界对适合在网络异构环境下使用的语言有一种非常急迫的需求;GamesGosling决定改变绿色计划的发展方向,他们对Oak进行了小规模的改造,就这样,Java在1995年的3月23日诞生了!
Java的诞生标志着互联网时代的开始,它能够被应用在全球信息网络的平台上编写互动性及强的Applet程序,而1995年的Applet无疑能给人们无穷的视觉和脑力震荡。
我们姑且将Java的这段历史称为Java前传吧。
其实Java的诞生颇有那么一股“有心栽花花不开,无心插柳柳成阴”的味道。
就象当年Unix和它的前身MULTICS系统一样。
Sun继Green项目后又经过了几年的研究,终于在1995年5月23日在SunWorld'95上正式发布Java和HotJava浏览器。
在同年,有很多公司先后获得了Java许可证,如Netscape在1995年8月,Oracle在1995年10月分别获得了Java许可证。
Sun在1995年发布第一个Java版本后,于1996年1月宣布成立新的业务部门──JavaSoft部,这个部分主要负责开发、销售并支持基于Java技术的产品,由AlanBaratz先生任总裁。
在1995年Sun虽然推出了Java,但这只是一种语言,而要想开发复杂的应用程序,必须要有一个的强大的开发库支持还行。
因此,Sun在1996年1月23日发布了JDK1.0。
这个版本包括了两部分:
运行环境(即JRE)和开发环境(即JDK)。
在运行环境中包括了核心API、集成API,用户界面API,发布技术,Java虚拟机(JVM)五个部分。
而开发环境还包括了编译Java程序的编译器(即javac)。
在JDK1.0时代,JDK除了AWT(一种用于开发图形用户界面的API)外,其它的库并不完整。
Sun在推出JDK1.0后,紧跟着,Sun在1997年2月18日发布了JDK1.1。
JDK1.1相对于JDK1.0最大的改进就是为JVM增加了JIT(即时编译)编译器。
JIT和传统的编译器不同,传统的编译器是编译一条,运行完后再将其扔掉,而JIT会将经常用到的指令保存在内容中,在下次调用时就不需要再编译了。
这样JDK在效率上有了非常大的提升。
Sun在推出JDK1.1后,接着又推出了数个JDK1.x版本。
自从Sun推出Java后,JDK的下载量不断彪升,在1997年,JDK的下载量突破了220,000,而在1998年,JDK的下载量已经超过了2,000,000。
虽然在1998年之前,Java被众多的软件企业所采用,但由于当时硬件环境和JVM的技术原因,它的应用却很有限。
当时Java主要只使用在前端的Applet以及一些移动设备中。
然而这并不等于Java的应用只限于这些领域。
在1998年是Java开始迅猛发展的一年。
在这一年中Sun发布了JSP/Servlet、EJB规范以及将Java分成了J2EE、J2SE和J2ME。
标志着Java已经吹响了向企业、桌面和移动3个领域进军的号角。
目 录
一、课设任务及要求
根据所学内容,开发一款俄罗斯方块小游戏。
开始制作游戏时,主要要解决的问题有以下几个方面:
游戏如何设置整个游戏的界面;游戏开始后,如何控制游戏中方块下落的速度,玩家控制方块左右移动的边界等;判断方块是否到达底部或者顶到上面等.
1.分析课程设计题目的要求。
2.对系统功能模块进行分析,写出详细设计说明文档。
3.编写程序代码,代码量要求不少于300行。
调试程序使其能正确运行。
4.设计完成的软件要便于操作和使用。
5.设计完成后提交课程设计报告。
6.要求思路清晰,结构严谨。
二、需求分析
2.1总体需求分析
剖析游戏的实质,可以发现:
首先,该游戏需要一个良好且可控的界面,能够接受鼠标和键盘的响应,可以供玩家选择自己想要的游戏级别、背景颜色和是否开启背景音乐,实现个性化设置;其次,由于游戏涉及到许多不同种类的下坠物,所以需要来构造这些下坠物并且设置一种旋转规则实现下坠物的各种旋转;再者,在游戏过程中,必须要处理好下坠物的一些事件,例如自动下落,消除满行,下一个下坠物的显示以及游戏的自主升级。
2.2下坠物及各种变换需求分析
本游戏需要有7种下坠物,而每种下坠物还可以进行旋转。
每种下坠物每行每列最多只有4个小下坠物,可以将它们放在一个n*m的区域内,该区域可以看作是有许多个等面积小下坠物构成的区域,而这些区域的状态只有两种,被下坠物占据或空闲,因此,对于整个游戏区域的空间是占据或空闲,可以用一位数来标识。
对于7种下坠物和它们旋转后的形态我们可以用不同的标识进行标记。
对于旋转,游戏中所有下坠物都是按照逆时针旋转的规则进行的,而且在旋转过程中它们不会因为旋转而下降,总会保持在同一高度。
任何下坠物经过一个旋转周期还会变回原型。
2.2.2正常工作和中断操作的需求分析
在无人操作时,游戏开始后会随机产生一个下坠物,先显示在界面右上角的显示区域,然后转到游戏区域,右上角又随机产生一个新的下坠物,当该下坠物下落到底后,新的下坠物再次进入游戏区域,如此循环,直到游戏结束/暂停,这就是游戏的正常工作。
上述过程是在无人操作时游戏自动运行的,当用户进行一定的操作交互的时候,运行程序可以根据用户的操作指示进行当前下坠物的控制。
而这些操作都是响应相关的功能键而执行的,所以这里可以把它看成一种“中断”的操作。
在中断过程中,可以通过键盘包括按某些键进行操作。
为了便于用户操作,用户可以自主选择操作键,但他们的作用不变。
但还是应该设置默认键来方便操作。
例如:
光标向上键,光标向下键,光标向左键,光标向右键,空格键。
按光标向上键此事件产生下坠物旋转操作,下坠物并非任何情况都能旋转,如果旋转后与小方格矩阵显示的下坠物有冲突或超出边界时,均不能发生旋转。
因此首先要判断是否有足够的空间进行旋转,然后选择是否旋转。
按光标向下键
此事件产生下坠物加速下落操作,如果下坠物已经到达游戏区域底部或者已经有其他方块遮挡,则下坠物停止下降。
按光标向左键此事件产生下落下坠物左移操作。
首先要判断此下坠物是否能够发生左移,当越界或被其他显示下坠物阻挡时,则不能左移。
按光标向右键此事件产生下落下坠物右移操作。
首先要判断此下坠物是否能够发生右移,当越界或被其他显示下坠物阻挡时,则不能右移。
按"空格键"此事件产生下坠物一键到底的操作,如果下坠物已经到达游戏区域底部或者其下方已经有其他方块遮挡,则下坠物不能再下降。
三、设计思路
1、设计思路就是,首先打开游戏显示一个Frame界面,游戏界面的左边是一个控制游戏过程(比如暂停、继续、停止游戏,开始新游戏等)和对游戏界面进行一定的设置的一个界面,放在gameOptionPanel这个panel中,再添加到Frame之中,游戏界面的右边是游戏界面,也就是GamePanel,在这个界面中主要是显示游戏进行的过程的,即各种图案怎么从上到下的运动等,并且在游戏界面的最上边显示当前游戏的运行速度。
2、游戏的运行过程。
首先我做的项目首先会运行game包中的MainFrame类,通过这个类来创建整个的游戏界面,其次这个界面在创建的过程中会添加灵位一个Controller类的监听,Controller的作用就是一个独立的控制类,控制整个游戏的运行,控制游戏运行大部分的控制事件都放在Controller中,这样的好处就是容易控制,使代码更加的清晰明了易懂。
在Controller类中,通过action事件可以控制游戏的开始结束等等等。
3、满行删除方法的设计。
设计成功的俄罗斯方块游戏,必须要达到在方块满行的实现消去满行的功能,在这里利用设计的deleteFullLine()方法来实现此功能,并在此同时实现分数的增加。
该功能通过以下关键代码实现:
for(inti=0;i booleanisfull=true; L1: for(intj=0;j if(scrArr[i][j]==0){ k++; isfull=false; breakL1; } if(isfull) full_line_num++; } 实现满行删除的方法首先定义方法deleteFullLine(),在方法里体定义累加删除满行的数量的整形变量full_line_num和控制变量整形变量k,算法是首先定义一个控制行数的变量i,调用一个for外循环使行数i从i=0开始循环进行从方块底部到顶部行数的遍历,直到i小于定义的行数变量rowNum时结束循环,然后在循环体内定义一个boolean型变量isfull且赋值为true;然后再对标签L1进行for循环即对每一行的每一列进行列的遍历,在循环之中定义一个控制循环控制变量j,使j从j等于0开始循环进行每一行进行遍历,对每一列利用分支结构if进行条件判断,如果scrArr[i][j]等于0表示此列没有方块存在,然后只要此处没有方块存在即scrArr[i][j]等于0,控制变量k进行自加1,反之如果scrArr[i][j]不等于0及scrArr[i][j]等于1表示此处有方块存在,接着isfull的值被赋值为true,if判断条件为真,行数累加的变量full_line_num进行自加,表示删除了一行方块。 如果在遍历时发现此行方块没有满行,即三个条件k不等于0,k-1不等于i和isfull为false取与之后的值为真继续应用一个for循环在画布上画出下落到底部的方块,在画方块的过程之中调用含有三个参数的方法drawUnit(),分别传入相应的方块在画布当中的坐标并且执行相应的操作在画布上画出方块图形,接着调用if判断条件scrArr[i][j]是否等于0.如果scrArr[i][j]等于零执行g.setColor(Color.black)即以背景为颜色画方块;如果scrArr[i][j]不等于0执行g.setColor(Color.magenta),即在画布上画出已经落下的方块,已经落下的方块的新坐标用scrArr[k-1][j]=scrArr[i][j]语句实现且将颜色设置为粉红色。 在删除满行的同时游戏还得不断的从游戏画布的顶端产生新的方块,并且调用for循环将屏幕数组横坐标从k-1至小于横坐标rowNum,纵坐标从j等于0开始至小于columnNum开始遍历整个屏幕数组scrArr[i][j],并且将scrArr[i][j]赋值为0。 在实现满行删除方法的最后将full_line_num的累计总和加上ERS_Block.score的总和赋值给ERS_Block.score作为游戏玩家在体验俄罗斯方块游戏过程中获得的游戏分数,别切将次分数在赋值给ERS_Block.scoreField.setText,使分数显示在游戏界面右边的分数显示框中。 4、方块翻转的设计。 在Block类中定义一个无返回值的方法leftTurn()实现方块的翻转,在leftTurn()方法体中使用if条件判断,在条件当中调用判断是否正确的方法assertValid(),在此方法中包含了四个参数分别为方块类型,方块的翻转状态以及方块的横坐标和纵坐标,在assertValid()方法中定义一个k并为其赋值为0x8000;利用for循环对i等于0至i小于4和j等于0至j小于4分别进行一次遍历,在j的循环体中将pattern[t][s]和k取与运算之后强制转换为整形变量,使用if条件来判断其值是否为不等于0,如果不等于0再通过GameCanvas类的对象对scr调用getScrArrXY()方法且传入row-i,col+j两个参数,如果temp小于0或者temp等于2返回false,反之则返回true。 接着程序继续往下运行,k无符号往右移一位。 在assertValid()返回值为真的情况下,继而调用Block类中的dispBlock()方法且向其中传入参数0,方法中定义一个k并为其赋值为0x8000;利用for循环对i等于0至i小于4和j等于0至j小于4分别进行一次遍历,在j的循环体中将pattern[blockType][turnState]与k取与运算之后强制转换为整形变量,使用if条件来判断其值是否为不等于0,如果其值不等于0,再通过GameCanvas类的对象对scr调用drawUnit()方法并且传入方块的坐标以及方块的翻转状态在游戏界面的画布上进行方块的操纵,然后在将k无符号向右移一位,这样就实现了块的翻转。 实现方块的主要代码如下: publicvoidleftTurn(){ if(assertValid(blockType,(turnState+1)%4,row,col)){ dispBlock(0); turnState=(turnState+1)%4; dispBlock (1); } } 5、方块移动的设计。 在此功能中实现产生的每个的方块的移动的方法分为左移、右移和下落三种方法,在leftMov()方法体中使用if条件判断,在条件当中调用判断是否正确的方法assertValid(),在此方法中包含了四个参数分别为方块类型,方块的翻转状态以及方块的横坐标和纵坐标,在assertValid()方法中定义一个k并为其赋值为0x8000;利用for循环对i等于0至i小于4和j等于0至j小于4分别进行一次遍历,在j的循环体中将pattern[t][s]和k取与运算之后强制转换为整形变量,再通过GameCanvas类的对象对scr调用getScrArrXY()方法且传入row-i,col+j两个参数,如果temp小于0或者temp等于2,返回false,反之则返回true,接着调用dispBlock()方法并传入参数0,在方法体中定义一个参数k且赋值为0x8000,利用for循环对i等于0至i小于4和j等于0至j小于4分别进行一次遍历,在j的循环体中将pattern[blockType][turnState]与k取与运算之后强制转换为整形变量,通过GameCanvas类的对象对scr调用drawUnit()方法并且传入方块的坐标以及方块的翻转状态在游戏界面的画布上进行方块的操纵,接着程序继续往下运行,k无符号往右移一位。 实现方块的右移方法与左移的方法类似,只是在队列坐标从方块左移的语句col--变为方块右移的col++;定义实现方块下落的方法boolean型的fallDown()方法,在方法体内用if判断方块下落状态变量blockState是否等于2,如果等于2返回false;如果方块下落状态变量blockState不等于2,再用if判断是否正确方法assertValid()是否为真,如果为真继续调用dispBlock()方法并传入参数0,在方法体中定义一个参数k且赋值为0x8000,利用for循环对i等于0至i小于4和j等于0至j小于4分别进行一次遍历,在j的循环体中将pattern[blockType][turnState]与k取与运算之后强制转换为整形变量,通过GameCanvas类的对象对scr调用drawUnit()方法并且传入方块的坐标以及方块的翻转状态在游戏界面的画布上进行方块的操纵,接着程序继续往下运行,k无符号往右移一位,行坐标row自减返回,然后接着继续调用dispBlock()且传入参数1,返回true;如果判断方法assertValid()为假,将方块下落状态变量blockState赋值为2,调用dispBlock()且传入参数2,返回true。 实现方块左移的代码如下: publicvoidleftMove(){ if(assertValid(blockType,turnState,row,col-1)){ dispBlock(0); col--; dispBlock (1); } } 四、详细设计 部分代码如下所示: MainFrame.java主界面中的代码 packagetetris.game; importjava.awt.Color; importjava.awt.Font; importjava.awt.Image; importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjava.awt.event.FocusAdapter; importjava.awt.event.FocusEvent; importjavax.swing.JColorChooser; importjavax.swing.JFrame; importjavax.swing.JLabel; importjavax.swing.JPanel; importjavax.swing.JTextArea; importjavax.swing.border.EtchedBorder; importjavax.swing.event.ChangeEvent; importjavax.swing.event.ChangeListener; importtetris.controller.Controller; importtetris.entities.Ground; importtetris.entities.ShapeFactory; importtetris.listener.GameListener; importtetris.util.Global; importtetris.view.GamePanel; publicclassMainFrameextendsJFrameimplementsGameListener{ privatestaticfinallongserialVersionUID=1L; publicstaticvoidmain(Stringargs[]){ try{ Controllercontroller=newController(newShapeFactory(), newGround(),newGamePanel()); MainFrameframe=newMainFrame(controller); /*显示窗口*/ frame.setVisible(true); }catch(Exceptione){ e.printStackTrace(); } } privatefinalControllercontroller; privatefinalGameOptionPanelgameOptionPanel; privatefinalGamePanelgamePanel; privatefinalGroundground; privatefinalShapeFactoryshapeFactory; publicMainFrame(Controllerc){ super(); this.setTitle("MyTetris"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(null); this.setResizable(false); if(c.getGameInfoLabel()==null) c.setGameInfoLabel(newJLabel()); this.controller=c; this.shapeFactory=c.getShapeFactory(); this.ground=c.getGround(); this.gamePanel=c.getGamePanel(); this.gameOptionPanel=newGameOptionPanel(); finalJLabelinfoLabel=c.getGameInfoLabel(); /*监听器*/ MyGrou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计