面向对象课程设计——Java实现俄罗斯方块-个人博客

一、项目简介

功能描述:

使用java语言实现了俄罗斯方块这个游戏。游戏界面上方有各种任务栏,可以进行方块颜色、背景颜色设置,以及游戏界面风格设置,包括游戏操作介绍和快捷键设计,较为人性且界面美观。操作界面实现了开始、暂停/继续、停止、游戏等级设置以及得分等功能,同时设置了预览窗口,提示下一方块的样式,使用MVC模式对界面进行操作,降低了代码耦合性,提高了程序的可维护性、扩展性,降低了程序的开发难度。程序总体功能实现比较完备。

功能分析


需要设计的类有:方块实体类,单个方格类
需要设计的面板有:游戏面板,控制面板

参考git地址或博客地址:

https://blog.csdn.net/qq_43184550/article/details/87893614
https://blog.csdn.net/bingongzi/article/details/104186388
https://www.cnblogs.com/2223ch/p/10279881.html

个人负责任务:

工作进度的把控、model类的设计(包括单位方格类和实体俄罗斯方块类设计)、Constant常用工具类的设计、Controller类的设计以及与其他各类的关联、博客的书写

二、功能架构图

游戏流程

包的规范

包的UML(自己负责部分)


三、本人负责功能详解

1. 俄罗斯方块实体类Blocks的设计:

设计俄罗斯方块实体类就是设计俄罗斯方块这个游戏的灵魂。面对方块复杂的形式变化,我们正确得到样式不相同的方块,这是一个很大的问题。尽管俄罗斯方块的样式不是很统一,但是利用一个4*4比例的方块绘制就可以得到所有的方块样式,因此使用16个字节就可以把一个方块的信息保存。我们这里用位运算来进行操作(想对于传统的算术运算符,位运算速度较快而且可以实现一些算术运算符不能实现的功能,开发效率高)。已知有七种形态的方块,我们将每一种形态都用一个数进行表示,存储再style里面,这样就会有28中不同的形式,举个例子:

然后通过构建函数,用&运算和位移运算来绘制方块:

方块完成构造之后,就是方块的移动问题,这里主要解决的是方块还不能移动,是否能移动到新位置的问题。实现run()这个方法就是让方块进行下落移动,移动速度随着难度等级的增大而加强,并且添加平滑因子保证不会因为移动速度过快而导致程序崩溃。在非暂停情况下,通过moveTo()来实现对moving的控制,判断是否让run继续。moveTo()判断是否能到达新的位置这里用!isMoveAble(newRow, newCol)进行判断,当遇见方块了或者触底了就不能移动了。然后还实现了trunTo()看看是否还能继续变形,当前块能否变成newStyle所指定的块样式,主要是要考虑 边界以及被其它块挡住、不能移动的情况。

2.Controller类的设计

Controller类主要是控制器,这里面放置了许多控制按钮,所以也进行了一部分的GUI设计。主要添加开始、暂停/继续、停止、当前分数、难度等级、预览窗口等按钮界面。添加了各个按钮的监听器调用主类里面的方法。

创建了预览窗口用于预览下一个方块的形状是什么样子的。背景色为深色,前景色(即方块的颜色)为浅色。使用fill3DRect进行方块喷绘。

添加了键盘监听器用来控制移动:

四、课程设计感想

本次课程设计相对于之前经历过的课程设计来说,比较艰难但也有趣。Java学习到GUI之后可以对自己所作的东西有直观的感受,这会使自己感到很多的欣慰。刚开始顶选题是俄罗斯方块的时候并没有觉得有多困难,看之前玩的游戏感觉也就那样。但是真正接触到自己写代码的话,就头大了许多。比如每个方块变换各种形态如何表示,如何判断方块是否消除,如何判断方块是否触底触壁,这些都是值得深思的地方。所幸,通过与同学进行讨论,以及参考网络上浩如烟海的参考资料,最终还是完成了这一份课程设计。有时候过程是要比结果更加重要的。在课设的过程中,我复习了本学期学过的知识以及学到了很多新的知识,与组员进行合作的时候也出现过许多问题,不过我们都可以一一进行克服,这是对自己的一种提升。知识是要不断累计,不断更新的,我们这个行业更加是如此,苟日新,日日新,日又新。我们也只有一次次重复“新”的过程才能逐渐成长,逐渐成为大牛。加油吧!

五、不足之处

  • 1.做预览窗口的时候显示的方块位置(然是其绘图形成的)偏僻,可以思考如何做能让所有的不同形态的方块进行居中显示;
  • 2.view和controller分离的不是很彻底,在view里面可以完全实现界面设置的所有功能但是还没有完全写开,MVC模式掌握的还是不很熟练;
  • 3.没有用到新的技术比如物理引擎(还没有什么了解),以及这只是单机游戏,可以设计成多人对战的web游戏,还可以设置更加精美的界面,这是我今后可以学习的地方。
  • 4.功能开发不是很完备,由于我们想要做的是一个桌面游戏,所以想到过要进行数据存储的功能。用链表等结构存储太low且数据存活周期并不长久,根据之前学到过的知识是要用数据库或者本地文件进行存储比较好,但是这又违背了java语言的优势:灵活性和跨平台性。举个例子,如果我使用mysql存储的时候,就要求使用者的机器也需要安装mysql,不然程序无法访问或者会报错,所以如果又一种可以便携的可以打包的数据库就比较方便。通过搜索我发现java内嵌数据库比如Derby或者HSQLDB均可以实现数据库存储,并且可以一起打包,
原文地址:https://www.cnblogs.com/shenchao123/p/14342729.html