摘要:电子游戏的出现,给人们提供了一种简单轻松、可互动和利用空闲时间放松的快速休闲方式。俄罗斯方块是一款经久不衰的方块益智游戏,俄罗斯方块规则比较简单,游戏中随机出现形状不同的方块并且在一定的时间不停的产生,这些方块在不停地下降。游玩者可以操作对这些方块进行形状变换,和控制它们水平方向移动,如果屏幕上某行中都填充了方块,那么该行就会消除。俄罗斯方块游戏看似简单却又变化无穷,游戏容易上手同时也富有挑战性,一直受到大众的青睐。
本论文着重研究如何提高游戏的可玩性,采用eclipse开发环境,利用Java语言及用户图形界面技术进行编程开发。在游戏操控上对方块的变换产生、旋转处理、越界和重叠处理进行了算法优化;游戏界面背景处理上用Photoshop工具对方块的颜色,游戏界面显示等进行了优化;在游戏策略上对游戏等级提升,游戏数据储存和设置等操作进行了修改和完善。画面优美,可玩性强,提升了游戏的可玩性。
关键字:电子游戏;俄罗斯方块;编程开发;图形界面
1 引言
电子游戏的出现,给人们提供了一种简单轻松、可互动和利用空闲时间放松的快速休闲方式,如今人们的工作压力随着生活节奏的提高而逐渐增加,闲暇之余需要放松和玩乐,而电子游戏正是因为满足了人们的这种需求而得到快速发展。
世界第一大游戏市场美国,电子游戏出口国日本以及号称网游最发达的韩国对促进电子游戏的发展做出来重要贡献,也推动了电子游戏开发技术水平的提高。电子游戏行业更是成为一些国家的经济和消费发展的重要手段,得到了政府在经济,科技,人才等方面的大力支持,促进了游戏开发技术知识库的充实。
俄罗斯方块是一种方块堆积和消除的益智游戏,在电脑和手机上被大量安装,用户群体庞大。俄罗斯方块早已风靡世界近数十年,这些年随着终端硬件技术的提升以及电子游戏文化的飞速发展,各种新版本和新玩法层出不穷。
俄罗斯方块在中国也是广为流行,玩者甚众。俄罗斯方块游戏是很多人的第一款电子游戏,它推动了中国电子游戏产业的发展。虽然中国电子游戏产业和玩家每年都在增长,但我国在电子游戏行业的发展与一些发达国家相比,从平台、创意、美工和技术等多方面还有不少差距,而这也是国内为什么开发不出像俄罗斯方块这样经久不衰的游戏的原因。如今,国产游戏逐渐取代国外游戏占领国内游戏市场,这也是国内游戏行业得到越来越多的关注的功劳。
本论文重点研究如何增加游戏的可玩性,在游戏操控,背景修改,游戏策略和设置等操作进行了修改和完善。增强了游戏模式、优化了游戏界面, 提升了界面效果, 满足了游戏玩家玩游戏时在反应能力、逻辑思维能力等感知度的提升,提高了游戏的趣味性。
2 系统基本分析
2.1 系统需求分析
-
总体流程要求:
该游戏系统在游戏运行时,每次从7种不同形状的游戏方块中随机生成一种,而玩家通过键盘控制方块的形状变形以及下落位置和速度来调节玩家的方块下落意向,方块将会固定在一处位置,按照这种方式,如果底部已经固定的方块堆中有一行被小方块铺满,则将这行小方块消除并且玩家得到相应分数,当玩家分数累计到一定值之后,将提高游戏等级。当游戏方块堆积到游戏顶部使得新的方块无法下落时,则游戏失败,此时游戏将储存玩家此时所得的总分数并让玩家输入名字记录于数据库中。
一个成功的游戏不仅要能体现游戏本身的功能,更要能吸引玩家沉浸其中,因此要提高游戏的可玩性和娱乐性,因而游戏操控和界面设计必须要给予重点关注。
-
该游戏需要实现以下功能需求:
-
方块形状:游戏所产生的方块总是七种不同形状的方块,在玩家通过键盘旋转之后共计有28种形状,一般采用数组储存这28种形状的数据结构。
-
方块显示:从七种预先设定的方块图样中随机产生,而该方块在下落过程中以及固定之后的显示图样不变;
-
方块消除:方块下落堆积,当有小方块铺满一行的时候消除该行;消行的时候,该行消失,其余在该行之上的所有固定的小方块下移一格。
-
操控需求:
-
键盘操控:通过设置键盘的上,下,左,右键来控制方块的下落状况。其中:上(方块旋转),下(加速下落),左(方块左移),右(方块右移)。
-
鼠标操控:在游戏界面中有开始和设置两个按钮,玩家可以通过鼠标点击相应的按钮来实现开始和设置两个功能。
-
游戏暂停和继续。
-
背景变换:本游戏的背景是一张图片,根据游戏等级的增加游戏背景图片也会随之改变。
-
计分功能:每消除一行或多行给以记分并显示;
-
难度控制:当累计分数达到要求时会提升游戏的难度等级;
-
游戏结束:当无法使新的方块继续下落时,游戏结束并且游戏界面中的所有小方块显示灰色以及游戏弹出保存记录的窗口,该窗口显示玩家此次游戏所得分数并让玩家输入本次游戏的名字。
-
游戏设置:包括游戏用户设置、游戏难度、窗口尺寸设置、音效设置、游戏运行时长设置、模式设置。
-
显示需求:主界面左上角显示图标需求,主界面弹出位置居中需求等。
2.2 系统开发环境
俄罗斯方块程序是利用JAVA语言进行开发。设计和开发过程中,使用了如下开发技术和环境。
-
JDK工具
JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
-
MyEclipse开发
MyEclipse企业级工作平台(MyEclipseEnterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,JSP,CSS,Javascript,Spring,SQL,Hibernate。
相较于之前的java 开发工具,myeclipse 拥有独立于其他开发工具的易用性,它采用组装式软件的模式来实现该工具,例如XML 文件有特定的插件对XML格式进行数据解析,HTML 和JSP 文件继承自XML 格式的编辑器,除此之外,Myeclipse 还拥有独立的工程生成器,用户只需要指定所需创建的工程类型,即可使用该功能直接创建该种类型的工程基础框架,整个工程建立过程一步到位,同时支持数十种工程类型,在对于框架的支持上,经典的SSH 框架在Myeclipse中的设计体现得尤为明显,其中包括struts 和hibernate 配置文件,先前的java开发工具所无法支持的拖拽式控件开发,所见即所得的开发模式,在Myeclipse工具也对该问题做了很大程度上的完善,实现快速敏捷开发,同时java 平台本身的跨平台特性也为该开发工具的快速应用提供了可能。
MyEclipse 是一个十分优秀的用于开发Java, J2EE的 Eclipse 插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。MyEclipse可以支持Java Servlet,AJAX,JSP,JSF,Struts,Spring,Hibernate,EJB3,JDBC数据库链接工具等多项功能。可以说MyEclipse是几乎囊括了所有主流开源产品的专属eclipse开发工具。
3 系统总体设计
3.1游戏总体流程
游戏总体处理过程见图 3-1。实现如下游戏操控流程:
点击控制面板内的“开始”或“控制”菜单内的“开始”按钮开始游戏。游戏开始后,使用上、下、左、右键或 I、K、J、L 键控制方块的变形、下落、向左和向右移动。方块满行消除,分数自动增加,分数每满 100 等级自动增加一级。
游戏运行过程中,可以通过“提高等级”、“降低等级”按钮,来手动改变游戏等级。也可点击“颜色”菜单内的选项,更改前景色、背景色。
当方块占满整个窗口或方块要超过顶部时,不能再有新方块下落时,游戏会弹出“Game Over”的对话框提示游戏结束。
图3-1 游戏基本流程图
3.2 功能架构分解
游戏可分成界面显示和游戏控制两个功能模块。界面显示包括创建游戏界面、处理操作请求、操作结果显示和游戏设置功能模块。游戏设置包括等级设置、音效设置和背景设置。游戏控制包括游戏开始、暂停/继续、重新开始、退出、方块变换、方块移动等子功能模块。参见图3-2。
图 3-2功能架构分解图
3.3 实现架构
Swing是一个为Java设计的GUI工具包。Swing是JAVA基础类的一部分,Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。JFrame 是 Swing 组件的顶层容器,该类继承了 AWT 的 Frame 类,支持 Swing 体系结构的高级 GUI 属性。JPanel 是一种中间层容器,它能容纳组件并将组件组合在一起,但它本身必须添加到其他容器中使用。
本文通过开发Swing组件以及为其注册监听器来实现各种操作功能,监听器分别有动作监听器,键盘监听器,选项监听器。具体参见图3-3。
根据布局,可以确定所用的Swing组件对象有:Jframe,JPanel,Jlabel,Jbutton,Jmenu,JmenuItem等对象。
图 3-3 系统实现架构图
4 系统详细设计及实现
4.1 概述
Java 是一种纯面向对象(Object-Oriented)的程序语言,按照面向对象的设计概念对游戏进行设计。根据面向对象地三大特征:封装、继承、多态,设计中要找到对象,建立对象,使用对象,维护对象的关系。将功能封装进对象,强调了具备了功能的对象。
类是对游戏中事物的描述。对象就是这类事物,实实在在存在的个体。描述事物就是描述事物的属性和行为。属性对应类中的变量,行为对应类中的函数(方法)。定义类是描述事物定义属性和行为。属性和行为共同成为类中的成员(成员变量和成员方法)
游戏主要设计如下的类:
ControlMainGame 类:继承自 JFrame 类,作为游戏的主类,负责对游戏的主体全局进行控制,是各个类关联和指挥的枢纽。
ControlPanel类:继承自JPanel类,作为操作面板类,布设主游戏窗口,积分板,级别控制按钮等窗口,控制游戏进程。
ChangeBlockColor类:继承自 JPanel 类,动态改变画布类的方格颜色,画布类通过检查方格颜色来呈现方块的移动和消除状态。
BlockPaint 类:方格类,是方块的基本组成元素,表达方式为颜色。
BlockOperation 类:继承自Thread类,主要功能是操控,控制方块的移动,下落以及形状变换。
4.2 主界面显示模块
俄罗斯方块这类小游戏,良好的设计思路不仅体现在简洁精致的操作功能上,而且体现在良好的人机界面上。为玩家设计制作布局合理、视觉效果良好的界面对游戏的可玩性来说非常重要。
游戏主界面采用Swing组件开发,并且向其注册监听器,用来各项控制功能。根据游戏窗体的设计,需要注册三个监听器:分别是动作监听器(ActionListener)、键盘监听器(KeyListener)和选项监听器(ItemListener)。
游戏中用到的 Swing 组件对象包括 JFrame 对象、JPanel 对象,JLabel 对象、JButton 对象、JMenuBar 对象、JMenu 对象、JMenuItem 对象、JTextField 对象、JTextArea 对象、JDialog 对象等十多个 Swing 组件对象。图 4-1 为游戏界面图。
图 4-1 游戏主界面截图
4.3按钮设置
图 4-2 按钮设置图
进入按钮设置菜单后,出现如图的界面。程序代码如下:
Public interface GameService{
Public Boolean keyup(); /*方向键上*/
Public Boolean keyDown();/*方向键下*/
Public Boolean keyLeft();/*方向键左*/
Public Boolean keyRight();/*方向键右*/
Public Boolean keyFunUp(); /*三角(直接增加分数),通过直接增加分数来提升等级*/
Public Boolean keyFunDown();/*大叉,迅速下落*/
Public Boolean keyFunLeft();/*方块(控制阴影开关键)*/
Public Boolean keyFunRight();/*圆圈(暂停)*/
Public void startGame();/*启动主线程,开始游戏*/
Public void mainAction(); /*游戏主要行为*/
}
4.4 游戏方块产生和显示
游戏方块的显示是游戏最基本的功能模块。本论文采用的是,通过预制小方块图片的截取,再拼合成7种规定的不同形状的方块,对其进行储存并编号从0到6,然后再通过随机数生成器Random每次产生随机形状的方块下落。
-
随机数生成器:private Random random=new Random();
-
二维数组储存方块:static {
TYPE_CONFIG=new ArrayList<Point[]>(7);
TYPE_CONFIG.add(new Point[] {new Point(4,0),new Point(3,0),new Point(5,0),new Point(6,0)});//长条形
TYPE_CONFIG.add(new Point[] {new Point(4,0),new Point(3,0),new Point(5,0),new Point(4,1)});//T型
TYPE_CONFIG.add(new Point[] {new Point(4,0),new Point(3,0),new Point(5,0),new Point(3,1)});//横7型
TYPE_CONFIG.add(new Point[] {new Point(4,0),new Point(5,0),new Point(3,1),new Point(4,1)});//反Z型
TYPE_CONFIG.add(new Point[] {new Point(4,0),new Point(5,0),new Point(4,1),new Point(5,1)});//正方形
TYPE_CONFIG.add(new Point[] {new Point(4,0),new Point(3,0),new Point(5,0),new Point(5,1)});“¬”型
TYPE_CONFIG.add(new Point[] {new Point(4,0),new Point(3,0),new Point(4,1),new Point(5,1)});Z型
}
图 4-3 方块产生和显示图
4.5 游戏方块移动
对于方块的移动功能的实现,本论文通过改变方块原有的坐标,然后重新绘制方块。方块翻转也只需要改变背景数组的值,重新绘制方块即可。
方块的移动设置编码:
public boolean move(int moveX,int moveY,boolean[][] gameMap) {
for(int i = 0 ;i<actPoints.length;i++) {
int newX=actPoints[i].x+moveX;
int newY=actPoints[i].y+moveY;
if(this.isOverZone(newX,newY,gameMap)) {
return false;
}
}
for (int i = 0; i < actPoints.length; i++){
actPoints[i].x+=moveX;
actPoints[i].y+=moveY;
}
return true;
}
在设计时需要判定方块移动的边界问题。当方块因为翻转而超出界面时,需要将翻转后的方块进行平移,然后绘制方块,同时要避免出现翻转平移后的方块和其它方块的重叠问题。
方块的移动分为方块的自动下落以及通过按键事件实现方块的左移、右移以及加速下移。通过多线程 ShapeDriver 类实现方块的自动下移,考虑到游戏里方块的动态性,每个方块有一定的生命周期,可以使用线程来实现方块。一个方块用一个线程类对象表示,该类继承自Thread 父类。当一个方块出现时就表示一个线程对象产生并开始运行。基于对按键事件的响应,完成图形的左移、右移以及加速下移。
4.6 方块旋转
对于方块旋转功能的实现,本文采用的是对7种预制方块除了正方形方块之外,均对其规定一个中心点,再利用笛卡尔旋转公式的算法对方块进行旋转,其中正方形方块跳过旋转操作。
方块的旋转设置编码:
public void round(boolean[][] gameMap) {
if(this.typeCode==4) {
return;
}
for (int i = 1; i < actPoints.length; i++) {
int newX=actPoints[0].y+actPoints[0].x-actPoints[i].y;
int newY=actPoints[0].y-actPoints[0].x+actPoints[i].x;
if(this.isOverZone(newX,newY,gameMap)) {
return;
}
}
for (int i = 1; i < actPoints.length; i++) {
int newX=actPoints[0].y+actPoints[0].x-actPoints[i].y;
int newY=actPoints[0].y-actPoints[0].x+actPoints[i].x;
actPoints[i].x=newX;
actPoints[i].y=newY;
}
}
图 4-4 方块旋转原理图
而对于方块是否超出边界或堆砌设置,采用的是将方块的每个小方块的坐标进行判定是否超出边界或与其他方块重叠,若超出边界,则不执行移动和旋转操作。见图4-5。
判定方法的编码:
private boolean isOverZone(int x,int y,boolean[][] gameMap) {
return x<MIN_X || x>MAX_X || y<MIN_Y || y>MAX_Y || gameMap[x][y];
}
4-5 方块翻转处理流程图(略)
4.4 控制面板
游戏通过键盘控制方块的移动和旋转,通过按钮控制游戏的开始和设置。
按钮控制:包括得分统计、等级统计、最高分记录统计等字段,其中的 TextField 控件是游戏本身统计给出,用户无法编辑。游戏规则是每消一行得10分,每增加100分上升一个等级。初始得分为 0,初始等级为 1,“最高分记录”是记录当前游戏的最高分。
5 系统的调试运行
5.1 概述
软件测试是软件开发中非常重要的一环,是软件质量的重要保障。测试方法和测试用例设计的优劣会直接影响到软件功能、性能、效率和稳定性。因此,必须要设计良好的测试用例和实现良好的测试方法。
软件应从多角度进行测试和分析,并且黑盒测试人员选择和软件开发和设计人员无关的人员。因软件开发人员容易形成思维定势,在测试的时候不可避免地会受到这种思想的束缚,容易遗漏和规避程序错误。
在软件测试过程中应该注意如下几点:
1>语法错误
语法错误是经常碰到的错误,语法错误可能导致不能继续编写代码。
2>逻辑错误
逻辑错误一般可能是潜在和难以检测的。如果出现键入错误或流程问题引起的逻辑错误,可能会成功运行,但会产生错误的结果。
3>运行时错误
运行时错误是在执行过程中指令试图执行不可能的动作而导致的,这种错误必须及时纠正,否则可能会出现游戏的不可靠运行。
本论文在开发和测试过程中采用了多种以保证软件质量,对软件容易出现的异常如边界处旋转、方块翻转越界等进行了重点测试,降低了软件出错概率。尽管经过了较为充分的测试,但系统中难免存在一些其它缺陷。所以,游戏测试还要从多个角度,方法论,时间和空间维度考虑,全面测试尽量减少软件bug。
5.2 代码测试
经过对软件代码的走读和执行白盒测试,发现一些问题并及时解决:
-
写 get()方法时要求有返回值,但是程序遗漏了 return 语句,导致程序在编译时出现错误。解决方法是,在方法中加入return 语句,返回相应的内容即可。
-
使用随机函数产生方块时,遗漏了传入参数给方块,编译不能通过。针对各个方块传递对应的参数,问题解决。
-
运行程序时,统计的分数经常会被覆盖,而没有累计。检查发现,原因是程序笔误,score变量只做了赋值而没有累加导致,修改后解决了该问题。
-
在如何检测及消除、越界处理上、升级判断等,还存在一些算法和流程的错误。经过讨论请教以及查阅资料,问题都最终解决。
5.3 游戏功能测试
5.3.1 方块操控测试
-
方块移动测试
操作:游戏过程中,点击“下、左、右”结果:方块正常移动,不会移出边界
-
方块旋转测试
操作:游戏过程中,点击向上方向键
结果:方块无边界和障碍物阻挡时可反转
5.3.2 菜单操作测试
-
“游戏”菜单测试
-
操作:点击“开始”
结果:开始游戏,方块开始下落
-
操作:点击“结束”
结果:游戏结束正常
-
操作:点击“游戏”à “提高等级”
结果:等级提高正常
-
操作:点击“游戏”à “降低等级”
结果:等级降低正常
-
操作:点击 “暂停”
结果:暂停游戏,方块停止下落结果
-
操作:点击 “重新开始”
结果:重新开始新游戏
-
点击“背景”菜单测试
-
操作:点击“设置”à “背景”
结果:更换背景正常
5-1 游戏设置界面测试
5.3.3方块堆积与消除测试
-
方块堆砌测试
输入:方块下落到最底面或与障碍物接触
结果:方块成功堆砌在底部
-
游戏消行测试
输入:出现满行现象
结果:所有满行被消除,方块依次下移
-
游戏结束测试
输入:出现满屏现象
结果:弹出会话窗口,提示“Game Over”。
5-2 方块下落消除测试
5.4测试结果分析
通过上述对游戏各项功能的测试,可以判断游戏的各项功能能够正常实现。
因为游戏是需要广泛分发给大众游玩,因此真正一个运行良好游玩体验佳的游戏,还需要发布测试版本给大众进行测试,收集反馈意见进行完善和修改。另外,游戏需要长时间运行,因此需要对游戏的操控做长时间的点击和拷机测试,进一步测试程序运行的稳定性。这都需要在以后的开发测试工作中加以完善。
6 总结与展望
通过这次毕业设计,我成了俄罗斯方块游戏的设计和修改任务。在整个开发过程中遇到了很多问题,如方块的绘制和变形、线程的创建问题、同步的控制、满行判断、消行的处理以及最高分数记录的功能实现等各种问题,但最终得到解决。
在解决问题的过程中,思考和查阅了大量资料进行分析,并从各大游戏下载网站下载单机版俄罗斯方块游戏,并研究其中功能的实现和界面的设计,经过逐步的设计与反复的修改论证,才完成了整个游戏的开发和解决各种设计开发和测试问题。
整个设计的过程,采取了自上到下的瀑布模型,从总体入手,分解功能需求,设计功能模块,从总体设计到详细设计,再到功能和系统测试。最后根据测试问题,对设计和开发进行修改和优化。通过这些工作,初步熟悉了软件开发工作流程。
通过毕业设计的创作,我对 Java 这种开发语言有了更深一步的了解,锻炼和提高了我的编程能力,也将对我以后的就业打下良好的基础。
游戏设计不但程序算法和逻辑实现很重要,良好美观易用的游戏界面也往往起到决定性作用。一个优秀的游戏软件设计是一项系统工作,需要编程、美工、音效、动作和情节等方方面面的细致工作,而我所做的工作仅仅完成其中的一小部分,因此要学习的内容还有很多很多。我将会继续努力学习和实践,提升自己的综合水平和能力。
7 参考文献
[1].俄罗斯方块有助预防创伤后应激障碍[J].发明与创新(大科技),2017(05):56.
[2]任天.玩俄罗斯方块能缓解心理创伤吗[J].方圆,2017(08):60-61.
[3]高成珍.基于Java的俄罗斯方块游戏的设计与实现[J].科技经济市场,2017(02):24-25.
[4]兰琼.俄罗斯方块的迷人之处[J].现代班组,2016(07):52-53.
[5]康向荣.《Java程序设计》教学方法探究[J].电子测试,2014(06):156-157.
[6]曾庆维,冯镍.一种基于玩家水平的俄罗斯方块游戏[J].软件导刊,2014,13(01):26-28.
[7]王西艳.俄罗斯方块游戏的设计与实现[J].办公自动化,2013(20):63-64+45.
[8]杨桦,周春容.俄罗斯方块游戏中关键算法的分析与实现[J].电脑编程技巧与维护,2013(12):10-12.
[9]汪红霞.俄罗斯方块设计[J].计算机光盘软件与应用,2012,15(21):187-188.
[10]徐寅哲.基于JAVA的俄罗斯方块游戏开发[J].资治文摘(管理版),2009(05):192+199.
[11]邱菊,唐凯军,徐立希,牛小梅.基于枚举算法设计“俄罗斯方块”游戏[J].电脑知识与技术,2009,5(14):3710-3712.
[12]王国东.陈天桥的“俄罗斯方块”[J].现代计算机(普及版),2008(06):107.
[13]赵福生.L形方块完全覆盖俄罗斯方块图形的条件[J].电脑知识与技术,2008(12):571.
[14]高凌琴,陈青华.俄罗斯方块游戏关键技术探讨[J].信息技术与信息化,2008(02):69-71.
[15]胡爱民.“俄罗斯方块”中方块的旋转问题[J].数学教学,2006(09):12-13+50.
[16]黄复贤.俄罗斯方块游戏的敏捷设计与开发[J].电脑编程技巧与维护,2005(04):74-77.
[17]孤山青竹.游戏中的人生哲学[J].软件工程师,2005(Z1):118.
[18]万玉,王战戈,孙镛.游戏编程中的变换算法[J].曲阜师范大学学报(自然科学版),2004(03):35-38.
[19]钟再敏 ,钟其水 ,朱华.“俄罗斯方块”自己编[J].多媒体世界,2000(04):110-111.
[20]赵东跃.俄罗斯方块编程[J].电脑编程技巧与维护,1998(06):16-20+22.
[21].新俄罗斯方块[J].中文信息,1995(03):11.