2.3工作任务一:需求分析
2.3.1任务描述
“连连看游戏”能给别人提供乐趣,也能给自己放松心情,又能乐在其中。通过项目的学习,既提高学员学习的兴趣,又在快乐中掌握程序设计的基础常识,并能编写需求分析报告,供软件设计人员的设计依据和用户的验收标准。
2.3.2任务目的
本任务的目的是对“连连看游戏”进行相应阐述,培养学生学习程序设计的兴趣,让学生感受到快乐学习,在快乐中掌握程序设计的相关常识。学会对“连连看游戏”进行需求分析,了解程序设计的方法和步骤,提高学生交流沟通协作的能力,培养学生解决问题、自我学习、信息处理、创能力。
2.3.3任务实现
通过开发人员与用户进行交流,填写用户需求调查表(如表1.1),综合分析,设计出的需求规格说明书。常见需求调查方式有:与用户交谈,向用户提问题;参观用户的工作流程,观察用户的操作;向用户群体发调查问卷;与同行、专家交谈,听取他们的意见;分析已经存在的同类软件产品,提取需求;从行业标准、规则中提取需求;从Internet上搜查相关资料。
| 需求标题1 | |
| 调查方式 | |
| 调查人 | |
| 调查对象 | |
| 时间、地点 | |
|
需求信息记录
|
表1.1 用户需求调查表
1、功能需求
本次设计是在传统的连连看上设计实现对战的连连看,玩家通过达到一定的积分来获得继续闯关的机会,还有机会开启神秘的应藏关,以此来增加游戏的可玩性。
游戏的基本规则:程序随机产生任意成对的图片,当定点击开始游戏时,电脑根据时间参数随机生成固定的成对图片,游戏再次开始,玩家可通过鼠标上的左键,自由的点两张图片。如果点击两次时,两张图片相同,且满足程序的算法则这两张图片可消去。消去图片后,游戏可给玩家加分,若在规定的时间内,玩家没有消掉所有的图片则游戏失败。由于是闯关模式,达到一定分数的玩家可以继续挑战新的游戏,游戏的难度会相应增加,并且还增加了新玩法。具体的游戏功能如下:
游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的背景取自网上中的图片,体现了游戏的挑战性。
鼠标处理事件需求:通过点击主窗体中相应的按钮,可以实现游戏的开始、暂停、结束,通过点击选项设置中相应的按钮,可设置声音的大小及方向键↓的功能。显示需求:当两次点击的图片相同且满足算法可以消去,当达到一定分数的时候,游戏会进入下一关,并有障碍了。
游戏闯关设计需求:随着游戏的难度不同,玩法会发生改变,需要在游戏中设置障碍,蒙手游戏。如果玩家能到达并完成最后一关,则玩家挑战成功,游戏结束。
本次设计连连看主要是在原连连看对战的基础上设计挑战模式,具体的功能如下所述:
(1) 游戏运行界面简单美观,操作简单,运行稳定;
(2) 能够根据不同的等级模式播放不同的游戏背景音乐,包括操作方向键、消行时的声音,音量由玩家操作控制;
(3) 设计不同的游戏难度,当玩家达到一定的积分,可以进入相关难度的等级;
玩家可直接操作界面上的相关按钮来控制游戏的开始、暂停、设置、退出等功能。
2、非功能需求
(1)用户界面需求
本软件要求能够通过鼠标点击进行各项操作,应具备系统主菜单。
(2)软硬件环境需求
本次的开发环境所采用的操作系统为Linux操作系统的Ubuntu10.10版本,编程环境是基于Qt 4.7的Qt creator版本,由于本游戏对硬件的要求不是很严格,所以硬件需求不做讨论。
软件环境:应安装有windows操作系统。
硬件环境:普通PC机。
(3)产品质量需求
正确性:保证程序运行的正确性,数据记录准确勿误同时能够按照用户需求正确执行任务。
健壮性:软件设计保证软件本身能够抵御非法数据干扰,尽力避免程序运行异常并能对程序异常进行有效处理避免程序崩溃。
性能,效率:系统架构设计、算法设计合理。
可扩展性:系统架构设计应充分考虑功能的扩展,采用低耦合的分层结构对系统各职责部分进行切分,保证在添加其它功能的情况下无需变更系统架构降低需求变更成本。
2.3.4知识准备
1游戏简介
游戏“连连看”顾名思义就是找出相关联的东西,这个连连看在网上基本是用在小游戏中,就是找出相同的两样东西,在一定的规则之内可以做为相关联处理。“连连看”的发展经历了从桌面游戏、在线游戏、社交游戏三个过程。
游戏“连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也吸引众多程序员开发出多种版本的“连连看”。这其中,顾方编写的“阿达连连看”以其精良的制作广受好评,这也成为顾方“阿达系列软件”的核心产品。并于2004年,取得了国家版权局的计算机软件著作权登记证书。
随着Flash应用的流行,网上出现了多种在线Flash版本“连连看”。如“水晶连连看”,“果蔬连连看”等,流行的“水晶连连看”以华丽界面吸引了一大批的女性玩家。
2008年,随着社交网络的普及和开放平台的兴起,“连连看”被引入了社交网络。“连连看”与个人空间相结合,被快速的传播,成为一款热门的社交游戏,其中以开发者Jonevey在Manyou开放平台上推出的“宠物连连看”最为流行。
根据自己以前所学的关于C语言、C++、Java、以及Qt的相关知识,并通过网上查找相关资料,了解到 C、C++、VB、Delphi、C#、Java等均可以现劳拉方块游戏的设计。下面简单介绍下VB、C++、Java、Qt各自的特点:
(1)VB的特点
全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。在中国乃至全世界都能看到它的身影,它曾是在中国最为流行的编程工具,到现在还占据着非常重要的地位,对于它的好坏大家都有一定的了解,VB作为一种较早出现的开发程序以其容易学习,开发效率较高,具有完善的帮助系统等优点曾影响了好几代编程人员,但是由于VB不具备跨平台这个特性,从而也决定了VB在未来的软件开发中将会逐渐地退出其历史舞台;它对组件技术的支持是基于COM和ActiveX,对于组件技术不断完善发展的今天,它也显出了它的落后性;同时VB在进行系统底层开发的时候也是相对复杂的,调用API函数需声明,调用不方便,不能进行DDK编程,不可能深入Ring0编程,不能嵌套汇编;而且面向对象的特性差;网络功能和数据库功能也没有非常突出的表现,综上所述,VB作为一种可视化的开发工具由于其本身的局限性,导致了它在未来软件开发中逐步被其他工具所代替。
(2)C++的特点
C/C++的哲学就不一样了,同一份程序代码,只要在该平台重新Compile成该平台的执行档,就能在该平台执行,若文字模式下的程序,的确可以跨平台,程序完全不需修改,但GUI盛行以后,由于各GUI的Library都不一样且没有标准,所以GUI程序并没办法跨平台Compile,因为各平台都有专属的Library。但是C/C++优势就是执行速度快,若能解决GUI Library的问题,则跨平台即可解决。
除了GUI Library需要统一外,还得看该Library设计的好不好才行,Linux GUI我没写过就不说了,若在Windows平台,Borland的C++Builder使用Delphi的VCL Library,Microsoft的Visual C++可以用MFC和.NET Framework,首先来看Borland的C++Builder,它使用标准的ANSI C++语言开发,利用VCL写出来的程序也算蛮漂亮的,执行速度很快,比较麻烦的是C++Builder当初为了缩短上市时间,并没有设计自己的Library,而是藉用Delphi的Library,导致C++ Builder在Compile时,是先用Delphi的Compiler将VCLcompile成object file后,再用C++ Builder将你写的C++程序compile成objectfile,最后再用Linker将所有的object file link起来,由于这都是IDE在做,对程序设计师似乎影响不大,但VCL由于是Delphi的Library,所以若想深入研究VCL的sourcecode时,则必须学Delphi的Pascal才行,否则看不懂VCL source code,这也是很多人对C++Builder却步的原因。
再来看Microsoft的VisualC++,MFC用的是完整的ANSI C++语言,所以语言部分不是问题,但若你看过用MFC写的程序,你一定会惊讶为什么这么复杂,程序代码非常冗长不好看,且MFC是有名的难学,若 Visual C++搭配.NETFramrwork,则无法使用ANSI C++,得用其.NET平台版本的C++/CLI,相信这点很多人就有意见了,不过.NETFramework由于设计的不错,所以写出来的程序相当精简漂亮,感觉和C++ Builder差不多,不过无论是C++ Builder或VisualC++开发的GUI,所开发出来的程序都无法跨平台,当然也无法跨平台Compile。
(3) Java的特点
Java具有安全性、可移植性、多线程机制以及跨平台的良好特性,但是由于本人对Java语言不是很熟悉,所以此方案也予以否决。
(4) Qt的特点
Qt拥有一个单一的Library,让你开发各种不同平台的程序,目前支持Windows、Linux、Mac、UNIX、EmbeddedLinux,讲白话点,就是它提供了一个Library让你开发GUI程序,写好之后,只要在各平台重新Compile后,就可以在各平台执行,而且使用完整的ANSI C++语言,且不限Compiler,只要是C++的Compiler都可以,重要的是,该Library相当漂亮,写出来的程序很像C++ Builder或.NET Framework的那样精简,不会向MFC那样复杂。目前Qt已经到第四个版本,GUI部分算支持的相当完整,且支持数据库、XML、Multi-Thread、Socket等方面的programming。若以后台角度来说,无论后端是什么数据库,只要透过相同的Interface,不同数据库的Class来实做这个Interface,前端GUI的程序写法完全不用改变,同理,面对不同的OS,理论上只要透过相同的Interface,不同OS的Class各自实做这个Interface,前端GUI的程序也完全不用改变,最后只要靠Compiler将程序compile成各平台的原生程序即可,这样即可保证其执行速度,不用再靠Virtual Machine。但很可惜这个理想,这么多年来都没人可以做出来,或许是我孤陋寡闻吧。Qt无疑是GUI终极解决方案,有强力的ANSI C/C++语言背书,又有单一的GUI Library,且精简漂亮,又能Compile成各平台的原生执行档,几乎是最完美的解决方案了。
(5) 方案的选择
经过以上比较好,考虑到Qt的众多良好特性,尤其是其跨平台性,加上自己最近正在学习Qt,为了能够更进一步掌握Qt编程,因此决定使用Qt开发连连看游戏。
3 Qt关键技术的介绍
(1)可移植性:Qt是一个跨平台GUI工具箱,不仅适用于Unix,它同样适用于MSWindows。如果开发平台是MS Windows,可能选择的GUI工具箱为MicrosoftFoundationClasses(MFC),这样就会失去众多的 Unix用户。相反,如果开发平台是 Unix,可能选择其它工具箱,如Motif等,同样会失去众多的Windows用户。如果选择的GUI工具箱为Qt,则只要在不同的平台上简单的编译源代码,就可以使原程序在不同的平台上运行,从而解决丢失用户的问题。
Qt把在处理不同窗口系统时的潜在问题隐藏了起来。为使Qt使用方便,Qt包含了一系列类,这些类使开发人员避免了在文件处理、时间处理等方面存在的依赖操作系统方面的细节。
(2) 国际化:所谓国际化,通俗的讲,就是指在某国开发的软件可以方便的被其它国家的人使用。Qt为本地化应用提供完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言。另外,Qt完全支持双字节16 bit国际字符标准。利用Qt开发跨平台的国际化软件是一个方便、增量的过程。在开发过程中,利用Qt的linguist界面工具就能方便的将开发的软件翻译成各国语言,从而实现软件的国际化。
(3) 面向对象:Qt是一个C++工具箱,它由几百个C++类构成。在程序设计中可以使用这些类,如果Qt没有提供真正适合需求的组件,则可以方便的修改现有的组件或者重新编写组件。Qt具有模块设计和注重软件构件或元素的可重用性的特点。一个组件不需要知道它的内容,而通过Qt特有的signal和slot机制与外界通信、交流。
使用Qt进行应用程序的开发,可以充分利用其面向对象和模块化的特征,从繁琐的编程中解脱出来,专注于应用程序本身的实现。
(4) 可用户化的外观:Qt支持主题,所以基于Qt的应用软件能在Motif外观、Windows外观,以及另一些用户化的外观之间互换,甚至改变运行时间。这些应用程序不管是在X Windows下还是在Microsoft Windows下都可以独立操作、运行。
(5) 独有的Signal Slot机制:Signal Slot机制是Qt最重要的特征。在MS Windows中,程序通过消息机制和事件循环来实现图形对象行为的触发和处理;在Qt中,程序在一个类中定义多个Signal和Slot,Signal就相当于“事件”,而Slot就相当于响应事件的“方法”。为了实现“事件驱动”,需要将一个类的Signal和另一个类的Slot连接起来(使用connect)。采用这种机制是一种安全可靠的方法,它允许回调。并支持对象之间在彼此不知道对方信息的情况下进行合作,这使Qt非常适合于真正的构件编程。
(6) 开发程序的方便性:Qt提供了一个可视化的开发工具Qt Designer,使用该工具就像在Windows中使用Visual C++那样可以直接向项目中添加各种组件,而不需要一步一步地编写代码,这个特点是其它非可视化编程工具望尘莫及的。Qt Designer中包含全面的联机帮助文档,包括超文本方式的Qt Manual,man帮助手册页和补充指南。这些帮助不论是对于初学者还是专业人士,都是非常方便的。
(7) 强大的功能:Qt的强大功能主要体现在以下几方面:拥有一套完整的组件,用户可以直接基于这些现成的组件开发出优秀的界面;拥有丰富的API函数,大概有250多个C++类;具有优越的绘画功能和2D/3D图形润色功能,Qt的绘画工具类Qpainter, 可以在任意一个绘画设备上润色图形,对于更高级的2D/3D图形可以结合使用OpenGL和Qt的组件,使用OpenGL就像用任意一个Qt组件一样方便,而且效果比纯粹使用OpenGL作2D/3D图形更好;支持XML。
(8)Qt类库大致可以分为三个部分:控件,框架和工具。
1)控件:控件部分包括环境控件,主窗口控件,标准对话框, 基本的GUI控件,扩展GUI控件,GUI组织控件,以及帮助系统控件。
环境控件为应用程序提供全局服务的类,包括系统设定、国际化等。例如Qtranslator, Qapplication。主窗口类为应用程序提供界面框架,可以在上面添加菜单、工具条等,为应用程序提供集装箱的功能,如QMainWindow。标准对话框类是为打开/关闭文件,选择颜色等预先设计的标准对话框,如QColorDialog, QFileDialog。基本控件包括所有的GUI控件,如按钮、组合框等,如QPushButton。扩展的控件包括树状视图、进度条等, 如QListView。GUI组织类负责对各种控件进行组织以构成复杂的对话框, 如QGroupBox。帮助系统控件是为应用程序提供在线帮助的类,QStatusBar,QtoolTip。
2)框架:框架部分包括的是一些抽象的类,通常不可见,如对象模型、抽象控件、绘图、拖放、控件外观。对象模型是框架的基础,如QObject。可见的控件一般从抽象控件派生,如QButton。绘图类控制绘图, 如QBrush。拖放类控制拖放操作,如QDragObject。控件外观类控制控件的外观如颜色、字体等。例如QColor。
3)工具:工具部分包括时间日期和链表树等数据结构,它们和GUI无关。普通工具包括链表、堆栈、队列、树等常见数据结构,如QArray。图形处理工具控制图像的编码/解码算法。如QImageIO。I/O控制工具处理I/O的一些类,如QFile。时间和日期工具类处理时间和日期,如Qdate, Qtime。另外还有其他杂类如Qsignal, QIconSet等。
(9) Qt对象通讯机制
对象间通讯是面向对象程序设计的一个极其重要的内容,类似于MicrosoftMFC的消息映射和事件循环,Qt的对象间通讯采用的是信号—槽(signal—slot)机制,信号就好像是事件,而槽则是响应事件的方法。如果需要实现对象间的通讯,只需要把一个对象的信号和另外一个对象的槽使用连接(connect)起来。
信号—槽机制说明:
Qt下对象间的通讯用信号—槽机制来实现。信号—槽机制是Qt的一个中心特征并且也是它与其它图形工具包的最不相同的部分。图2-1直观地表示了这种机制是如何工作的。

