基于Java的俄罗斯方块游戏的设计与实现

关于俄罗斯方块项目源码.zip资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/JW_559/89300281

基于Java的俄罗斯方块游戏的设计与实现

摘  要

    俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛,人所共知。俄罗斯方块游戏简单的基本规则是有小方块组成的7种不同的规则图形陆续从屏幕上落下,玩家操作移动使其下落拼出一条完整的横条,随即会消失,玩家得分,游戏等级提高,当没有被消除的图形堆积到屏幕顶端时,游戏结束。

    俄罗斯方块游戏最初是由俄罗斯人阿列克谢·帕基特诺夫在1984年开发的休闲小游戏,曾几何时它创造了无可匹敌的商业价值,影响了一代休闲小游戏的开发与产业链。随着信息时代科技时代的不断发展和变化,计算机已经普及到每一个人的生活中,在繁忙的工作生活中,这一类休闲小游戏给人们带来了些许的放松。

    这篇论文详细的描述分析了经典传统的俄罗斯方块实现的基本思路和一些基本游戏规则,在此基础之上,更进一步地开发出俄罗斯方块的创新创意模式,在经典游戏基础上开发出随着分数增高而等级增高难度加大的模式,并且创意性的开发出可操控方块颜色变换的模块,并且增添了游戏声音和音乐模块。本论文对上述功能给出了具体实现流程、详细描述、和一些源代码。

    本论文阐述了俄罗斯方块游戏的开发和发展历史、开发此游戏的意义以及开发环境并根据软件工程开发软件和java编写程序的相关知识,对程序的需求分析、概要设计、详细设计与实现、调试运行进行了一系列描述。

    此次程序设计是在Microsoft Windows 7系统下,以Java为开发语言,在Eclipse开发平台上进行游戏的设计与实现。

关键词:游戏设计;俄罗斯方块;软件工程;Java;Eclipse。

Based on the design and implementation of Java game Tetris

Abstract

Tetris is a popular all over the world, from the beginning to now has been enduring the computer, mobile phone, handheld game machine products, is a game with simple rules, but not the lack of fun, simple classic game, easy to use, wide application scope, basic rules of simple Tetris game evident to anyone. There is 7 different to the regular pattern of the composition of the small box on the screen in succession from the fall, the operation of the mobile game player to spell out the whereabouts of a complete bar, then disappear, game player score, game level, when the accumulation is not eliminated graphics to the top of the screen, the game is over.
      Tetris game is the first by the Russians in 1984 Alexei Pazhitnov developed a casual game, only a short while ago it creates unmatched business value, affect the development of a generation of casual games and industrial chain. With the information age era of science and technology continuous development and change, the computer has spread to every person's life, in the busy working life, this kind of casual games brought some people to relax.
       This paper gives a detailed description of the basic ideas of the traditional analysis of classic Tetris and some basic rules of the game, on this basis, further develop the creative mode in Tetris, the classic game developed with the scores increased and the higher rank of difficulty of the model, and develop creative control box color transform the module of the game, and add music and sound module. In this thesis the function given the specific implementation process, described in detail, and some of the source code.
       This paper describes the development history and development of Tetris game, developed this game meaning as well as the development environment and according to the related knowledge of software engineering and software development of Java programming, analysis, outline design of program requirements, detailed design and implementation, debugging and running a series of description.


      The program is designed in Microsoft Windows 7 system, with Java as the development language, Eclipse development platform for the design and implementation of the game

Key Words: Game design; Tetris, Software engineering, Java;Eclipse。

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 软件平台:

本系统的开发环境如下q

操作系统: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类用来实现按键监听,控制方块的上下左右。定义一个4x4方阵,共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.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>方块翻转判定

在两种情况可能发生越界,一种是方块落下去固定住以后,第二种是周围的空间不允许它进行翻转。

第一种情况只需要参考方块落下去后不能够再移动的判定即可。

对于第二种情况,在每次方块翻转前,必须首先计算出方块周围的空间,如果空间允许则翻转。否则,不能翻转。

