基于Java的俄罗斯方块游戏的设计与实现
俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛,人所共知。俄罗斯方块游戏简单的基本规则是有小方块组成的7种不同的规则图形陆续从屏幕上落下,玩家操作移动使其下落拼出一条完整的横条,随即会消失,玩家得分,游戏等级提高,当没有被消除的图形堆积到屏幕顶端时,游戏结束。
俄罗斯方块游戏最初是由俄罗斯人阿列克谢·帕基特诺夫在1984年开发的休闲小游戏,曾几何时它创造了无可匹敌的商业价值,影响了一代休闲小游戏的开发与产业链。随着信息时代科技时代的不断发展和变化,计算机已经普及到每一个人的生活中,在繁忙的工作生活中,这一类休闲小游戏给人们带来了些许的放松。
这篇论文详细的描述分析了经典传统的俄罗斯方块实现的基本思路和一些基本游戏规则,在此基础之上,更进一步地开发出俄罗斯方块的创新创意模式,在经典游戏基础上开发出随着分数增高而等级增高难度加大的模式,并且创意性的开发出可操控方块颜色变换的模块,并且增添了游戏声音和音乐模块。本论文对上述功能给出了具体实现流程、详细描述、和一些源代码。
本论文阐述了俄罗斯方块游戏的开发和发展历史、开发此游戏的意义以及开发环境并根据软件工程开发软件和java编写程序的相关知识,对程序的需求分析、概要设计、详细设计与实现、调试运行进行了一系列描述。
此次程序设计是在Microsoft Windows 7系统下,以Java为开发语言,在Eclipse开发平台上进行游戏的设计与实现。
关键词:游戏设计;俄罗斯方块;软件工程;Java;Eclipse。
目录
基于Java的俄罗斯方块游戏的设计与实现………………………………. I
摘 要…………………………………………………………… I
Based on the design and implementation of Java game Tetris………….. II
Abstract………………………………………………………… II
1 绪论…………………………………………………………… 1
1.1程序开发背景及意义…………………………………………. 1
1.2开发技术概述………………………………………………. 2
1.3俄罗斯方块游戏的研究现状……………………………………. 2
1.3.1 国内外研究现状……………………………………….. 2
1.3.2 文献综述…………………………………………….. 3
2相关技术……………………………………………………….. 4
2.1JAVA简介………………………………………………….. 4
2.2 Swing组件简介…………………………………………….. 4
2.3Eclipse开发平台简介………………………………………… 5
2.4系统平台环境:…………………………………………….. 6
2.4.1 硬件平台:…………………………………………… 6
2.4.2 软件平台:…………………………………………… 6
3 系统分析………………………………………………………. 7
3.1可行性分析………………………………………………… 7
3.1.1经济可行性分析……………………………………….. 8
3.1.2技术可行性分析……………………………………….. 8
3.1.3社会可行性分析……………………………………….. 8
3.2需求分析………………………………………………….. 8
3.2.1 功能性需求…………………………………………… 9
3.2.2 非功能性需求…………………………………………. 9
3.2.3 接口控制……………………………………………. 9
4 系统的概要设计………………………………………………… 11
4.1 系统的功能设计…………………………………………… 11
4.1.1 手动处理业务的基本流程………………………………. 11
4.1.2 基本流程的功能模块………………………………….. 12
5 系统的详细设计与实现………………………………………….. 15
5.1 游戏主界面显示模块……………………………………….. 15
5.2 画布、方块显示模块……………………………………….. 16
5.2.1 背景画布模块设计……………………………………. 16
5.2.2 预览方块模块设计……………………………………. 19
5.2.3 方块移动、旋转模块设计………………………………. 21
5.3 控制面版模块…………………………………………….. 25
5.3.1 菜单栏模块设计……………………………………… 25
5.3.2 控制面板按钮设计……………………………………. 26
6 系统的测试运行………………………………………………… 29
6.1 测试概述…………………………………………………. 29
6.1.1 测试原则…………………………………………… 29
6.1.2 测试方法…………………………………………… 30
6.1.3 测试意义及注意事项………………………………….. 31
6.2 游戏代码、算法的测试………………………………………. 31
6.3 游戏界面菜单选项的功能测试………………………………… 32
6.4 按键事件的功能测试………………………………………… 34
6.5 方块的堆砌与消行功能测试………………………………….. 35
6.6 测试结果………………………………………………… 35
结 论………………………………………………………….. 36
参考文献………………………………………………………… 38
致 谢…………………………………………………………… 39
附录A 外文原文………………………………………………….. 40
The psychology of Tetris………………………………………. 40
附录B 外文翻译………………………………………………….. 43
俄罗斯方块的心理效应………………………………………….. 43
1 绪论
绪论从程序的开发背景、开发意义以及所需要开发技术和目前国内外对俄罗斯方块游戏的研究现状进行了简要的叙述。
1.1程序开发背景及意义
俄罗斯方块游戏是一款流行于全世界并且经久不衰的游戏,是一款在计算机,手机,电视游戏机,掌上游戏机等一系列产品上都能玩的休闲小游戏,它曾经创造了几乎任何游戏都无可匹敌的轰动和无数的商业价值,是游戏史,软件开发史上的一件重要的大事。
在1984年6月的一天,俄罗斯莫斯科的数学家阿列克谢·帕基特诺夫(Alex Pajitnov)在工作地点莫斯科科学计算机中心玩过一个拼图游戏后突然受到启发,而设计出这款游戏,刚开始他只是在Electronica 60(一种计算机)上进行开发,后来经由瓦丁·格拉西莫夫(Vadim Gerasimov)移植到PC端,并且在莫斯科的计算机界广泛传播,俄罗斯方块开始大火,成为了有史以来最为畅销的经典休闲小游戏,至今还一如既往保持魅力。俄罗斯方块简单的基本游戏规则是在一个用于摆放小正方形的标准虚拟游戏场地,基本单位为小型正方形;由四个小型正方形组成7中不同的规则图形(田字形,Z字形,反Z字形,7字形,反7字形,T字形,长条形)通过玩家操作上键以90度,180度,270度,360度旋转方块一共有28种图形方案,通过左键右键左右移动,下键加速下落调整位置,是方块在屏幕底部拼出完整的一条或几条,然后消除,给新落下的方块腾出位置,每消除一条完整横条,玩家等级提高一级,当等级提高到一定等级时刚快下落速度加快,一旦没被消除的方块到达屏幕顶端,游戏结束。
随着计算机技术的日益更新和不断发展,俄罗斯方块游戏也不断地推出各式各样的模式,也有许多不同的版本供大家玩耍,因为游戏本身有简单,有复杂,能够很好地锻炼游戏玩家的脑力反应能力,和逻辑思维能力,还能给玩家带来无穷的游戏乐趣,所以深受广大玩家的喜欢。对于开发游戏软件,大多数人都感到触摸不到,很神奇,随着开发方法和工具的不断推陈出新,自己动手开发一些小游戏也并非遥不可及。俄罗斯方块游戏在游戏史上的地位无可匹敌,并且游戏的界面简约,代码并不是很复杂,互联网上也有很多关于俄罗斯方块游戏实现的一些算法和设计,难度并非特别大。
俄罗斯方块游戏简单,益智,以其独特简洁的界面和极具玩耍乐趣的模式让众多的游戏爱好者深陷其中,无法自拔,并且老少皆宜。在如今快节奏的生活当中,学生和工作党的学习工作压力也随之越来越大,每个人的任务逐渐繁重,越来越少的自由支配休息时间让人们更加迫切的需要有一些既简单又节省时间的休闲游戏供大家娱乐。毫无疑问,俄罗斯方块是一款简单益智有趣的休闲小游戏,并且可以移植到电脑、手机、平板电脑、电视游戏机、掌上游戏机、电子词典、Mp4等一系列便携设备上。本次课题研究,无论从技术开发上,还是社会意义上,都是很有价值的,是本人对游戏开发的一次胆大尝试。
1.2开发技术概述
软件工程是一门研究用工程化方法构建和维护有效的,实用的和高质量的软件的学科;设计包括程序设计语言,数据库,算法,软件开发工具,系统平台,设计模式等很多方面;在现代社会中,软件应用于电子邮件,嵌入式系统,人机交互界面,办公套件,操作系统,编辑器,数据库,游戏等多个典型方面;同时,在如今社会的各式各样的行业中都有计算机软件的应用,包括工业,农业,银行,航空,政府部门等等,能有效的促进经济和社会的发展,提高人们的工作效率和生活效率。
俄罗斯方块游戏开发代码相对来说不是特别复杂,本论文基于Java编程语言,采用Java语言中常用的Swing组件。Swing是Java中的图形用户界面(GUI)工具包,是Java基础类的一部分,包括了文本框,分隔窗格,按钮,表等GUI器件,使用纯Java写成,开发人员可以用少量的代码就可以写出Swing各式各样的灵活丰富的功能和模块化组件来创建漂亮优美的用户界面。Java Swing组件中包括以下几个常用的类:JFrame 是屏幕上的图形对象,可以有最大化、最小化、关闭等基本操作,是Java的GUI程序设计的基本思路;JPanel 能够用来嵌套,对窗体中有相同逻辑功能的组件进行组合,能够加到JFrame窗体中,是Swing中的面板容器类。 JLabel 对象是用来显示文本、图像或同时显示二者并且可以设置其中的一些属性;JTextField是一个用来编辑单行文本的运行组件;JButton是一个用来创建按钮的类。除此之外,Java中的Swing组件中还包含有许多功能的类,可以简单的来创建一些优美漂亮的图形界面。
1.3俄罗斯方块游戏的研究现状
1.3.1 国内外研究现状
进入二十一世纪以来,计算机不断地发展,电竞行业也在不断进入上升阶段,游戏软件的开发越来越火,游戏软件就如同戏剧、电影一样,是一种越来越火的新型的综合型艺术产品。跟一般的网页开发,软件开发不同,计算机游戏软件的开发不仅需要设计开发人员掌握专业的程序设计技巧和软件工程的方法,还需要专业的游戏领域的知识,专业的游戏开发知识,才能有效的开发和实现游戏的生动界面,音效处理,并且跟玩家达成完美的交互等。
前苏联科学家阿列克谢·帕基特诺夫(Alex Pajitnov)原本开发的《俄罗斯方块》游戏是作为一种教育用软件的,之后开始提供授权给各个游戏公司,至此以后,各大平台上就出现了各种不同版本的游戏。
Game Boy版的俄罗斯方块游戏在日本本土卖出了424万套,成为了Game Boy游戏史上卖的最火的游戏。在海湾战争期间,俄罗斯方块游戏成为了前线美军最适合的消磨时间的游戏之一。
俄罗斯方块游戏的基本原理对于大多数程序员来说是相对比较简单的,并且俄罗斯方块游戏具有数学性,动态性和很强的知名度。也经常拿来作为游戏程序设计的练习题材。
1.3.2 文献综述
文献[1]和文献[2]以零基础讲解为宗旨,用实例引导读者深入学习,采染基础知识→核心技术→高级应用→项目实战的讲解模式,深入浅出地讲解Java的各项技术及实战技能。从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发应该掌握的各方面技术。包括:熟悉Eclipse开发工具,Java 语言基础,类和对象,包装类,数字处理类,接口、继承与多态,类的高级特性,异常处理,Swing程序设计,集合类,I/O输入输出,反射,枚举类型与泛型,多线程,网络通信,数据库操作,Swing表格组件,Swing树组件,Swing其他高级组件,高级布局管理器,高级事件处理,AWT绘图与音频播放等。这两本文献覆盖了“够用”得Java语言和技术,实例丰富,内容详尽,对于初学者和有一定的Java基础的学生来说,可以快速的提高学生的开发技术和技能。本课题设计中有关图形界面设计的内容、用户界面构件及设计、事件处理与窗口构造构件以及Swing的基础知识及其系列组件等方面的内容都参考了这两本文献,给予了我很大的帮助。
文献[3]主要讲解了包括2D绘图;游戏动画的制作;网络程序基础;强化游戏界面;人工智能与2.5D游戏;扫雷、迷宫、俄罗斯方块等游戏实例;碰撞、粒子系统、5D立体坐标等绘图算法;多人联机游戏制作。收集了一系列的算法公式,让读者能更方便的利用。以由浅入深的方式,逐步分析游戏设计的过程,带领读者解决游戏开发阶段可能遇到的问题,并总结了Java游戏制作的实战经验。本课程设计中游戏的原理、动画的实现、音效的处理、鼠标和键盘事件处理、人工智能等知识都参考了该文献。
文献[4]探讨了经典的电脑游戏-俄罗斯方块的程序原理及其实现技术,从软件工程的角度描述了程序的功能要求、数据结构以及图形旋转、坐标变换等关键技术。通过这本文献让我了解了更多的关于俄罗斯方块游戏开发的专业领域的知识。
文献[5]属于进阶性书籍,更加侧重于讲解如何使用Java来思考解决问题。这本文献本次课程设计中,给予了我很多关于Java在编程时编程思想和技巧上很多的帮助
2相关技术
2.1 JAVA简介
Java是由Sun Microsystems公司推出的Java面向对象程序设计语言和Java平台的总称。是一种能够编写跨平台应用软件的面向对象的程序设计语言。Java 技术具有良好的通用性、高效性、跨平台性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
Java语言历时近二十年,已发展成为人类计算机史上影响力最深远的编程语言之一,从某种程度上看,它甚至超出了编程语言的范畴,成为了一种开发平台,一种开发规范模式。更甚至于:Java已经成为了一种信仰,Java语言所崇尚的开源,自由,等精神,吸引了全世界无数的优秀的程序员。事实上,从人类有记载历史以来,从来没有一种编程语言可以吸引这么多优秀的程序员使用,也没有一种编程语言能衍生出这么多的开源框架。
Java语言是一门非常纯粹的面向对象的编程语言,它吸引了C语言和C++语言的各种优点,又摒弃了C++语言里难以理解的多继承,指针等概念,因此Java语言具有功能强大和简单易用两个非常良好的特征。Java语言作为静态面向对象编程语言的代表,极好地表现了面向对象理论,允许程序员以一种更加优雅的思维方式进行更加复杂的编程开发。
不仅如此,Java语言中相关的Java EE规范中包含了当今时下最流行的各种软件工程理念,各种先进的设计思想,都可以在Java EE规范、平台以及相关的框架中找见相应的实现原理。从某种程度上来看,学精通了Java语言相关的各种方面的知识,相当于系统的学习了软件开发的相关知识,而不是仅仅学完了一门编程语言。
时至今日,大部分银行,电信,证券,电子商务,电子政务等各种系统或者已经采用Java EE平台构建,或者正在逐渐过渡到采用Java EE平台来构建,Java EE 规范是目前最成熟的,也是应用最广泛的企业级应用开发规范。
2.2 Swing组件简介
Swing API 是一组可扩展的 GUI 组件,用来创建基于 JAVA 的前端/ GUI 应用程序。它是建立在 AWT API 之上,并且作为 AWT API 的替代者,因为它的几乎每一个控件都对应 AWT 控件。 Swing 组件遵循模型 – 视图 – 控制器架构来满足下面的准则。一个单一的 API 足够支持多种外观和风格;API 是模拟驱动的,这样最高层级的 API 不需要有数据;API 是使用 Java Bean 模式的,这样 Builder Tools 和 IDE 可以为开发者提供更好的服务来使用它。
Swing API 架构用下列的方式来遵循基于松散的 MVC 架构。模型表示组件的数据。视图表示组件数据的可视化表示形式。控制器接受用户在视图上的输入,并且在组件的数据上反映变化。Swing 组件把模型作为一个单独的元素,并且把视图和控制器部分组合成用户界面的元素。使用这种方式,Swing 具有可插拔的外观与风格架构。Swing特点主要有:
轻量级 —— Swing 组件是独立的本地操作系统的 API,因为 Swing API 控件通常采用纯 JAVA 代码而不是采用底层的操作系统调用来呈现。
丰富的控件 —— Swing 提供了一组丰富的先进的控件,如树,页签窗体,滑动条,颜色选择器,表格控件。
高级自定义 —— Swing 控件可以用非常简单的方法来自定义,因为可视化外观是独立于内部表示的。
可插拔的外观和风格 —— 基于 Swing 的 GUI 应用程序的外观和风格可以在运行时根据有效的值改变。
2.3 Eclipse开发平台简介
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。Eclipse只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。
Eclipse起始于1999年4月,最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE,2001年11月贡献给开源社区,目前由IBM牵头,围绕着Eclipse项目已经发展成一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase等,现在由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。 2003年,Eclipse 3.0选择OSGi服务平台规范为运行时架构。 2007年6月,稳定版3.3发布。2008年6月发布代号为Ganymede的3.4版。
Eclipse是著名的跨平台的自由集成开发环境(IDE),最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse原本只是一个框架平台,提供插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,允许构建与 Eclipse 环境无缝集成的工具,众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。由于 Eclipse 中的每样东西都是插件,给 Eclipse 提供插件,为用户提供一致和统一的集成开发环境,使所有工具开发人员都具有同等的发挥场所。
Eclipse的优势:
目前全球有上百万人在使用Eclipse进行开发。为什么Eclipse拥有如此众多的拥趸?这与Eclipse集众多特性于一身有很大关系。
Eclipse 是开放源代码的软件。这意味着Eclipse不仅可以免费使用,还可以通过研究源代码学习世界上顶尖开发人员的编程技术,并可以共享遍布全球的开发人员所贡献的公共开放源代码库。
Eclipse是真正可扩展并可配置的。Eclipse采用插件机制,犹如一个花瓶,你可以随时向花瓶里面插花,也可以很容易将不再需要的花取出。目前,互联网上免费的、收费的插件遍地开花,插件开发工作在国内外也如火如荼。
Eclipse支持众多的开发语言而不仅仅是Java。Eclipse只是给开发人员提供了一个能够扩展系统功能的最小核心,基于扩展点的插件体系结构使得Eclipse支持多种语言成为可能。只要安装相应语言的插件,Eclipse就可以支持该种语言的开发。目前,Eclipse已经可以支持C/C++、 COBOL、PHP、Perl、Python等多种语言。(尽管 Eclipse 主要是一个 Java 开发环境,但其体系结构确保了对其它编程语言的支持)。
Eclipse提供了对多重平台特性的支持。开发者可以使用他们感觉最舒适、最熟悉的平台,例如Windows、Linux、MacOS等。Eclipse对每个平台都有其单独的图形工具包,这使得应用程序具有接近本地操作系统的外观和更好的性能。
基于业界领先的OSGi规范。OSGi规范最早由Sun Microsystems、IBM、爱立信等于1999年推出,其服务平台包括:服务网关、汽车、移动电话、工业自动化、建筑物自动化、PDA网格计算、 娱乐(如iPronto)和 IDE等。基于OSGi的系统以微内核形式运行,因而能够轻松实现软件业界梦寐以求的可热插拔、动态改变行为、稳定高效的系统。Eclipse从3.1开 始,毅然抛弃了其原有的已经获得业界认可的框架,采用OSGi作为其架构。从Eclipse3.2版本开始,Eclipse提供了基于OSGi开发的支 持,开发者可以利用其开发基于OSGi的系统了。
Eclipse美轮美奂的人机界面受到广泛赞誉。Eclipse提供了全新的SWT/JFace API(而不是AWT/Swing),一改SWT/Swing单调、沉闷的界面风格,使得开发基于本地的具有丰富图形界面的应用程序成为可能,犹如一股春 风吹进Java的桌面开发领域,给人耳目一新的感觉。
Eclipse由业界领先者推出,具有强大的行业力量。Eclipse基金会吸收了大量学术研究机构、商业组织,领导Eclipse的长远规划和发展,并确保Eclipse处于软件工具行业的领先地位。
2.4系统平台环境:
2.4.1 硬件平台:
本程序开发计算机硬件如下:
内存:4G
硬盘:500G
CPU:Intel(R)Core(TM)i5—3230M CPU @2.60GHz
交互工具:键盘、鼠标
显示器:LCD显示器
2.4.2 软件平台:
本系统的开发环境如下
操作系统:Microsoft Windows 7 Ultumate
JDK版本:jdk-8u121-windows-x64
Eclipse版本: Neon.2 Release (4.6.2),eclipse-inst-win64
3 系统分析
系统分析是软件开发过程中我们所要做的第一步,包括系统的需求分析和可行性分析。系统的需求分析,主要是用来说明本系统是一个什么系统,必须用来做什么,就这个问题上达到开发人员和主要用户之间的共识。系统的可行性分析,主要就是对系统的所有的一切资源实施进行分析,用来说明系统的开发和投入的合理性,可行性和必然性,并对其中可能会出现的不可预见性的问题进行合理的分析。软件开发中最具有挑战性的环节莫过于对系统的需求分析,花费在需求分析上的时间无疑是非常有价值的,如果时常发生需求变更,会给软件开发在预定计划内完成的任务带来非常严重的不利影响。做好系统的需求分析和可行性分析,这样有利于提高软件开发过程中的便利性,能对软件开发过程进行实时监控和管理,更方便的按计划进行,从而达到提高软件的质量的目的,为程序开发人员,用户等提供更便携的交流合作。作为工作成果的原始依据,系统的需求分析和可行性分析也间接的可以向潜在用户表达自己系统的功能,让用户来判断系统的功能等是否符合所要达到的需求。
3.1可行性分析
可行性分析基于技术,经济,工程,技术等方面的项目主要内容和配套条件,如市场需求,资源供应,施工规模,工艺路线,设备选型,环境影响,资金筹集,盈利能力等。 其他方面研究分析比较,项目完成后可能取得的财务,经济和社会环境影响的预测,该项目是否值得投资,以及如何对项目决策进行咨询建设,为全面的系统分析方法提供依据。 可行性分析应具有远见,公正,可靠,科学的特点。
为了保证可行性研究工作的科学性、客观性和公正性,有效地防止错误和遗漏,在可行性研究中,首先必须站在客观公正的立场进行调查研究,做好基础资料的收集工作。对于收集的基础资料,要按照客观实际情况进行论证评价,如实地反映客观经济规律,从客观数据出发,通过科学分析,得出项目是否可行的结论。
可行性研究报告的内容深度必须达到国家规定的标准,基本内容要完整,应尽可能多地占有数据资料,避免粗制滥造,搞形式主义。
在做法上要掌握好以下几个要点:先论证,后决策;处理好项目建议书、可行性研究、评估这三个阶段的关系,哪一个阶段发现不可行都应当停止研究;要将调查研究贯彻始终。一定要掌握切实可靠的资料,以保证资料选取的全面性、重要性、客观性和连续性;多方案比较,择优选取。对于涉外项目,或者在加入WTO等外在因素的压力下必须与国外接轨的项目,可行性研究的内容及深度还应尽可能与国际接轨。
为保证可行性研究的工作质量,应保证咨询设计单位足够的工作周期,防止因各种原因的不负责任草率行事。
可行性分析的目的是确定是否可以在最短时间之内用最低的成本解决这个问题。可行性分析最主要的不是解决问题,而是要研究这些问题是否值得去花费人力和财力去研究和解决。如果有简单易行的方法则予以肯定。
3.1.1经济可行性分析
系统的经济可行性分析的目的是,核算系统从开发建设到系统运行期间所需的资金投入,以及新系统的市场需求及经济效益,将投入预算与预计收益进行对比,核算经济方面的成本的可行性。
本游戏系统主要是用于大学生软件工程毕业课程设计,不需要考虑其所能产生的经济效益和游戏日后的发展状态。对游戏系统的本身的经济要求并不高,只是通过本游戏系统的开发来提升学生自身的知识和能力水平。只需要有一台装有JDK运行环境和Java开发工具Eclipse软件的电脑就可以,所以经济问题可不用考虑。
3.1.2技术可行性分析
可用于编写俄罗斯方块游戏的编程语言有很多,本次课题主要是在基于Java的环境下进行游戏系统的开发,所以本系统主要利用的是Java中的Swing组件进行开发,需要对变量定义,初始化,界面设计,游戏初始化,进入游戏,退出游戏,处理游戏过程中的各种操作进行相应功能的代码要求,技术方面要求并非特别困难,技术可行。
3.1.3社会可行性分析
本游戏系统的开发主要是用于毕业课程设计与论文,用以巩固大学四年学习的知识,主要以个人和学校为单位,仅供个人娱乐和学校的课程设计与毕业论文检查入档案,不会对社会造成任何的影响,所以无需考虑到任何法律,版权等一系列社会因素,在这方面完全可行。
3.2需求分析
所谓的“需求分析”是指对待解决的问题的详细分析,澄清问题的要求,包括需要输入什么数据,得到什么结果,最后应该输出什么。可以说,在软件工程中“需求分析”是确定电脑“做什么”,达到什么样的效果。可以说,需求分析是在系统完成之前完成的。
在软件工程中,需求分析是指在创建新的或更改现有计算机系统时描述新系统的目的,范围,定义和功能所需的所有工作。需求分析是软件工程中的关键过程。在这个过程中,系统分析师和软件工程师决定了客户的需求。只有在确定了这些需求之后,才能分析和寻求新系统的解决方案。需求分析阶段的任务是确定软件系统功能。
在软件工程的历史上,人们一直认为需求分析是软件工程中最简单的一步。但是在过去十年中,越来越多的人意识到需求分析是最重要的过程。如果分析师在需求分析时无法正确地了解客户的需求,则最终软件无法真正达到客户的需求,或软件项目在指定时间内无法完成。
3.2.1 功能性需求
整个游戏系统会随机产生7种由四个小方块组成的不同形状的方块,经过旋转后得到28种状态,如果增加游戏难度,会增加六种不同形状的方块形状,同样经过旋转后增加24种状态。方块按一定的速度自由下落,玩家通过键盘上的上下左右按键控制方块的左右移动和旋转,将方块落下后放在合适的位置。当方块落下后,如果方块落下后有一整行被方块填满,那么该一整行消去。当一行被消去时,玩家得分增加10分,当得分达到100分后,玩家等级增加一级,速度加快一级,难度加大。如果当方块落下后整个游戏画布界面被占满,则方块不再下落,游戏宣告失败。游戏具体的功能需求有如下几个:
▪ 游戏界面需求:游戏的良好的界面会让玩家眼前一亮,更加能充分的感受到游戏带来的娱乐性,放松性。本游戏的默认背景色是深绿色,游戏主界面画面自定义为自己的所喜欢的图片,并可以更改,主界面方块默认用橘黄色,预显方块颜色默认为淡紫色。背景色、前景色对比鲜明,以达到让玩家眼前一亮的感觉,并能在游戏达到高等级状态,方块下落速度渐高的情况下使玩家能够清楚的分辨出下落方块的形状,增加游戏的刺激性。
▪ 游戏形状需求:用数组作为存储方块52种状态的数据结构,即初级等级长条形、Z字形、反Z形、田字形、7字形、反7形、T字型一共7种形状的向4个方向的旋转变形,和中级等级的三种方块12种不同的状态,高级等级的三种方块12种不同的状态。各个方块可以实现按逆时针的旋转方式旋转,并且方块能否旋转需要用条件加以判断,如果旋转后可能发生越界,则不能旋转,需要调整位置来保证他可以旋转。
▪ 键盘处理事件需求:当方块下落时,玩家可以通过键盘上的方向键:上键实现旋转,下键实现加速下落,左键实现左移,右键实现右移,和空格键实现一键下落,字母P键实现暂停,字母C键实现继续等一系列的操作。
▪ 鼠标处理事件需求:通过鼠标,可以点击控制面板中的菜单按钮和帮助按钮,选择菜单栏的菜单项,可以实现游戏的开局,选择游戏等级,更改游戏中方块的颜色显示,游戏主界面背景色和前景色的显示,更改游戏背景图片,方块下落速度,是否播放游戏中的声音等一系列的功能。
▪ 显示需求:本游戏程序的显示需求是要求当方块落下后填满一整行,则该行消除,其余剩下的未填满的行自动逐次向下移动,消去一行右界面得分增加十分,当分数增加到100分时,等级增加一等级。当方块落下叠加到主界面的全部所有行时,方块不再下落,游戏结束,主界面提示“Game Over”字样。
3.2.2 非功能性需求
非功能性需求:俄罗斯方块游戏系统的非功能性需求包括游戏主界面左上角图标显示,调整窗口尺寸最大化最小化(但不包括主界面的尺寸大小),游戏运行时弹出窗口的位置居中等一系列非功能性需求。
3.2.3 接口控制
本俄罗斯游戏系统在Windows操作系统下,主要是通过键盘进行游戏的操
作,通过鼠标进行开局,退出,设置等一系列操作。首先,游戏利用键盘的按键进行游戏的操作,所以需要使用键盘的接口事件。其次,在游戏进行的全过程中,需要使用鼠标进行游戏的控制,包括开始,选择等级,改变设置,改变颜色,查看版本信息,退出等,所以要对鼠标的单击,按键添加接口监听事件,编写相应的代码来实现鼠标和键盘的相应功能。
4 系统的概要设计
4.1 系统的功能设计
4.1.1 手动处理业务的基本流程
本游戏的设计以娱乐为初衷,以益智为目的,在综合研究以往俄罗斯方块经典游戏功能的基础上推陈出新,加之新的功能,赋以新的生机和活力。以下具体阐述游戏的基本流程。
运行说明:
1>运行程序,点击右侧控制面板内的“开始”或“控制”菜单内的“开始”按钮开始游戏。
2>使用上、下、左、右键和空格键,P键,C键控制方块的变形、下落、向左和向右移动和一键迅速下落,暂停,继续。
3>方块满行消除,分数自动增加,等级自动增加一级。
4>等级增加、方块下落速度增加,按右侧控制面板或“游戏”菜单内的“初级”“中级”,“高级”按钮来手动改变游戏难易程度。也可点击“方块颜色”菜单内的选项,更改方块颜色等,也可以通过“自定义”菜单内的选项,来更改游戏的一些属性。
5>按键盘键字母P键可以控制游戏暂停,然后按子母键C键可以控制游戏继续上次游戏。按“结束游戏”按钮,游戏会彻底停止正在进行的当局游戏,再按“开始”或“控制”菜单内的“重新开始”会开始新游戏。
6>当方块占满整个窗口,不能再有新方块下落时,游戏会弹出“Game Over”的对话框提示游戏结束。
游戏的基本流程图如图4—1所示:
图4-1游戏的基本流程图
4.1.2 基本流程的功能模块
本系统基于游戏的各项功能来设计游戏的各个功能模块。图4-2为本游戏的系统功能模块示意图,如图所示,本游戏主要有两大模块:游戏界面区,游戏控制区。游戏界面区分显示玩家可选操作、显示玩家操作结果两个部分。游戏控制区分更改颜色、开始、更改游戏等级为初级、更改游戏等级为中级、更改游戏等级为高级、自定义下落速度、更改背景、退出以及其他等一些功能模块。
图4-2系统功能模块示意图
图4-3为游戏界面区模块设计示意图,如图所示,游戏界面区模块可细分为闯进新游戏界面、处理玩家操作、显示玩家操作结果三个功能模块。
图4-3界面模块示意图
图3-4为游戏控制区设计示意图,如图所示,游戏控制区模块分为开始、自定义操作设置、初始游戏级别设置、初始颜色设置、退出等功能模块。
图4-4控制区模块示意图
5 系统的详细设计与实现
Java是一种纯面向对象(Object-Oriented)的程序语言,它的诸多优点在此就不作详细论述了。从面向对象的观念出发,本程序主要可分为以下几个模块:
●游戏主界面显示模块
●方块及数据显示模块
●方块移动控制模块
●游戏界面颜色控制模块
●游戏进度、等级控制模块
分析对象的技巧在于它的功能的扩展性及维护效率。试想,如果因为外部环境或者用户需求的变化需要对程序进行功能扩展或者维护,就要对代码作大幅度的更动甚至重写,这样就失去了面向对象的优势,所以在本程序分析时将独立性高的模块作为一个对象,以提高程序的可扩展性和可维护性。以下该游戏中类的设计:
MyFrame类:继承自JFrame类,作为游戏的主类,负责对游戏的主体全局进行控制,连接与指挥各个类的枢纽。
PreView类:继承自JPanel类,作为操作面板类,负责安放主游戏窗口,积分板,级别控制按钮等窗口用以控制游戏进程。
GameCanvas类:继承自JPanel类,ChangeBlockColor线程类动态改变画布类的方格颜色,画布类通过检查方格颜色来体现ChangeBlockColor方块的移动情况与消去状况。
Box类:方格类,组成方块的基本元素,主要表达方式为颜色。
Block类:作为操控方块的类,控制方块的移动,下落以及变形。
5.1 游戏主界面显示模块
一个优秀的软件系统不仅体现在核心的功能的多样性和强大上,如果使用者所面对的是枯燥的、陈旧的界面的话,那么这个的软件系统是不成功的,所以好的、精美的界面设计是极为重要的环节。为玩家设计制作布局合理、视觉效果良好的界面的重要性就不言而喻了。
游戏主界面采用Swing组件开发,并且向其注册监听器,以实现各种控制功能,综合游戏窗体的设计,其上至少需要注册三个监听器,分别是动作监听器(ActionListener)、键盘监听器(KeyListener)、选项监听器(ItemListener)。
根据初步设计,可以确定客户端上所要用到的Swing组件对象有JFrame对象、JPanel对象,JLabel对象、JButton对象、JMenuBar对象、JMenu对象、JMenuItem对象、JTextField对象、JTextArea对象、JDialog对象等,至少十个Swing组件对象。下图5-1为游戏主界面截图。
图5-1游戏主界面截图
本游戏主界面设计的初始颜色搭配基于对比鲜明的原则,默认背景色为深绿色,左上角设置俄罗斯方块图标,得分初始值为0,等级初始值为1,最高分记录初始值为0。游戏主窗体尺寸设置为(520,580),方块移动范围窗格由一个20行、12列的二维数组控制,且左上角图标设置为方块图案,起标识作用。
5.2 画布、方块显示模块
本游戏中将画布设计为自定义图片,可以根据自己的需求来自己动手更改背景图片,在方块下落过程中,根据颜色的变化识别下落的方块。
5.2.1 背景画布模块设计
该游戏的主背景画布是一个20行、12列的二维数组,方块显示是由相应颜色变化来标识,主窗体用颜色填充后可形成呈现出来背景样式和方块。本游戏用继承自JPanel的GameCanvas类控制背景画布的显示,用rows代表画布的行数,cols代表画布的列数,行数和列数决定着画布拥有方格的数目。背景画布主要实现代码如下:
首先,用一个画布类的构造函数来表示整个主界面的行数、列数以及主界
中的相对位置:
/**
* 画布类的构造函数
* @param rows int, 画布的行数
* @param cols int, 画布的列数
* 行数和列数决定着画布拥有方格的数目
*/
public GameCanvas(int rows, int cols) {
this.rows = rows;
this.cols = cols;
this.setOpaque(false);
boxes = new Box[rows][cols];
for (int i = 0; i < boxes.length; i++) {
for (int j = 0; j < boxes[i].length; j++) {
boxes[i][j] = new Box(false);
}
}
setBounds(0, 0, 300, 500);//设置相对位置坐标
setBorder(new EtchedBorder(
EtchedBorder.RAISED, Color.white, new Color(148, 145, 140)));
}
/**
* 取得画布中方格的行数
* @return int, 方格的行数
*/
public int getRows() {
return rows;
}
/**
* 取得画布中方格的列数
* @return int, 方格的列数
*/
public int getCols() {
return cols;
}
其次,在设置一个画布类的构造函数来表示整个主界面的前景色,背景色并获取其前景色和背景色:
/**
* 画布类的构造函数
* @param rows 与public GameCanvas(int rows, int cols)同
* @param cols 与public GameCanvas(int rows, int cols)同
* @param backColor Color, 背景色
* @param frontColor Color, 前景色
*/
public GameCanvas(int rows, int cols,
Color backColor, Color frontColor) {
this(rows, cols);
this.backColor = backColor;
this.frontColor = frontColor;
}
/**
* 设置游戏背景色彩
* @param backColor Color, 背景色彩
*/
public void setBackgroundColor(Color backColor) {
this.backColor = backColor;
}
/**
* 取得游戏背景色彩
* @return Color, 背景色彩
*/
public Color getBackgroundColor() {
return backColor;
}
5.2.2 预览方块模块设计
方块和数据信息是游戏中最基本的功能模块。Box这个类方格类,是组成块的基本元素,用自己的颜色来表示块的外观 ,MyTask继承TimerTask类用来定时下落,用计数方式来实现速度的改变,MyListener类继承KeyAdapter类用来实现按键监听,控制方块的上下左右。定义一个4×4方阵,共16个小格。用“0”和“1”来表示每个方格是绘制新颜色还是保留底色。
每得到一个新方块,都是随机从七种形态的方块中选取一种。游戏定义了一个变量,代表新方块的模型。比如定义int型数组STYLE代表28中方块类型,7行4列,每个元素代表其中一种方块。即0<=blockkindnum<=6,0=<blockstatusnum<=3
那么,当方块落下需要得到新方块时,只需随机得到一对blockkindnum,blockstatusnum值,然后再根据这个STYLE的值构画相应的方块。剩下的问题就是应该怎么随机到一对STYLE行列值。
Java语言包中的Math类提供了一个生成随机数的方法random(),调用这个方法会产生一个在0-1之间的双精度浮点数。所以每次要得到新方块时,只需调用一次这个方法,得到一个0-1的双精度浮点数,然后用该数乘以7,之后强转成整型,即可得到1—7的整数,用来控制行。用该数乘以4,之后强转成整型,即可得到1—4的整数,用来控制列。
由此可以组合出多种图形定义然后用代码实现下列功能:
1>每次执行首先为随机数产生不同的初值。
int col = (int) (Math.random() * (gc.getCols() – 3));//随即位置生成列
int style = Constant.STYLES[(int) (Math.random() * Block.get_addl())][(int) (Math.random() * 4)];
图5-2随机产生方块流程图
2>随机选取一个图形,图5-2随机产生方块图具体描述用生成的随机数控
产生的图形。
3>当前图形在其4*4网格中的位置信息。
绘制4行4列的方块预显方格,随机生成预显示的方块样式。本游戏用二维数组存储方块的28种样式。
值得注意的是:在传统的俄罗斯方块游戏的基础上,本游戏系统为了体现出创新的思维,本着为了学习的原则,在传统游戏的基础上增加了中级三种其他的方块样式和高级三种其他的方块样式。一共有52种方块样式,具体的存储方式主要实现代码如下:
/**
* 分别对应对13种模型的52种状态
*/
public final static int[][] STYLES = {// 共28种状态
{0xf000, 0x8888, 0xf000, 0x8888}, // 长条型的四种状态
{0x4e00, 0x4640, 0xe400, 0x4c40}, // ‘T’型的四种状态
{0x4620, 0x6c00, 0x4620, 0x6c00}, // 反’Z’型的四种状态
{0x2640, 0xc600, 0x2640, 0xc600}, // ‘Z’型的四种状态
{0x6220, 0x1700, 0x2230, 0x7400}, // ‘7’型的四种状态
{0x6440, 0xe200, 0x44c0, 0x8e00}, // 反’7’型的四种状态
{0x6600, 0x6600, 0x6600, 0x6600}, // 方块的四种状态
{0x8c88,0xf200,0x44c4,0x4f00},//增加的中级样式方块3个
{0xea00,0xc4c0,0xae00,0xc8c0},
{0x8c00,0xc800,0xc400,0x4c00},
{0xac00,0xcc40,0x6e00,0x8cc0},//增加的高级样式方块3个
{0x4e40,0x4e40,0x4e40,0x4e40},
{0x8480,0xa400,0x4840,0x4a00},
};
传统俄罗斯方块游戏的7种方块样式,相信很多人都知道,在这里就不一一截图展示常见的方块样式。以下是在传统游戏的模式下增加的三种中级难度和三种高级难度的方块模型:
●增加的三种中级难度方块模型(经过90度、180度、270度、360度旋得到四种转状态)
图5-10增加的三种中级难度方块模型
●增加的三种高级难度方块模型(经过90度、180度、270度、360度旋得到四种转状态)
图5-11增加的三种高级难度方块模型
5.2.3 方块移动、旋转模块设计
方块的翻转与移动比较容易实现,方块移动只需要改变方块的横坐标或纵坐标,然后重新绘制方块即可。方块翻转也只需要改变背景数组的值,重新绘制方块即可。
本游戏方块下落时,进行动态绘制,实现Cloneable接口, 以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。方块的操作类BlockOperation继承Thread类,重写run()方法,以实现方块的动态正确下落。当然,在线程中要判定方块是处于moving状态还是pausing状态。
publicvoid run()
{
//moving判定方块是否在动态下落
while (moving)
{
try
{
//betweenleveltime指示相邻等级之间相差时间
sleep(betweenleveltime
* (ControlMainGame.maxlevel – level + flatgene));
} catch (InterruptedException ie)
{
ie.printStackTrace();
}
//pausing判定游戏是否处于暂停状态
if (!pausing)
moving = (moveTo(y + 1, x) && moving);
//moving是在等待的100毫秒间,moving没被改变
}}
当然,在游戏中还要判定方块移动的边界问题, 比如,一个方块在它左边正好差一个格子的空间才能够翻转,但是它的右边恰好有一个格子的空间,这种情况,如果方块不能够翻转,就不方便用户操作,如果能够翻转,就会发生越界,将已经存在的方块挤占掉。要想实现翻转又不发生越界,那么,就应该在方块翻转后把它往右边移动一个格子,然后再绘制方块,这样,方块就不会挤占掉其它已经固定住的方块了,以下解决越界问题。
1>方块翻转判定
在两种情况可能发生越界,一种是方块落下去固定住以后,第二种是周围的空间不允许它进行翻转。
第一种情况只需要参考方块落下去后不能够再移动的判定即可。
对于第二种情况,在每次方块翻转前,必须首先计算出方块周围的空间,如果空间允许则翻转。否则,不能翻转。
因为七种方块是不规则的,每种方块要求的翻转空间都是不一样的,甚至是在它的不同翻转状态下,所要求的翻转空间也是不一样的,首先想到的自然就是为每一种方块,方块的每一种状态都写一个判定条件,但是这样做未免过于麻烦。
根据观察,不难发现,七种形态的方块,长条形的方块如果以横条的形态下落,则只要能够下落,就能翻转,如果以竖条的形态下落,那么它翻转后所处的位置必须要有4×1个格子的空间才能够翻转。对于田字形的方块,只有能够继续下坠,就一定能够翻转,所以田字型的方块只要没有落下,就一直能够翻转。而其它五种形态的方块,又有一个共同点,就是它们都有两种翻转状态横向占三个格子的空间,竖直方向占两个空间,另外两种翻转状态横向占两个格子的空间,竖直方向占三个格子空间,如果他们是以横向占三个格子的状态下落,那么只要能下落,就一定能够翻转,如果是以横向两个格子的状态下落,那么在翻转后,周围必须要有3×2个格子的空间。
所以,方块翻转的判定,要分三种情况,第一种情况是方块落下去后不能翻转;第二种情况是对竖直状态出现的长条形的方块进行翻转判定;第三种情况是对除长条形和田字形之外的其它五种以横向占两个格子的状态出现的方块进行翻转判定。
何种情况下方块能够翻转的问题解决了,接下来,我们就应该解决方块翻转后所处的位置的问题了,因为只有事先知道方块翻转后所处的位置,才能够对那个位置的空间范围进行判定,判定它是否能够容纳方块。
可以确定的是,无论方块怎么翻转,都处在方块数组中,也就是说方块必定是在游戏地图中某一4×4个格子的空间范围内。
方块数组在游戏主界面中的坐标是确定的,不确定的是方块翻转后到底处在方块数组的哪个位置,为了解决这个问题,我们可以限定方块在方块数组中的存储原则是靠左、靠上,这样,无论翻转怎么翻转,方块数组中第一行和第一列都是有方块的,这样也就确定了方块在方块数组中的位置,也就可以得知方块翻转后在游戏地图中的位置了。
假定方块数组的横纵坐标是x和y,那么,这个位置就是,长条形的方块翻转后所处的那一行是游戏地图的第y行,所占的列是第x到x+3列,长条形和田字形以外的五种方块翻转后的所占的行数是游戏地图的第y和第y+1行,所占的列是第x到x+2列。
所以,如果以上空间有空格子,方块就能够翻转。
2>翻转越界纠正
只要方块翻转后所处的空间足够,方块就能够翻转,但是,如果方块翻转后所处的空间不足够,而在它的另一边却有足够的空间呢?
方块在边界处时,翻转后不仅可能翻出地图外,还可能发生数组越界,当然,只需要将地图数组定义得大一些,就能够避免数组越界错误,对于方块越界,如果在它的另一边有足够空间,那么,就应该把方块往另一个方向移动适当的单位,纠正方块越界错误。如图5-12方块翻转流程图所示,方块翻转需要经三次判定:是否已经下落到底部、翻转后是否有足够空间、翻转后是否越界。
图5-12 方块翻转处理流程图
玩家操作键盘实现方块的移动、旋转,代码引进ControlKeyListener类继承KeyAdapter类进行键盘监听功能的实现。KeyAdapter类继承自Object类,实现KeyListener接口,用来接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。扩展此类即可创建 KeyEvent 侦听器并重写所需事件的方法,即是 ControlKeyListener类。使用ControlKeyListener可创建侦听器对象,然后使用组件的 addKeyListener 方法向该组件注册此侦听器对象。当按下、释放或键入某个键时,将调用该侦听器对象中的相应方法,并将 KeyEvent 传递给相应的方法。实现代码如下:
privateclass ControlKeyListener extends KeyAdapter
{
publicvoid keyPressed(KeyEvent ke)
{
if (!game.isPlaying())
return;
BlockOperation blockope = game.getCurBlock();
switch (ke.getKeyCode())
{
case KeyEvent.VK_DOWN:
blockope.moveDown();
break;
case KeyEvent.VK_LEFT:
blockope.moveLeft();
break;
case KeyEvent.VK_RIGHT:
blockope.moveRight();
break;
case KeyEvent.VK_UP:
blockope.turnNext();
break;
default:
break;}}}
5.3 控制面版模块
5.3.1 菜单栏模块设计
菜单栏中有“游戏”、“帮助”四个菜单选项。“游戏”选项又分“开局”、“初级”、“中级”、“高级”、“自定义”、“方块颜色”、“退出”等七个选项。“帮助”选项中有“关于”选项,用于显示游戏版本等信息。
1>“开局”的按钮功能为实现游戏画布的重新绘制,类似reset的功能。该按钮的监听实现代码如下:
/**
* 重置画布
*/
public void reset() {
for (int i = 0; i < boxes.length; i++) {
for (int j = 0; j < boxes[i].length; j++)
boxes[i][j].setColor(false);
}
repaint();
}
2>“初级”、“中级”、“高级”按钮用来手动调节游戏的等级,从而改变游戏的等级难度。 “退出”按钮控制游戏随时退出,终止游戏。
3>“帮助”按钮中点击“关于”按钮显示与游戏软件本身相关信息,具体信息如图所示:
图4—19 “关于”选项截图
5.3.2 控制面板按钮设计
本游戏控制面板中包含得分统计、等级统计等字段。
其中的TextField控件均由游戏本身统计给出,玩家不能私自编辑。本游戏的游戏规则为每消一行得10分,每增加100分上升一个等级,初始得分为0,初始等级为1。
以下给出得分、等级更新等功能实现的主要代码:
/**
* 判断是否满行,满行则调用消行方法。
*/
private void isFullLine() {
// TODO Auto-generated method stub
for (int i = 0; i < 20; i++) {
int row = 0;
boolean flag = true;
for (int j = 0; j < 12; j++) {
if (!gc.getBox(i, j).isColorBox()) {
flag = false;
break;
}
}
if (flag == true) {
row = i;
gc.delete(row);//删除行
if(isMusic==true)
{mp.playEraseSound();}
addScor();//增加分数
if(scor%100==0)//设置为100分增加一个等级
upspeed=true;//将速度增加标志位至为true
if(upspeed==true)
upLevel();
}
}
}
/**
* 得分的计算方法
*/
private void addScor() {
scor=scor+10;
jt9.setText(“得分:”+MyFrame.scor);
}
}
private void reset() {
scor=0;
rank=0;
jt10.setText(“等级:”+rank);
jt9.setText(“得分:”+scor);
upspeed=false;
playing=true;
runstop=false;
gc.setGameOver(false);
gc.repaint();
gc.reset();
}
控制面板中按钮的功能在4.3.1中已给出代码,在此不再赘述。
6 系统的测试运行
6.1 测试概述
系统测试,是将软件,计算机硬件,外围设备,网络等元素确认在一起进行各种信息系统的组装测试和确认测试,系统测试是为整个产品系统进行测试,目的是验证是否 系统满足需求规格的定义,找出与需求规格不一致或矛盾的地方,以提出更全面的方案。系统测试发现问题后,尝试找出错误的原因和位置,然后进行更正。 是基于黑盒子类测试的整体系统要求,应该覆盖系统的所有组件。 对象不仅包括要测试的软件,还包括软件依赖的硬件,外围设备甚至包括某些数据,一些支持软件及其接口。
系统测试是一个集成测试软件,作为计算机系统的一部分,结合系统的其他部分,在计算机系统的实际操作环境中进行一系列严格有效的测试,以找出软件潜在的问题,确保系统的正常运行。
系统测试的目的是验证最终软件系统是否符合用户要求。
主要内容包括:
(1)功能测试。也就是说,测试软件系统的功能是正确的,根据文档的要求,如《产品需求规格说明书》。 因为正确性是软件最重要的品质因素,因此功能测试至关重要。
(2)健壮性测试。也就是说,在异常情况下测试软件系统的能力是否正常运行。健壮性有两个含义:一个是容错,另一个是恢复能力。
6.1.1 测试原则
软件测试的基本原则,齐全的检测的产品用户的角度,尽可能多发现系统使用的问题过程中的问题和漏洞、研究和分析、在产品中,有缺陷的方面提出问题与改进建议。详细的测试原理如下:
(1)软件测试计划是软件测试的行动导向,实际的测试应该细心严格执行,高可行性的严格执行测试计划,特别是确定测试方法和测试目的。
(2)测试标准,建立基于用户需求,软件测试,主要目的是为了确保产品的一致性和验证产品能够满足客户的需求,所以在测试过程中应该在用户的角度始终站在看问题,并发现软件缺陷和不足所带来的影响,系统中最严重的错误无法满足用户需求的程序以及功能缺陷。
(3)不能随意对待测试。
尤其是对系统的测试,反复测试,如果不严格执行测试计划,很有可能会因为疏忽导致的新BUG的产生。因此,反复测试阶段也应给予充分重视,早期检测中有很多错误,大多是因为疏忽而没被发现。
目的:
(1)确保系统测试的活动正常进行;
(2)验证软件产品和系统要求不匹配或矛盾的情况;
(3)建立完善的系统测试缺陷跟踪数据库;
(4)确保软件系统的测试活动和结果及时通知相关团体和个人。
6.1.2 测试方法
为了全方位的测试系统,找出系统中存在的问题和故障,使用多种测试方法一起测试,可以更加全面的总结出系统设计的优缺点。采用的测试方法有以下几个:
功能测试:测试系统中各个功能模块下的功能点是否可以正常使用;
手动测试:主要测试输入、点击等各项功能;
黑盒测试:输入后查看得出的结果是否正确。
恢复测试:恢复测试作为系统测试,主要关注导致软件运行失败的各种条件,并验证恢复过程可以正常实施。 在某些情况下,系统需要具有容错能力。 此外,系统故障必须在规定的时间内更正,否则将导致严重的经济损失。恢复测试主要检查系统的容错能力。当系统出错时,能否在指定时间间隔内修正错误并重新启动系统。恢复测试首先要采用各种办法强迫系统失败,然后验证系统是否能尽快恢复。对于自动恢复需验证重新初始化(reinitialization)、检查点(checkpointing mechanisms)、数据恢复(data recovery)和重新启动 (restart)等机制的正确性;对于人工干预的恢复系统,还需估测平均修复时间,确定其是否在可接受的范围内。
安全测试:安全测试用于验证系统内的保护机制,防止非法入侵。 在安全测试中,测试人员扮演着试图入侵系统的角色,采用多种方式试图突破防线。 所以系统安全设计的标准是找出使入侵系统成本更高的方法。安全测试检查系统对非法侵入的防范能力。安全测试期间,测试人员假扮非法入侵者,采用各种办法试图突破防线。例如,①想方设法截取或破译口令;②专门定做软件破坏系统的保护机制;③故意导致系统失败,企图趁恢复之机非法进入;④试图通过浏览非保密数据,推导所需信息,等等。理论上讲,只要有足够的时间和资源,没有不可进入的系统。因此系统安全设计的准则是,使非法侵入的代价超过被保护信息的价值。此时非法侵入者已无利可图。
压力测试:压力测试是指在正常资源下使用异常流量,频率或数据量来实施系统。 以下试验可以在压力试验中进行:
①如果平均中断次数是每秒一到两次,那么特殊测试用例的设计每秒产生10次中断。
②将输入数据量增加一个数量级,以确定输入函数如何响应。
③在虚拟操作系统中,需要产生最大量的内存或其他资源的测试用例,或产生过多的磁盘存储数据。
一般的情况下,系统都要反复测试,因为在系统时间和功能的限制,所以系统不可能完美无缺。因此,有必要对各种测试方法一起检测。
强度测试
强度测试检查程序对异常情况的抵抗能力。强度测试总是迫使系统在异常的资源配置下运行。例如,①当中断的正常频率为每秒一至两个时,运行每秒产生十个中断的测试用例;②定量地增长数据输入率,检查输入子功能的反映能力;③运行需要最大存储空间(或其他资源)的测试用例;④运行可能导致虚存操作系统崩溃或磁盘数据剧烈抖动的测试用例,等等。
性能测试
对于那些实时和嵌入式系统,软件部分即使满足功能要求,也未必能够满足性能要求,虽然从单元测试起,每一测试步骤都包含性能测试,领测认为只有当系统真正集成之后,在真实环境中才能全面、可靠地测试运行性能系统性能测试是为了完成这一任务。性能测试有时与强度测试相结合,经常需要其他软硬件的配套支持。
6.1.3 测试意义及注意事项
软件测试是软件设计过程中极其重要的一个环节,是保证软件的质量的重要保障。测试的方法的好坏会直接影响到软件的好坏,进行软件测试可以找出其中的错误、不足并加以改进,从而得到一个高效、可靠的系统。
软件应从多角度进行测试和分析,这样才能找出其中错误的地方。测试的时间最好找一些与设计系统无关的人员,或者分析人员。因为在开发软件的时候,开发人员已经形成了自己的思维定势,在测试的时候始终受到这种思想的束缚,很难找出其中的错误而与设计无关的人员和那些分析人员很容易找出错误所在。
在程序调试过程中一定要耐心仔细,一个细微的错误将会导致整个功能不能实现导致浪费很多的时间去修改。应在以下几方面加以注意:
1>语法错误
语法错误是经常碰到的错误。例如,命令拼写错误或传递给函数的参数不正确都将产生错误。语法错误可能导致不能继续编写代码。
2>逻辑错误
逻辑错误通常可能是潜在和难以检测的。当有因键入错误或程序逻辑流程引起的逻辑错误,可能会成功运行,但产生的结果却是错的。例如,当本应使用小于符号比较数值,但却使用了大于符号时,那么将返回不正确的结果。
3>运行时错误
运行时错误是在执行过程中指令试图执行不可能的动作而导致的,必须纠正运行时产生的错误,这样才能保证软件运行的可靠性。
本游戏在开发过程中采用了多种有效措施进行测试以保证软件质量,对本游戏进行了边界处旋转、方块翻转越界等方面的测试,极大的保证了软件质量和出错几率。但是系统中可能还存在着一些其他的错误和缺陷,因此,游戏必须要经过反复的运行测试,尽最大量将bug减到最少。
6.2 游戏代码、算法的测试
1>写get()方法时需要有返回值,但是程序中没有写return语句,使程序在编译时出现错误。解决方法是,在方法中加入return语句,返回相应的内容即可。
2>使用随机函数产生方块时没有给各个方块传入参数,编译不能通过。解决方法是,根据各个方块的构造传入相应的参数。
3>写T字形方块各方格的默认位置时,将控制方块位置的变量i,初始化为0,运行的结果是丁字形方块默认成了竖形方块。解决方法是,将变量i的初始化数值改为1,即可达到设计的效果。
4>运行程序时,统计的分数只是每一次消除满行后的分数,而以前的分数就会被覆盖,没有累计。解决方法是,将程序中的“score=”改为“score+=”,就可以使分数累加。
5>算法流程的错误主要集中在如何检测及消去方块,还有如何在通关之后对分数的累加进行处理,是否升级的判定这些方面,经过与同学的讨论以及参考资料,都最终得到了解决。
6.3 游戏界面菜单选项的功能测试
1>“游戏”菜单测试
表6.1游戏菜单测试用例
测试用例编号 | 测试项目名称 | 测试执行步骤 | 输出 | 测试结果 |
01 | “开局”按钮测试 | 点击“游戏”→“开局” | 游戏重置 | 成功 |
02 | “结束游戏”按钮测试 | 点击“游戏”→“结束游戏” | 游戏结束 | 成功 |
03 | “初级”按钮测试 | 点击“游戏”→“初级” | 游戏等级选择为初级 | 成功 |
04 | “中级”按钮测试 | 点击“游戏”→“中级” | 游戏等级选择为中级 | 成功 |
05 | “高级”按钮测试 | 点击“游戏”→“高级” | 游戏等级选择为高级 | 成功 |
06 | “自定义”按钮测试 | “自定义”按钮测试 | 弹出对话框,可以更改自定义信息 | 成功 |
07 | “下落速度”滑块测试 | 点击“游戏”→“自定义”→“下落速度” | 拖动滑块可更改方块下落速度 | 成功 |
08 | “方块形状”单选框按钮测试 | 点击“游戏”→“自定义”→“方块形状”单选框 | 可选择方块形状初级、中级、高级、来改变方块的形状 | 成功 |
09 | “方块是否自动上涨”选择框测试 | 点击“游戏”→“自定义”→“方块是否自动上涨”选择框 | 可勾选小方格,选中则方块自动上涨,不选中则方块不自动上涨 | 成功 |
10 | “游戏过程是否播放声音”选择框测试 | 点击“游戏”→“自定义”→“游戏过程是否播放声音”选择框 | 可勾选小方格,选中则游戏过程中播放声音,不选中则游戏过程中不播放声音。 | 成功 |
11 | “更换背景”选择框 | 点击“游戏”→“自定义”→“游戏过程是否播放声音”选择框 | 可勾选小方格,选中则更换游戏背景图片,不选中则不更换游戏背景图片 | 成功 |
12 | “确定”和“取消”按钮测试 | 点击“游戏”→“自定义”→“确定”或“取消”按钮 | 点击确定保存更改设置退出对话框,点击取消则不更改设置退出对话框 | 成功 |
13 | “方块颜色”按钮测试 | 点击“游戏”→“方块颜色” | 弹出对话框,可以更改方块颜色,HSB,RGB等自定义信息 | 成功 |
14 | “退出”按钮测试 | 点击“游戏”→“退出” | 退出游戏并关闭主界面窗口 | 成功 |
2>“帮助”菜单测试
表6.2 “帮助”菜单测试用例
测试用例编号 | 测试项目名称 | 测试执行步骤 | 输出 | 测试结果 |
15 | “关于”按钮测试 | 点击“帮助”→“关于” | 弹出对话框,提示游戏版本等信息 | 成功 |
6.4 按键事件的功能测试
表6.3按键事件功能测试用例
测试用例编号 | 测试项目名称 | 测试执行步骤 | 输出 | 测试结果 |
16 | 方块移动测试 | 游戏过程中,点击“左、右、下” | 方块正常移动,不会移出边界 | 成功 |
17 | 方块旋转测试 | 游戏过程中,点击“上”方向键 | 方块无边界和障碍物阻挡的情况下可反转 | 成功 |
6.5 方块的堆砌与消行功能测试
表6.4 方块的堆砌与消行功能测试用例
测试用例编号 | 测试项目名称 | 测试执行步骤 | 输出 | 测试结果 |
18 | 方块堆砌测试 | 当方块下落到最底面或与障碍物接触时 | 方块成功堆砌在底部 | 成功 |
19 | 方块消行测试 | 当出现满行现象时 | 所有满行被消除,方块依次下移 | 成功 |
20 | 游戏结束测试 | 当出现满屏现象时 | 弹出会话窗口,提示“Game Over” | 成功 |
6.6 测试结果
经过多种测试方法对系统各个方面、功能的测试多次测试,测试结果表明系统基本符合的整体设计要求,预期功能基本完成。系统基本可满足设计开发之初的要求,测试结束。不过整体功能还不够强大,创新方面做的稍微逊色,作为开发的第一个版本,游戏在功能、界面设计等很多方面还需要进一步完善。
结 论
在做毕业设计之前,我对Java相关的开发只是停留在理论知识的水平上,此次毕业设计让我明白“纸上得来终觉浅,绝知此事要躬行”的道理。缺乏实际的软件开发经验,是我给自己下的定论。通过这次毕业设计,我完成了俄罗斯方块游戏的全部开发任务。在整个开发过程中遇到了很多问题,如方块的绘制和变形、线程的创建问题、同步的控制、满行判断、消行的处理以及最高分数记录的功能实现,但最终都被我一一解决,对其中比较主要的几点体会总结如下:
第一,为了熟悉俄罗斯方块的相关功能和设计,我时常从各大游戏下载网站下载单机版俄罗斯方块游戏,并研究其中功能的实现和界面的设计,思考和查阅资料进行分析,经过逐步的设计与反复的修改论证,才完成了整个游戏的开发。
第二,在游戏设计过程中,我采用从粗到精的设计模式,从小到大测试的原则。先设计游戏框架,并逐层测试,而后再添加具体实现代码并逐步进行更细化的测试。设计过程中,经常会遇到难题,我会通过反复思考和测试,然后找出自己的错误并加以改正,再进行下一个步骤,确保万无一失,尽力减轻最后的调试工作量。
第三,毕业设计业可以作为一个不断学习新鲜事物的过程,从设计初的不懂到最后能够圆满完成,我体会到在实践中不断学习的重要性,这对于将来我走上工作岗位具有重要的教育意义。通过毕业设计的创作,我对Java这门课程有了更深一步的了解,也对我今后的就业之路打下了一定的基础。
毕业设计是我们作为学生学习阶段的最后一步,是基础知识和专业知识的综合应用,是一个全面的重新学习,然后改进过程,学生学习能力的过程和独立思考和工作能力也是一个培训,而毕业设计水平也反映了大学教育的综合水平,所以学校非常重视毕业设计这一环节,加强毕业设计工作和动员教育的指导。在大学学习过程中,毕业设计是我们社会参与实际工作的重要组成部分,也是为了我们学习和解决生活问题的能力,是学校生活和社会生活的转型。毕业设计完成后,我尝试研究设计和实践工作的有机结合。这更有利于我们增强自己的能力。
经过一段时间的努力,在一些同学和老师的帮助下,我终于完成毕业项目,这是一项重要任务。回想一下我们设计的过程,可以说是困难和容易共存的。其中,把大学学习的知识被纳入内部,其实对我来说,也是一个不小的挑战,而且也是一次大学的知识的考试。
在毕业设计的过程中遇到了很多困难,而且很多都是没有遇到过的问题,如果不是亲自做,可能很难在某种程度上找到自己所缺乏的知识,对我们来说,找到问题,到解决问题,这是最实际的。面对自身难以解决的问题,在获取一些信息的同时,在老师和学生的帮助下,这些问题可以解决,所以毕业设计顺利完成。据了解,该项目的知识依然非常深奥,所以我们不仅现在,在未来更是要继续探索。
理论与实践的结合不仅包括课堂参与的知识,还包括技能培训的结合,以及指导学生如何去理解并接触与社会相关的东西。学生毕业设计,在专业理论知识的指导下,可以通过多种方式解决一些实际问题。在设计过程中,学生可以运用理论知识进行实践,不仅要加深对专业理论知识的理解,而且要丰富和发展本书的理论知识,使之变成更高层次的经验、技能。由于现有的教学模式,理论知识和技能与生产实践有着严重的分离,学生无法学习课堂以外的知识,实际生产问题常常与学习无关,无法有效得到应用。通过合理选择课题,引导学生有意识地运用知识和技能体系进行分析思考,为有机地整合理论知识和实践做出贡献。
社会不断变化,目前社会正在转型发展,人才的要求也越来越高,利用眼光看待问题,学习创新,学习适应社会发展要求。在校外,进入社会,抓住今天的机遇,创造未来。老师的影响力和教授的知识,让我了解很多道理,以一定的创新精神去面对将来的挑战。
总之,对于这一次毕业设计,我感觉个人不但比以前更加熟悉了一些专业方面的知识,还锻炼了自己的动手能力,觉得收获颇丰。同时也会有一种小小的成就感,因为自己在这项任务进行的过程中努力过了。而在以后的实际工作中,我们也应该同样努力,不求最好、只求更好! 还有就是,想在此对于我的指导老师和同学们表示忠心的感谢,感谢他们在这毕业设计过程中给我的帮助!
程序无论是从技术还是功能上都基本地满足了用户的需求。但由于初次设计,功能不够完善,细节方面的设计还有不足。
这次的毕业设计,我受益匪浅,让我的思维方式更加缜密,能多个角度的看待、处理问题;知道遇到问题该如何去分析问题、解决问题。相信这些都会让我在以后的工作中受益无穷的。
参考文献
[1] 李刚,疯狂Java讲义(第3版),北京:电子工业大学出版社,2014.7
[2] 明日科技,Java从入门到精通(第4版),北京:清华大学出版社,2016(2017.1重印)
[3] 荣钦科技 Java2游戏设计.清华大学出版社,2004.
[4] 高凌琴 陈青华.俄罗斯方块游戏关键技术探讨[J].信息技术与信息化讨,2008年第二期
[5] 艾克尔.Java编程思想[M].北京:机械工业出版社,2005.2
[6] (美) Paul Hyde.Java线程编程[M].北京:人们邮电出版社,2003
[7] Martin dejode.Symbian OS J2ME[M].北京:人民邮电出版社,2005.10
[8] 朱福喜. Java程序设计技巧与开发实例[M].北京:人民邮电出版社,2004.2
[9] 袁海燕 王文涛.Java实用程序设计100例[M].北京:人民邮电出版社,2005.2:51~96
[10] 黄复贤.俄罗斯方块游戏的敏捷设计与开发[J]. 电脑编程技巧与维护,2005.4
[11] (美)Bill Venners.深入Java虚拟机[M].北京:机械工业出版社,2003.9.63~98
[12] 闻怡洋.J2ME MIDP 1.0/2.0无线设备编程指南[M].北京:北京大学出版社,2004.5:393~420
[13]赵东跃.俄罗斯方块编程[J].电脑编程技巧与维护,1998年第六期
[14]殷兆麟.Java网络编程基础[M].北京:北方交通大学出版社,2004
[15] (美)John Zukowski.Java 2 从入门到精通[M].北京:电子工业出版社,1999
[16] 宋波.Java应用开发教程[M].北京:电子工业出版社,2002
[17] 托普雷.J2ME技术手册[M].北京:中国电力出版社,2004.6:259~312
附录A 外文原文
The psychology of Tetris
Shapes fall from the sky, all you have to do is to control how they fall and fit within each other. A simple premise, but add an annoyingly addictive electronica soundtrack (based on a Russian folk tune called Korobeiniki, apparently) and you have a revolution in entertainment.
Since Tetris was launched on the world in the 1980s, millions of hours have been lost through playing this simple game. Since then, we’ve seen games consoles grow in power, and with it the appearance of everything from Call of Duty to World of Warcraft. Yet block and puzzle games like Tetris still have a special place in our hearts. Why are they are so compelling?
The writer Jeffrey Goldsmith was so obsessed with Tetris that he wrote a famous article asking if the game’s creator Alexey Pajitnov had invented “a pharmatronic?” – a video game with the potency of an addictive drug. Some people say that after playing the game for hours they see falling blocks in their dreams or buildings move together in the street – a phenomenon known as the Tetris Effect. Such is its mental pull, there’s even been the suggestion that the game might be able to prevent flashbacks in people with PTSD.
I had my own Tetris phase, when I was a teenager, and spent more hours than I should have trying to align the falling blocks in rows. Recently, I started thinking about why games like Tetris are so compelling. My conclusion? It’s to do with a deep-seated psychological drive to tidy up.
Many human games are basically ritualised tidying up. Snooker, or pool if you are non-British, is a good example. The first person makes a mess (the break) and then the players take turns in potting the balls into the pockets, in a vary particular order. Tetris adds a computer-powered engine to this basic scenario – not only must the player tidy up, but the computer keeps throwing extra blocks from the sky to add to the mess. It looks like a perfect example of a pointless exercise – a game that doesn’t teach us anything useful, has no wider social or physical purpose, but which weirdly keeps us interested.
There’s a textbook psychological phenomenon called theZeigarnik Effect, named after Russian psychologist Bluma Zeigarnik. In the 1930s, Zeigarnik was in a busy cafe and heard that the waiters had fantastic memories for orders – but only up until the orders had been delivered. They could remember the requests of a party of 12, but once the food and drink had hit the table they forgot about it instantly, and were unable to recall what had been so solid moments before. Zeigarnik gave her name to the whole class of problems where incomplete tasks stick in memory.
The Zeigarnik Effect is also part of the reason why quiz shows are so compelling. You might not care about the year the British Broadcasting Corporation was founded or the percentage of the world’s countries that have at least one McDonald’s restaurant, but once someone has asked the question it becomes strangely irritating not to know the answer (1927 and 61%, by the way). The questions stick in the mind, unfinished until it is completed by the answer.
Game theory:
Tetris holds our attention by continually creating unfinished tasks. Each action in the game allows us to solve part of the puzzle, filling up a row or rows completely so that they disappear, but is also just as likely to create new, unfinished work. A chain of these partial-solutions and newly triggered unsolved tasks can easily stretch to hours, each moment full of the same kind of satisfaction as scratching an itch.
The other reason why Tetris works so well is that each unfinished task only appears at the same time as its potential solution – those blocks continuously fall from the sky, each one a problem and a potential solution. Tetris is a simple visual world, and solutions can immediately be tried out using the five control keys (move left, move right, rotate left, rotate right and drop – of course). Studies of Tetris players show that people prefer to rotate the blocks to see if they’ll fit, rather than think about if they’ll fit. Either method would work, of course, but Tetris creates a world where action is quicker than thought – and this is part of the key to why it is so absorbing. Unlike so much of life, Tetris makes an immediate connection between our insight into how we might solve a problem and the means to begin acting on it.
The Zeigarnik Effect describes a phenomenon, but it doesn’t really give any reason for why it happens. This is a common trick of psychologists, to pretend they solved a riddle of the human mind by giving it a name, when all they’ve done is invented an agreed upon name for the mystery rather than solved it. A plausible explanation for the existence of the Effect is that the mind is designed to reorganise around the pursuit of goals. If those goals are met, then the mind turns to something else.
Trivia takes advantage of this goal orientation by frustrating us until it is satisfied. Tetris goes one step further, and creates a continual chain of frustration and satisfaction of goals. Like a clever parasite, Tetris takes advantage of the mind’s basic pleasure in getting things done and uses it against us. We can go along with this, enjoying the short-term thrills in tidying up those blocks, even while a wiser, more reflective, part of us knows that the game is basically purposeless. But then all good games are, right?
If you would like to comment on this article or anything else you have seen on Future, head over to our Facebook page or message us on Twitter.
附录B 外文翻译
俄罗斯方块的心理效应
这一人们喜闻乐见的游戏成功的秘诀在于抓住了我们重复排列与使用的心理乐趣。
几何图形从屏幕上方缓缓降落,你要做的就是控制其降落方式并与其他图形排列消除。游戏的初衷很简单,但加上了令人上瘾的背景电子音乐后(据说来自俄罗斯民谣Korobeiniki)人们的娱乐生活发生了翻天覆地的变化。
自从1986年俄罗斯方块问世后,这一简单的游戏耗去了玩家数百万个小时。从那时起,从使命召唤到魔兽世界,游戏操纵平台的外观和性能都在茁壮发展。但像俄罗斯方块这样的方块益智类游戏始终占据了我们心中的一席之地。为何它们如此经久不衰呢?
作家杰弗里·戈德史密斯是沉迷于俄罗斯方块不能自拔,乃至于他写了一篇著名的文章,文中提到俄罗斯方块的发明者阿里克谢·帕吉诺特夫是否发明了一种“瘾药”——让人可以玩出瘾。一些人说自己连玩了几小时俄罗斯方块后连梦里都会出现降落的方块,还有看街上的大楼都在移动——这是一种名为“俄罗斯效应”的现象。这是游戏产生的心理推动作用,还有建议称那些患有创伤后精神紧张性障碍的人们需要预防游戏产生的幻觉重现。
当我十几岁的时候也有过一段俄罗斯方块沉迷期,我花了很多时间在方块的排列组合上。最近,我开始反思为什么俄罗斯方块这类游戏能够长青。说说我的结论吧,植根人们心中的心理驱使作用是整理这些方块的关键。
很多游戏的宗旨大体都是整理消除。落袋台球(snooker)就是典型的例子(对于非英国人来说叫做pool)。第一个人把球打乱后,其他人依照不同规则轮流将球射入落袋里。俄罗斯方块在这一基本框架中加入了电脑控制的成分——不光是玩家要整理方块,电脑还会不断从上方扔下额外的方块来制造凌乱。游戏看起来就是整一个漫无目的的过程,完全没有寓教于乐的成分在内,也没有深远的社交或是心理意义,但是我们却意外地为此着迷。
这当中存在着一种名为“蔡加尼克效应”的典型心理现象,命名自俄罗斯心理学家布鲁玛·蔡加尼克。19世纪30年代,蔡加尼克在一家人来人往的咖啡馆里发现服务员的记忆力都很惊人——但是只能保持到餐点送到为止。他们能记住一桌12人点的东西,不过一旦食物和饮料上桌后他们立马忘得一干二净,也回想不起之前稳固的记忆。蔡加尼克将这种把未完成的任务坚持保留在记忆中的现象以自己的名字命名。
蔡加尼克效应也是智力节目如此受欢迎的原因之一。你可能不关心英国广播公司是在几几年成立的或者全球至少有一家麦当劳的国家占了多少,但是一旦出了这样的问题,不知道答案居然就会浑身不舒服(顺便答案是1927年和61%)。问题在被解答前一直会缭绕在脑海中。
游戏原理
俄罗斯方块通过不断创建任务而牢牢抓住我们的神经。游戏中的每个环节都引领者我们解决谜团,排成或完成一列后图形会消失,但是新的也在不断出现,周而复始。部分解决与新形成的任务链用来打发时间很方便,反复的满足与焦虑感填满了每时每刻。
另一个俄罗斯方块风靡的原因在于问完成的任务与潜在的解决方法并存——徐徐降临的每一种方块都有各自的安插方式。俄罗斯方块是一个简单的可视世界,通过操纵五个按键(当然是向左、向右、左转、右转和降落)能够迅速地得出解决方案。对俄罗斯方块玩家的研究结果显示,人们普遍喜欢通过旋转方块来看它们是否匹配,而不是一边看着方块降落一边思考。当然这两种方法都可行,但在俄罗斯方块的世界里永远是动作领先——这是吸引人的关键。和生活中不太相同的是,俄罗斯方块将我们处理问题时的所见所想直接联系到了一起,我们能立即对问题采取行动。
蔡加尼克效应是对一种现象的形容,但它无法解释起因和作用。这是心理学家常用的把戏,看似他们通过命名而解开了人类的难解之谜,其实他们所做的仅仅是贪心地用自己的名字命名而根本没解决问题。对这一现实的合理解释是,大脑回路在达成目标的过程中会重组。如果这一目的达成,思路就会转移到其他事物上。
益智游戏利用心理达标原理不断挫败我们直至我们满意。俄罗斯方块则更进一步在失败与成功之间创建了持续的链条。正如聪明的寄生虫一般,俄罗斯方块善于利用人们完成与再使用的心理乐趣。我们一边玩着一边短暂地陶醉于排列方块的乐趣中,哪怕我们人格中理智与成熟的部分明白这基本上是个毫无意义的游戏。但是所有好玩的游戏不都是这样嘛,我说得对吗?
参考资料:
基于java的俄罗斯方块游戏系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
Java毕业设计174例,包含部署视频_易小侠的博客-CSDN博客各种java毕业设计自取,更有160+套java带讲解视频的毕业设计,和合集
文章出处登录后可见!