图2-1 信号与槽的连接原理图
在图形用户界面编程中,经常希望一个窗口部件的一个变化被通知给另一个窗口部件。更一般地,希望任何一类对象可以和其它对象进行通讯。例如,如果正在解析一个XML文件,当遇到一个新的标签时,也许要通知列表视图正在用来表达XML文件的结构。较老的工具包是使用一种被称作回调的通讯方式来实现同一目的。回调是指一个函数的指针,所以如果希望一个处理函数通知一些事件,可以把另一个函数(回调)的指针传递给处理函数,处理函数在适当的时候调用回调函数。回调有两个主要缺点:首先他们不是类型安全的,从来都不能确定处理函数使用了正确的参数来调用回调;其次回调和处理函数是非常强有力地联系在一起的,因为处理函数必须知道要调用哪个回调。
在Qt中有一种可以替代回调的技术:使用信号和槽。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是总是可以通过继承来加入自己定义的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件有很多预定义的槽,通常也可以加入自己的槽,这样就可以处理感兴趣的信号了。
信号—槽机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配。实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。因为签名是一致的,编译器就可以帮助检测类型是否匹配。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道哪个槽要接收这个信号。Qt的信号和槽的机制可以保证如果把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的,不会再有回调核心转储。
从QObject类或者它的一个子类(比如QWidget类)继承的所有类都可以包含信号槽。当对象的状态发生改变的时候,信号被发送给其它对象,从而实现了该对象与其它对象的通信。对象在发射信号时,无须知道有没有槽接收它所发射的信号,而槽是正常的成员函数,一个槽不知道它是否被任何信号连接,这就是信息封装,这种封装确保了对象可以用作一个软件组件。此外,使用对象时也无须知道这种通讯机制的实现细节。在信号—槽机制实现的过程中,可以把许多信号和单一槽相连,也可以把一个信号和许多槽相连。把一个信号和另一个信号直接相连也是可以的。(这时,只要第一个信号被发射时,第二个信号立刻就被发射)。总体来看,信号和槽构成了一个强有力的组件编程机制。