因为七种方块是不规则的,每种方块要求的翻转空间都是不一样的,甚至是在它的不同翻转状态下,所要求的翻转空间也是不一样的,首先想到的自然就是为每一种方块,方块的每一种状态都写一个判定条件,但是这样做未免过于麻烦。

根据观察,不难发现,七种形态的方块,长条形的方块如果以横条的形态下落,则只要能够下落,就能翻转,如果以竖条的形态下落,那么它翻转后所处的位置必须要有4x1个格子的空间才能够翻转。对于田字形的方块,只有能够继续下坠,就一定能够翻转,所以田字型的方块只要没有落下,就一直能够翻转。而其它五种形态的方块,又有一个共同点,就是它们都有两种翻转状态横向占三个格子的空间,竖直方向占两个空间,另外两种翻转状态横向占两个格子的空间,竖直方向占三个格子空间,如果他们是以横向占三个格子的状态下落,那么只要能下落,就一定能够翻转,如果是以横向两个格子的状态下落,那么在翻转后,周围必须要有3x2个格子的空间。

所以,方块翻转的判定,要分三种情况,第一种情况是方块落下去后不能翻转;第二种情况是对竖直状态出现的长条形的方块进行翻转判定;第三种情况是对除长条形和田字形之外的其它五种以横向占两个格子的状态出现的方块进行翻转判定。

何种情况下方块能够翻转的问题解决了,接下来,我们就应该解决方块翻转后所处的位置的问题了,因为只有事先知道方块翻转后所处的位置,才能够对那个位置的空间范围进行判定,判定它是否能够容纳方块。

可以确定的是,无论方块怎么翻转,都处在方块数组中,也就是说方块必定是在游戏地图中某一4x4个格子的空间范围内。

方块数组在游戏主界面中的坐标是确定的,不确定的是方块翻转后到底处在方块数组的哪个位置,为了解决这个问题,我们可以限定方块在方块数组中的存储原则是靠左、靠上,这样,无论翻转怎么翻转,方块数组中第一行和第一列都是有方块的,这样也就确定了方块在方块数组中的位置,也就可以得知方块翻转后在游戏地图中的位置了。

假定方块数组的横纵坐标是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这门课程有了更深一步的了解,也对我今后的就业之路打下了一定的基础。

毕业设计是我们作为学生学习阶段的最后一步,是基础知识和专业知识的综合应用,是一个全面的重新学习,然后改进过程,学生学习能力的过程和独立思考和工作能力也是一个培训,而毕业设计水平也反映了大学教育的综合水平,所以学校非常重视毕业设计这一环节,加强毕业设计工作和动员教育的指导。在大学学习过程中,毕业设计是我们社会参与实际工作的重要组成部分,也是为了我们学习和解决生活问题的能力,是学校生活和社会生活的转型。毕业设计完成后,我尝试研究设计和实践工作的有机结合。这更有利于我们增强自己的能力。

经过一段时间的努力,在一些同学和老师的帮助下,我终于完成毕业项目,这是一项重要任务。回想一下我们设计的过程,可以说是困难和容易共存的。其中,把大学学习的知识被纳入内部,其实对我来说,也是一个不小的挑战,而且也是一次大学的知识的考试。 

在毕业设计的过程中遇到了很多困难,而且很多都是没有遇到过的问题,如果不是亲自做,可能很难在某种程度上找到自己所缺乏的知识,对我们来说,找到问题,到解决问题,这是最实际的。面对自身难以解决的问题,在获取一些信息的同时,在老师和学生的帮助下,这些问题可以解决,所以毕业设计顺利完成。据了解,该项目的知识依然非常深奥,所以我们不仅现在,在未来更是要继续探索。

理论与实践的结合不仅包括课堂参与的知识,还包括技能培训的结合,以及指导学生如何去理解并接触与社会相关的东西。学生毕业设计,在专业理论知识的指导下,可以通过多种方式解决一些实际问题。在设计过程中,学生可以运用理论知识进行实践,不仅要加深对专业理论知识的理解,而且要丰富和发展本书的理论知识,使之变成更高层次的经验、技能。由于现有的教学模式,理论知识和技能与生产实践有着严重的分离,学生无法学习课堂以外的知识,实际生产问题常常与学习无关,无法有效得到应用。通过合理选择课题,引导学生有意识地运用知识和技能体系进行分析思考,为有机地整合理论知识和实践做出贡献。

社会不断变化,目前社会正在转型发展,人才的要求也越来越高,利用眼光看待问题,学习创新,学习适应社会发展要求。在校外,进入社会,抓住今天的机遇,创造未来。老师的影响力和教授的知识,让我了解很多道理,以一定的创新精神去面对将来的挑战。 

    总之,对于这一次毕业设计,我感觉个人不但比以前更加熟悉了一些专业方面的知识,还锻炼了自己的动手能力,觉得收获颇丰。同时也会有一种小小的成就感,因为自己在这项任务进行的过程中努力过了。而在以后的实际工作中,我们也应该同样努力,不求最好、只求更好! 还有就是,想在此对于我的指导老师和同学们表示忠心的感谢,感谢他们在这毕业设计过程中给我的帮助!

程序无论是从技术还是功能上都基本地满足了用户的需求。但由于初次设计,功能不够完善,细节方面的设计还有不足。

这次的毕业设计,我受益匪浅,让我的思维方式更加缜密,能多个角度的看待、处理问题;知道遇到问题该如何去分析问题、解决问题。相信这些都会让我在以后的工作中受益无穷的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在React中利用Postman测试代码获取数据

文章目录 概要名词解释1、Postman2、axios 使用Postman测试API在React中获取并展示数据小结 概要 在Web开发中&#xff0c;通过API获取数据是一项常见任务。Postman是一个功能强大的工具&#xff0c;可以帮助开发者测试API&#xff0c;并查看API的响应数据。在本篇博客中&…

【C语言】—— 动态内存管理

【C语言】——动态内存管理 一、动态内存管理概述1.1、动态内存的概念1.2、动态内存的必要性 二、 m a l l o c malloc malloc 函数2.1、函数介绍2.2、应用举例 三、 c a l l o c calloc calloc 函数四、 f r e e free free 函数4.1、函数介绍4.2、应用举例 五、 r e a l l o …

无列名注入

在进行sql注入时&#xff0c;一般都是使用 information_schema 库来获取表名与列名&#xff0c;因此有一种场景是传入参数时会将 information_schema 过滤 在这种情况下&#xff0c;由于 information_schema 无法使用&#xff0c;我们无法获取表名与列名。 表名获取方式 Inn…

FullCalendar日历组件集成实战(3)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

SwiftUI中的常用图形(Shapes)

概述 在SwiftUI中&#xff0c;常用的图形&#xff08;Shape&#xff09;主要有&#xff1a; Circle&#xff1a;圆形 Ellipse&#xff1a;椭圆形 Capsule&#xff1a;胶囊形 Rectangle&#xff1a;矩形 RoundedRectangle&#xff1a;圆角矩形 上面的这些图形都继承了Shape协议…

Hive读写文件机制

Hive读写文件机制 1.SerDe是什么&#xff1f; SerDe是Hive中的一个概念&#xff0c;代表着“序列化/反序列化” &#xff08;Serializer/Deserializer&#xff09;。 SerDe在Hive中是用来处理数据如何在Hive与底层存储系统&#xff08;例如HDFS&#xff09;之间进行转换的机制…

2024国考行测、申论资料大全,做好备考真的很重要!

1. 国考是什么? 国考,全称国家公务员考试,是选拔国家公务员的重要途径。通过国考,你将有机会进入政府部门,为国家建设贡献力量。 2. 国考难在哪里? 国考之所以难,主要体现在以下几个方面: (1) 竞争激烈 每年国考报名人数都在百万以上,而录取率却不足2%。千军万马过独木桥…

node和npm版本太高导致项目无法正常安装依赖以及正常运行的解决办法:如何使用nvm对node和npm版本进行切换和管理

1&#xff0c;点击下载 nvm 并且安装 进入nvm的github&#xff1a; GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. 这里下载发行版&#xff0c;Releases coreybutler/nvm-windows GitHub 找到 这个 nv…

洗地机哪款好用?希亦、追觅、顺造、米家等高品质洗地机推荐

家用洗地机已经成为家庭清洁的重要利器&#xff0c;其多功能性能帮助您轻松应对各种清洁任务&#xff0c;从而保持家居环境的清洁整洁。然而&#xff0c;市场上品牌繁多、功能各异的洗地机让人眼花缭乱。为了帮助大家做出明智的选择&#xff0c;我们将在本文中提供全面的选购指…

选择法(数值排序)(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明排序函数sort; void sort(int a[], int n);int main() {//初始化变量值&#xff1b;int i, a[10];//填充数组&#xff1b;printf("请输入10个整数\n&…

蓝桥杯备战22.k倍区间——前缀和

目录 题目 分析 暴力求解 优化思路 AC代码 题目链接&#xff1a; P8649 [蓝桥杯 2017 省 B] k 倍区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目 分析 很明显这题是一道前缀和的题 暴力求解 只得了28分 #include<iostream> using namespace std; co…

求学生平均成绩(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明平均数函数average; float average(float score[10]);int main() {//初始化变量值&#xff1b;float score[10], aver;int i 0;//填充数组&#xff1b;pr…

探秘WebSQL:轻松构建前端数据库

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘WebSQL&#xff1a;轻松构建前端数据库 前言WebSQL简介WebSQL的基本操作WebSQL的实际应用WebSQL的局限性和替代方案 前言 在Web的世界里&#xff0c;我们总是追求更好的用户体验和更快的响应速度…

添砖Java之路(其八)——继承,final关键字

目录 继承&#xff1a; super关键字&#xff1a; 方法重写&#xff1a; 继承特点&#xff1a; 继承构造方法&#xff1a; final关键字&#xff1a; 继承&#xff1a; 意义&#xff1a;让类于类之间产生父类于子类的关系&#xff0c;子类可以直接使用父类中的非私有成员(包…

Seal^_^【送书活动第4期】——《Web渗透测试技术》

Seal^_^【送书活动第4期】——《Web渗透测试技术》 一、参与方式二、本期推荐图书2.1 前 言2.2 关于本书2.3 本书读者2.4 图书简介2.5 作者荐语2.6 编辑推荐2.7 目 录 三、正版购买 掌握Web渗透测试技术&#xff0c;提高Web应用安全性。 一、参与方式 1、关注博主的账号。 2、点…

Linux下Code_Aster源码编译安装及使用

目录 软件介绍 基本依赖 其它依赖 一、源码下载 二、解压缩 三、编译安装 四、算例运行 软件介绍 Code_aster为法国电力集团&#xff08;EDF&#xff09;自1989年起开始研发的通用结构和热力耦合有限元仿真软件。Code_aster可用于力学、热学和声学等物理现象的仿真分析&…

CVPR2022人脸识别Partial FC论文及代码学习笔记

论文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/An_Killing_Two_Birds_With_One_Stone_Efficient_and_Robust_Training_CVPR_2022_paper.pdf 代码链接&#xff1a;insightface/recognition/arcface_torch at master deepinsight/insightface G…

基于lidar的多目标跟踪

文章目录 基本流程编译过程注意事项基本流程 基于雷达点云的目标追踪主要包括以下几个步骤: 点云预处理: 滤除噪点和无效点(如NaN值)进行平面分割,提取地面点云对剩余的点云进行聚类,得到可能的目标点云目标检测 对聚类后的点云进行分析,判断是否为有效目标可以利用目标的尺寸…

怎么转换音频?看这3款音频转换器

随着数字媒体的发展&#xff0c;音频文件在我们的日常生活中占据了越来越重要的地位。有时候在不同的应用场景里&#xff0c;无论是音乐、语音还是其他类型的音频内容&#xff0c;我们都需要对其进行转换以满足不同的需求。 本文将为您介绍3款常用的音频转换器&#xff0c;帮助…

Springboot+mybatis-plus+dynamic-datasource+继承DynamicRoutingDataSource切换数据源

Springbootmybatis-plusdynamic-datasource继承DynamicRoutingDataSource切换数据源 背景 最近公司要求支持saas&#xff0c;实现动态切换库的操作&#xff0c;默认会加载主租户的数据源&#xff0c;其他租户数据源在使用过程中自动创建加入。 解决问题 1.通过请求中设置租…