2023年全国硕士研究生考试考研英语一试题真题(含答案详解+作文范文)_第1页
已阅读1页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、<p><b>  本科生毕业设计</b></p><p>  姓 名: 学 号: </p><p>  学 院: 计算机科学与技术学院 </p><p>  专 业: 计算机科学与技术  

2、 </p><p>  设计题目: 俄罗斯方块分组对抗游戏的实现 </p><p>  专 题: </p><p>  指导教师: 职 称: </p><p>  2013 年 5

3、 月 </p><p>  XXXX大学毕业设计任务书</p><p>  学院 计算机科学与技术学院 专业年级 学生姓名 </p><p>  任务下达日期:2013年 1 月 4 日</p><p>  毕业设计日期: 2013年 1月 4日至 2013年6月2日</p>

4、<p>  毕业设计题目:俄罗斯方块分组对抗游戏的实现</p><p><b>  毕业设计专题题目:</b></p><p>  毕业设计主要内容和要求:</p><p>  用户可参与的俄罗斯方块游戏;具体包括随机给出不同的形状下落填充给定的区域,若填满一条便消掉,计分。若在游戏中各形状填满了给定区域,则游戏结束。</p&g

5、t;<p>  在此基础上实现多人网络对战,并且可以进行分组对战,</p><p>  可以分3个组。要求根据消层情况获得道具,并能够使用道具进行攻击。</p><p>  院长签字: 指导教师签字:</p><p>  XXXX毕业设计评阅教师评阅书</p><p>  评阅教师评语(①选题

6、的意义;②基础理论及基本技能的掌握;③综合运用所学知识解决实际问题的能力;③工作量的大小;④取得的主要成果及创新点;⑤写作的规范程度;⑥总体评价及建议成绩;⑦存在问题;⑧是否同意答辩等):</p><p>  成 绩: 评阅教师签字:</p><p>  年 月 日</p><p>  中国矿业大学毕

7、业设计答辩及综合成绩</p><p><b>  摘 要</b></p><p>  俄罗斯方块(Tetris, 俄文:Тетрис)是一款从1988年起至今都风靡全球的电视游戏机和掌上游戏机游戏,是落下型益智游戏的始祖。它是由俄罗斯人阿列克谢·帕基特诺夫发明的一款能锻炼人的反应能力、动手能力等能力的教育软件,故得此名。俄罗斯方块的基本游戏规则是移动、旋转

8、和摆放游戏自动随机输出的各种方块,当某一行或几行(最多四行)完全充满时,即消失。由于具有数学性、动态性,知名度,而且上手简单、老少皆宜,从而家喻户晓,风靡全世界。目前,人们在基于俄罗斯方块在基于原有的设计原理上,发展出了许多新的不同类型的游戏,大大增加了这种游戏的趣味性,界面观赏性,可玩性。游戏分为单机版、对战版、分组对战等多种游戏方式。</p><p>  本软件在了解俄罗斯方块设计原理的基础之上,借助C/S软

9、件模型,用CSocket套接字技术实现了一个网络版的能进行分组对抗的俄罗斯方块游戏。该游戏软件不仅实现了基本的俄罗斯方块功能,并能支持俄罗斯方块服务器的建立、客户端接入等功能,在此基础之上,添加了个性音效、分组对抗功能和道具使用等机制,从而改进了传统的简单俄罗斯方块游戏,大大提高了游戏的趣味性、可玩性,使游戏画面也更加具有观赏性,人机交互性更强。本次开发所使用的开发工具为VC++ 6.0,使用的编程语言是C++。本文主要阐述了本俄罗斯方

10、块软件的开发方法以及实现的功能。</p><p>  关键词:俄罗斯方块;CSocket技术;局域网;VC++ </p><p><b>  ABSTRACT</b></p><p>  The Tetris (Tetris, the Russian: Тетрис) is a swept the world from 1988 to the

11、 present TV game consoles and handheld game consoles game,is the ancestor of falling puzzle game. It is exercise by the Russians Alexei Pajitnov invention a reaction ability, practical ability and ability of educational

12、software, it was this name. The basic rules of the game of Tetris is moved, rotated and placed the game automatically output random box disappears when a line or lines (up to four lines) completely fill</p><p&

13、gt;  The software based on the understanding of the design principles of Tetris, with the C / S software model, a network version can be grouped against the Tetris game Socket technique. The game software not only to ach

14、ieve the basic Tetris, and can support the establishment of the Tetris server, client access, on this basis, add a personalized sound, scrimmaging features and the use of props and other mechanisms in order to improve si

15、mple Tetris game, greatly increasing the game interesting, easy t</p><p>  Keywords:Tetris ; CSocket; LAN; VC++</p><p><b>  1绪论</b></p><p>  1.1俄罗斯方块的背景</p><p

16、>  随着电子信息技术的高速发展,电子类的游戏逐渐成为人们日常娱乐生活中不可缺失的一部分。俄罗斯方块游戏是其中一种风靡全球的电脑类游戏机和掌上型游戏机的游戏,它老少皆宜,而且是可以锻炼人的反应能力、动手能力、全局统筹能力,并具有数学性、灵活性和良好的可玩性的一款教育软件。随着科技水平的发展,游戏开发技术的提升,由俄罗斯方块衍生出来的各种经典游戏比比皆是。</p><p>  1.2课题研究和发展状况<

17、/p><p>  俄罗斯方块最早是在1985年6月由工作于莫斯科科学计算机中心的阿列克谢·帕基特诺夫在玩过一个拼图游戏之后受到启发而制作的一个以Electronica 60为平台的游戏,后来,随着此游戏的热销,其版权问题也一直纠缠不清,官司不断。也导致几家公司倒闭,一些公司获益,并以此赚了很多钱,其中,最受关注的是1989年的Tengen和任天堂的官司,最终Tengen的权利被否决,而任天堂的请求或许。因此

18、,Tengen版的俄罗斯方块不得不停止销售,撤下货架。而任天堂NES版Tetris同年在美国发售。全美销量大约300万。与此同时,和GB版Tetris捆绑销售的Game Boy席卷美国,美利坚大地上刮起一阵方块旋风。 </p><p>  俄罗斯方块游戏通过在container的顶端产生随机的一个形状的方块,玩家通过选择左移、右移、旋转、下落等集中操作来使其尽可能整齐的叠在一起,当某一行全部充满时,即消失。由这个

19、游戏过程可以看到,这款游戏不仅能锻炼人的反应能力、动手能力,更能锻炼我们统筹安排、随机应变的能力,而决不是像很多孩子的家长所有的,能使孩子沉迷其中,降低智力、耽误身心发展。</p><p>  1.3本软件与传统的俄罗斯方块的异同</p><p>  俄罗斯方块本身具有一个区别于其他很多游戏的特点,就是只能在电子平台上运行,而不能用实物来进行游戏,传统的俄罗斯方块游戏也有很多版本,他支持在

20、手机等工具上的单机模式,也支持在小游戏机上和电脑上的单机双人对战模式,本游戏相比传统的俄罗斯方块有很多相同之处,但也做了很多改进:</p><p>  相同点:本游戏包含了单机俄罗斯方块的主题框架,采用2维数组来表示每个方块,均由七种方块组成,分别是L型,反L型,Z型,反Z型,田字型,1型,T型。基本算法是相同的,即随机产生一个方块,根据玩家按键来响应键盘事件和鼠标事件,分别进行右移、左移、旋转和下落等操作。对每

21、一行是否充满的判断和消去也跟单机版是相似的思路。游戏逻辑相同,游戏从第一个方块下落开始到游戏结束,整个流程是相同的。</p><p>  不同点:本游戏在原来的简单模式的基础上做了很多改进:</p><p>  1.在双人对战的基础上进行了扩充,采用C/S模式,最多可容纳六个人一起游戏,并且可随意选择自己的分组,共有A B C和自由人四组供选择,进入房间后可以选择准备游戏,当有超过两个队伍

22、且所有人都准备好时,游戏开始。</p><p>  2.游戏在原来单纯拼方块的基础上,增加了很多道具,玩家在消去多行的时候可随机获得道具,主要有消去几行、增加几行、全部消去、加速下落、减速下落等功能,玩家可根据需求对自己、队友或者对手使用该道具。</p><p>  3.游戏在交互方式上比之前有很大改进,之前的单机游戏或者双人对战模式没有办法进行交流,现在的游戏中添加了聊天界面,可以进行沟

23、通,并且在使用相应道具或者准备开始游戏的时候都有音乐,能让参与游戏的玩家更放松心情,体会游戏的乐趣。</p><p>  2 俄罗斯方块游戏的分析与设计</p><p>  2.1 俄罗斯方块的设计原理和技术需求</p><p>  本软件是基于单机版俄罗斯方块的程序设计原理上的扩展,在原来的基础上加入了网络互连,在原来的单机模式和双人对战模式上增加了网络对战模式。

24、即与原始的俄罗斯方块的程序设计原理基本上是相同的,而方块的模型建立,游戏的操作流程和游戏的过程中软件进行各种判断的原理是相同的,但是与原始的俄罗斯方块相比,本软件在原有的基础上又加入了一些新的理念和新的设计技术。比如说:新增加了网络多人分组对战、网络聊天功能、新的道具模块等设计。</p><p>  本软件与传统的单机版或双人版俄罗斯方块游戏具有一定的区别,传统的俄罗斯方块的设计模型如下图2-1所示,本软件的设计

25、模型如图2-2所示。</p><p>  图2-1 单机版俄罗斯方块游戏模型图</p><p>  图2-2 本系统游戏模型</p><p>  从上两图中可以得出传统的俄罗斯方块模型与本软件的游戏模型具有很大的不同,本软件支持多人在线同时操作,更加丰富。传统的俄罗斯方块注重的是人机交换,而本软件更注意的是人与人之间通过这个网络平台进行的交互。</p>

26、<p>  本软件为C/S模型。参与游戏的人的机器都作为客户端客户端,而服务器既可以是上述参与游戏的人的机器,也可以是单独的一台机器。首先由服务器端建立服务器,接下来准备参与游戏的人可以打开客户端通过连接服务器的IP地址进去服务器,再服务器将所接受的用户信息在返回给用户。</p><p>  游戏运行的原理如图2-3所示。</p><p>  图2-3 本游戏系统原理图<

27、/p><p>  本软件主要有以下几个功能:</p><p>  1.建立服务器。在安装了服务器端的电脑上打开服务器端输入IP地址并建立服务器。</p><p>  2.玩家打开安装的客户端,并输入自己的用户名,通过特有的IP地址连接到服务器端所创建的服务器的房间。 </p><p>  3.连接到本服务器的所有玩家进行分组并都准备游戏,当该房间

28、有至少两个组的玩家准备好了就可以进行对战了。</p><p>  4.游戏结束后,本软件会对本局游戏各组玩家的积分和道具的使用状况进行统计。</p><p><b>  2.2可行性研究</b></p><p>  2.2.1设计目的 </p><p>  2.2.2可行性分析</p><p>

29、  管理可行性:本游戏的开发职位检测自己大学四年所学到的知识,是在基于传统的俄罗斯方块设计原理上新添加了网络对战模块。便于管理。</p><p>  经济可行性:做这个游戏的背景是毕业设计,并不注重开发出来后的经济效益和以后的发展方向,重在检测自身的知识水平,软件开发过程中的经济需求也不高,只需要本人和一台电脑,不需要考虑经济问题。</p><p>  技术可行性:本游戏为C/S模型,用C

30、++语言编写,开发工具是VC6.0。</p><p>  社会可行性:本游戏只为检测和巩固自己所学知识,开发出来的成品只供自己娱乐和使用,不用考虑对社会的影响,也不用考虑版权和法律的问题。</p><p>  2.3软件的开发技术和开发工具的简介</p><p>  游戏主要基于的技术原理是socket编程。套接字(socket)是一种网络编程接口,它是对通信端点的

31、一种抽象,提供了一个发送和接收数据的机制。套接字技术最先应用于unix系统,后来移植到windows系统,有了Winsock API。经过对Winsock API的低层封装产生了CAsyncSocket类,经过高层次的封装产生了CSocket类。 CSocket进行通信的过程很简单。服务器首先启动,通过调用socket函数建立一个套接口,然后调用bind函数将该套接口和本地网络地址联系在一起,再调用listen函数使套接口做好侦听的准备

32、,并规定它的请求队列的长度,之后就调用accept函数来接收连接。客户端在建立套接口之后就可调用connect函数来发送和接收数据。最后,待数据传送结束后,双方调用close函数关闭套接口。其原理如图2-4所示。</p><p>  图2-4 Winsock通信原理图</p><p>  本游戏采用的编程工具是VC++6.0,C++6.0是Microsoft公司推出的一个基于Windows

33、系统平台、可视化的集成开发环境,它的源程序按C++语言的要求编写,并加入了微软提供的功能强大的MFC(Microsoft Foundation Class)类库。MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需

34、的程序,而是从一个比较高的起点编程,故节省了大量的时间。使用VC++提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。此外,本程序的开发人员一直使用VC++6.0进行程序设计,对此比较熟悉,对其可视化面向对象的编程特点相对了解,在开发起来会轻松许多。</p><p><b>  表2-1 硬件需求</b></p><p>  2.4 需求分析

35、 </p><p>  游戏流程需求:7种方块共有28中状态(包含形象重复的),在屏幕顶端依次随机下落填充给定的区域,下落过程中由玩家根据自己需求的情况下控制方块的旋转得到自己所需要的图形,并选择下落的位置,判断是否填满某一行或几行,若满消去该行或几行并获得积分,在游戏过程中如果某个玩家的区域在无法放置随机落下的方块,则对方获胜;反之,则对方失败。游戏的主要功能需求如下:</p><p&g

36、t;  用户界面需求:7种方块分别用不同的颜色来显示,随机落下的方块在一定的区域里根据玩家的操控进行变形并放在所需的位置上。需要有良好的人机交互和观赏性的界面,玩家登录到服务器房间后可以看到以下模块:登录到服务器的各个玩家的信息、各个玩家在游戏界面中所在的位置、各个玩家是否准备的画面、玩家之间进行交流的聊天对话框以及在自己所登录的界面上在游戏过程中了解到其他玩家的游戏状况。</p><p>  游戏形状(方块)需

37、求:绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形(即旋转),可设为顺时针或逆时针变形,一般为逆时针方向旋转。</p><p>  键盘处理事件:方块随机下落时,可以通过键盘上的方向键对方快进行控制。上键控制方块的变形,下键控制方块的加速,左键控制方块向左移动,右键控制方块的向右移动。</p><p>  显示需求:当方块填满某一

38、行或几行时消去该行或几行,在所消去的行上面的方块向下移动,并统计所得积分。</p><p><b>  2.3 概要设计</b></p><p>  2.3.1 功能定义 </p><p>  本系统主要以网络通信为基础实现人与人的交互。它主要包含以下几大功能模块:</p><p>  (1) 系统初始化模块<

39、;/p><p>  该模块主要提供玩家进入游戏时初始化游戏界面的功能。登录时,玩家需要有一个昵称,在游戏过程中,玩家能看到其他所有对手的资料。</p><p>  (2) 俄罗斯方块算法模块</p><p>  该模块主要实现俄罗斯方块游戏的控制。其中它主要包括判断胜负算法模块和方块产生算法模块。下图显示的就是方块如何产生的算法。</p><p>

40、;  图2-5 方块产生流程</p><p>  (3) 网络通信模块</p><p>  网络通信模块主要包括服务器的建立、客户端与服务器的链接、服务器将其他客户端玩家资料传送给玩家。即,在界面内保证能让每个玩家看到对手资料。</p><p>  各个模块主要实现的功能如下:</p><p>  图2-6 网络通信模块功能图</p&g

41、t;<p>  (4) 游戏界面绘制模块</p><p>  该模块是游戏实现的核心模块,它本身并不实现一些游戏控制的功能。但是,它是其他模块功能的体现。其他模块都要受它的调用,从而形成一个游戏系统。该模块主要由初始化界面绘制和游戏开始界面绘制两个子模块组成。它们主要完成界面在不同事件响应下游戏界面的绘制和音频的播放功能。</p><p>  图2-7 界面绘制模块图<

42、/p><p>  以上是游戏功能实现的主要模块,它们经过相互调用控制,协作分工最终完成了本游戏系统的设计。</p><p>  2.3.2 游戏框架设计</p><p>  本系统采用C/S软件模型、单线程、阻塞式网络通信的设计方式。系统刚运行的时候都要调用系统初始化模块读取用户配置信息对游戏主系统进行初始化,之后系统进入游戏主界面。系统通过调用网络通信模块中的服务器端

43、模块完成服务器的建立,并等待连接。客户端主界面首先调用网络通信模块完成与服务器的连接。连接成功后,系统调用网络通信模块实现服务器端玩家和客户端玩家间操作信息的交互,并通过游戏界面绘制模块绘制游戏开始后的主界面。游戏结束后,系统将玩家战绩信息更新到配置文件中。</p><p>  图2-8 系统层次图</p><p><b>  3 详细设计</b></p>

44、<p>  3.1 系统组成及功能描述</p><p>  本游戏软件是在传统的单机版俄罗斯方块游戏的基础上增加了网络多人分组对抗对战模式。增加了人与人间的交流和各种道具的使用,增强了俄罗斯方块的趣味性和可玩性。</p><p>  本游戏的主要功能是:通过客户端登录到服务器的各个玩家可以自己选择同伴和对手,因为本游戏设计的目的就是进行网络多人分组对抗,需要至少有两支队伍才可

45、以进行游戏。在游戏过程的中,各个玩家通过消去方块可以随机获得某个道具,这些道具有的可以增加游戏的难度,如在底部添加几行。也有降低游戏难度的,如减少当前玩家底部的行数,玩家们可以通过自己的需求给己对或对方使用道具来降低己方游戏的难度或增加对方的游戏难度。另外,为了增强俄罗斯方块的竞争、可玩性和趣味性,同时使用网络的优势,玩家和玩家之间可以通过对话框进行聊天,沟通。</p><p>  本软件的组成:本软件为C/S软

46、件模型,主要由软件初始化模块、游戏算法模块、网络通信模块、界面绘制模块四部分组成。</p><p>  3.2 系统初始化模块设计</p><p>  软件初始化模块是从配置文件中读取玩家的信息完成游戏初始化的过程。</p><p>  在游戏结束后该模块会自动保存玩家战绩信息到配置文件中。</p><p>  用户初始化登录信息如图3-1所

47、示。</p><p>  图3-1 用户登录信息</p><p>  登录以后玩家的状态显示为未准备状态,如图3-2(a)所示:头像为黑白状态,该状态下,游戏不能开始。</p><p>  图3-2(a) 图3-2(b)</p><p>  当玩家点击准备时,头像就变为彩色,如图3-2(b)。这时

48、,如果至少有两组玩家准备号,就可以开始游戏。</p><p>  3.3 游戏算法实现模块</p><p>  本俄罗斯方块游戏中,有相当大的篇幅是算法的实现模块部分。无论是传统版单机俄罗斯方块,还是本网络多人分组对战模式的俄罗斯方块都离不开算法的支持。接下来详细介绍本软件的算法。图3-3为游戏主要函数调用流程图。首先从一个方块random()的随机产生开始,判断是否能产生方块。如果不能,

49、则直接在massagebox中显示游戏结束;如果能,则刷新容器内的的图,接下来判断方块能否下落和键盘事件,根据相应的键盘事件进行相关判断,如,按上旋转键,则判断方块能否进行旋转,左右移动也是类似。方块落下后,进行一次判断,看游戏是否失败,失败则提示游戏结束,否则,继续产生新的方块。调用流程如图3-3。</p><p>  图3-3 方块产生后函数调用流程图</p><p>  主要的游戏过

50、程如下:游戏开始随机产生一个方块,接下来判断方块是否已经到达底部,如果不是,则执行自动下降或根据键盘事件快速下降,直到下降到底部,并进行判断是否满足消行条件进行消行操作。否则,继续随机生成下一个下落方块,在下一个方块的提示框中用新生成的方块代替先前在该方框显示的方块,并用先前在该方框里方块作为当前下落的方块,当方块产生时就已经在底部(即在游戏区域的顶端),则游戏结束。否则,继续循环该流程。流程图如图3-4所示。</p>&

51、lt;p>  图3-4 游戏流程图</p><p><b>  3.3.1方块实现</b></p><p>  所有的部件及已停止的部件均用小方格来表示。整个游戏区域对应一个二维数组,数组元素为0时,表示空白;为1时,表示已有方格。该数组存储所有已经不能移动的部件。部件采用一维数组表示,这些一维数组实际表是一个n×n的矩阵。如表示一个方块使用一个2&#

52、215;2的矩阵,实际存储{1,1,1,1};如表示一个长条使用一个4×4的矩阵,实际存储{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}。</p><p>  实际显示的时候,先画出已停止的方块,然后计算出正在下落的部件的正确坐标位置并其将画出,同时在固定位置画出预览方块。</p><p>  旋转部件时,只需变换存储部件的矩阵即矩阵的转置,使其对应为转换后的

53、形态,并将其显示出即可。</p><p>  判断部件是否可以下落、旋转、左移、右移时,将表示部件的数组对应到游戏区域的二维数组中,再判断是否允许操作。当部件无法再操作时,将部件数组中对应填入游戏区域中对应的二维数组。</p><p>  使一层消失可以通过判断游戏区域中的二维数组是否某一行全为1;如果该数组的第一行全为1或已没有足够的空白使新的部件可以加入到游戏区域中,则游戏结束。<

54、;/p><p>  3.3.2数据结构的实现</p><p>  游戏方块Componet结构体</p><p>  typedef struct tagComponet</p><p>  {int intComID; //部件的ID号</p><p>  int ntDimension; //存储该部件所

55、需的数组维数</p><p>  int* pintArray; //指向存储该部件的数组 </p><p>  }Componet;</p><p>  Componet结构体表示某个游戏方块具体的属性,每个游戏方块对应有一个编号,且有对应存储该部件的数组,用指针指向该数组,并设定存储该部件所需数组(n×n)的维数。</p><

56、p>  Componet结构体数组</p><p>  初始化游戏方块,即定义MAXCOM个Componet类型的结构体,并初始化(MAXCOM为7)。例如</p><p>  m_Componets[6].intComID=6;</p><p>  m_Componets[6].intDimension=4;</p><p>  m_

57、Componets[6].pintArray=new int[16];</p><p>  m_Componets[6].pintArray[0]=0;</p><p>  m_Componets[6].pintArray[1]=1;</p><p>  m_Componets[6].pintArray[2]=0;</p><p>  m_C

58、omponets[6].pintArray[3]=0; //0 1 0 0</p><p>  m_Componets[6].pintArray[4]=0; //0 1 0 0</p><p>  m_Componets[6].pintArray[5]=1; //0 1 0 0</p><p>  m_Componets[6].pintArray[6]=0;

59、 //0 1 0 0</p><p>  m_Componets[6].pintArray[7]=0;</p><p>  m_Componets[6].pintArray[8]=0;</p><p>  m_Componets[6].pintArray[9]=1;</p><p>  m_Componets[6].pintArray[10]

60、=0;</p><p>  m_Componets[6].pintArray[11]=0;</p><p>  m_Componets[6].pintArray[12]=0; </p><p>  m_Componets[6].pintArray[13]=1; </p><p>  m_Componets[6].pintArray[14]

61、=0; </p><p>  m_Componets[6].pintArray[15]=0;</p><p>  以上代码是对长条这个方块的定义和初始化。其余形状的6种方块的定义不在此赘述。</p><p>  3.3.3游戏功能实现</p><p><b>  1、游戏方块预览</b></p><

62、p>  游戏中的方块将在4*4的正方形小方块中预览,如图4所示。使用随机函数rand( )来产生0~6之间的游戏方块编号,其中的正方形小方块的大小为SIZE*SIZE。SIZE为所设定的方块像素大小。</p><p><b>  2、游戏方块控制</b></p><p>  (1)左移的实现过程:</p><p>  a.首先判断方块在矩

63、形“容器”中能否能左移。要想左移必须满足以下两个条件:(1)如果正在下落的方块整体左移一位后,该方块不超越“矩形”容器的左边线,否则出界,不能执行该操作;(2)在该4*4方块有值(值为1)的位置,“矩形”容器内在这时必须是没有被占用的(占用时,值为1),否则,不能执行该操作。如果能同时满足上述这两个条件,则执行左移操作,否则不执行左移操作。</p><p>  b.清除执行左移操作前的方块。</p>

64、<p>  c.该方块左移后,在左移一位后的位置,重新显示此游戏方块。(b、c操作步骤中涉及到的如何清除和显示方块的函数在第四章中的功能函数设计中将会详细进行阐述)。</p><p>  (2)右移的实现过程:</p><p>  a. .首先判断方块在矩形“容器”中能否能右移。要想右移必须满足以下两个条件:(1)如果正在下落的方块整体右移一位后,该方块不超越“矩形”容器的右边

65、线,否则出界,不能执行该操作;(2)在该4*4方块有值(值为1)的位置,“矩形”容器内在这时必须是没有被占用的(占用时,值为1),否则,不能执行该操作。如果能同时满足上述这两个条件,则执行右移操作,否则不执行右移操作。</p><p>  b.清除执行左移操作前的方块。</p><p>  c.该方块右移后,在右移一位后的位置,重新显示此游戏方块。(b、c操作步骤中涉及到的如何清除和显示方

66、块的函数在第四章中的功能函数设计中将会详细进行阐述)。</p><p>  (3)向下加速下落(下移)的实现过程:</p><p>  a. 首先判断方块在矩形“容器”中能否能右移。要想右移必须满足以下两个条件:(1)如果正在下落的方块整体右移一位后,该方块不超越“矩形”容器的底边线,否则出界,不能执行该操作;(2)在该4*4方块有值(值为1)的位置,“矩形”容器内在这时必须是没有被占用的

67、(占用时,值为1),否则,不能执行该操作。如果能同时满足上述这两个条件,则执行下移操作,否则不执行下移操作。</p><p>  b.清除执行右移操作前的方块。</p><p>  c.该方块右移后,在右移一位后的位置,重新显示此游戏方块。</p><p>  (4)旋转的实现过程:</p><p>  a. 首先判断方块在矩形“容器”中能否

68、旋转。要想旋转必须满足以下两个条件:(1)如果游戏方块整体旋转后,游戏方块不能超过“矩形”容器的左边线、右边线、底边线,否则越界,不能执行该操作;(2)在该4*4方块有值(值为1)的位置,“矩形”容器内在这时必须是没有被占用的(占用时,值为1),否则,不能执行该操作。如果能同时满足上述这两个条件,则执行下移操作,否则不执行下移操作。</p><p>  b.清除执行旋转操作前的游戏方块。</p>&

69、lt;p>  c.在“矩形”容器中显示区域不变的位置,显示旋转后的游戏方块。</p><p><b>  3、游戏显示更新</b></p><p>  a.当游戏方块执行左右移动、下落、旋转操作时,首先要清除先前位置的游戏方块,再根据操作向左一位、向右一位、向下一位或在显示区域不变的位置重新绘制游戏方块。</p><p>  b.当某一行

70、或几行填满方块消去时,上方不能移动的方块下移后,进行重新绘制。</p><p>  清除游戏方块的过程为:首先用刷新函数刷新相应的游戏区域,清除执行操作前显示的方块,执行相应的操作后,再次调用刷新函数刷新此区域,显示将要显示的游戏方块。</p><p><b>  4、游戏帮助功能</b></p><p>  在帮助的功能选项中直接添加静态文本

71、即可。</p><p>  3.4 网络通信模块</p><p>  网络通信模块是各个玩家实体之间连接。它的主要作用是将两个以上的玩家进行交流和沟通,通过聊天对话框实现人与人之间的交互。进而提高俄罗斯方块的趣味性、交互性、可玩性。具体来说本游戏的网络通信模块主要包括服务器端和客户端两个模块。服务器端模块创建服务器为客户端提供服务,接受客户端的连接。客户端模块主要用于将客户端连接到服务器端

72、,建立连接之后,服务器和客户端分别将玩家的操作情况以消息的形式进行交互,并根据消息更新容器内玩家进度以及响应各种请求。</p><p>  套接字建立:系统继承CAsyncSocket类生成派生类CFiveSocket,并在CFiveSocket类中重载了OnAccept、OnConnect、OnReceive、OnClose消息。服务器的建立遵循CSocket编程的一般步骤,首先创建监听套接字,调用Listen

73、()监听客户端的连接。有客户端请求连接时,调用Accept()接受客户端的连接。连接成功后,就可以调用ReceiveData()接收已连接客户端发送来的消息。客户端封装CSocket类生成了CMysocket类,并重载了OnReceive消息。此后新的游戏实例作为客户端程序创建客户端套接字,然后调用Connect()连接到指定的服务器,连接成功后,调用Send()将该玩家的游戏基础信息发送到服务器。</p><p&g

74、t;  服务器端和客户端消息的收发:服务器建立成功,客户端连接到服务器后,客户端就可以向服务器发送消息。服务器重载ReceiveData()来接收客户端发送的消息,利用Send()来发送消息。客户端也重载了ReceiveData()来接收服务器发送来的消息。由于本系统中发送和接收的数据样式各不相同,因此本系统自定义消息格式,统一数据的发送方式。</p><p>  3.5 游戏界面绘制模块</p>

75、<p>  设计游戏的良好的游戏界面目的是能给游戏玩家提供良好的视觉感受。所以,游戏界面的回执非常重要。前面各模块的功能主要集中在游戏逻辑的实现,那么游戏界面绘制模块就是将看不见的游戏逻辑让游戏玩家能够看见,从而帮助玩家正确的完成操作。该模块贯穿整个游戏系统,从进入游戏到最后退出游戏都将用到该模块来绘制游戏界面,显示游戏进行情况。游戏界面绘制模块实现较复杂,提供的函数接口比较烦琐。从游戏进行的阶段可以将该模块分为游戏初始界面绘

76、制和游戏开始界面绘制。</p><p>  3.5.1 游戏初始界面</p><p>  该界面是登录成功后,玩家第一次看见的游戏界面,此时,游戏玩家没有作出任何操作。但图中昵称为456的玩家已经准备游戏,123尚未准备,界面效果图如图3-5所示。</p><p>  图3-5 游戏初始界面</p><p>  初始界面绘制原理是:由重绘消息

77、WM_PAINT消息触发CBoard类中的OnPaint()函数对界面进行重绘制。系统先创建内存DC,在内存中先绘制好主界面和根据保存当前界面情况数据的二维数组m_data绘制方块,最后再将内存中的界面数据直接拷贝到设备当中,这样就很好地解决了在游戏过程中由于不断刷新界面数据而导致屏幕闪烁的问题。</p><p>  3.5.2 游戏开始界面</p><p>  游戏开始界面是指两个玩家已

78、经建立连接,游戏开始后的游戏界面。此时的游戏界面是最复杂的,游戏界面时刻都在变化,它动态的显示了玩家游戏进行的情况。游戏效果图如图3-6所示。</p><p>  图3-6 游戏开始界面 </p><p>  从上面图形可以看到本阶段的界面显示变化较快,变化的方式较多,但是它的绘制原理并没有太大的变化,只是系统操作变得更多,收发的消息更多而已。</p><p>  

79、总之,游戏界面的绘制都是以系统消息为主导的,收到什么消息就会绘制相应的游戏界面。</p><p>  4 俄罗斯方块游戏的实现</p><p>  4.1 实现原理和主要机制 </p><p><b>  (1)定时制机制</b></p><p>  从分析俄罗斯方块游戏的特点而得,在游戏开始时定时器就应该产生并生

80、效,而在游戏暂停时使已经制定的定时器失效,当游戏从暂停状态回到游戏状态时,系统再重新创建一个定时器并激活使其正常工作;当游戏结束时,则将制定的定时器销毁。经上所述所以在游戏的开始、暂停、结束分别对应的游戏开始函数、暂停函数、结束函数中进行定时器的控制,对定时器进行创建激活、失效与销毁处理。所以,先在VC6.0资源编辑器菜单资源选项里面新添加三个菜单选项,然后通过时类图实现即分别是游戏的“开始”、“暂停”、和“结束”,然后利用ClassW

81、izard直接在视图类对象Cskyblue_RectView中分别为它们添加空白的处理函数,具体函数添加如表4-1所示。</p><p>  表4-1 菜单选项功能对应表</p><p><b>  (2)定时处理</b></p><p>  经过定时器的设置后,这里通过利用类向导(ClassWizard)跳到定时器到时候所处的处理函数OnTi

82、mer()去实现,当系统所设置的固定时间片间隔到时后,首先先检测当前所下落的方块是否已经到达了底部,如果否则继续进行RectDown(),即方块继续向下一个单位移动的操作;如果是则方块下落到底后,并随机产生一个新的“下一个方块”,并代替旧的,将先前所产生的旧的“下一个方块”作为当前定时器激活状态下所正在使用的方块,并对使用后的游戏当前的状态进行检测:</p><p>  方块到达当前游戏状态的底部,并满足某一行或

83、几行填充满的情况下消去该一行或几行。</p><p>  (2)方块到达当前游戏状态的底部的同时到达游戏区域的顶部,而且不满足消行的条件,进而判断该玩家所参与的游戏是否因为违反规则而结束游戏。</p><p>  本游戏使用视图类所创建得m_icurrentStatus和m_inextStatus两个成员变量来记录七种不同类型的下落方块。而m_currentRect除了记录下落方块的,还要

84、记录下落方块在下落过程中当前的变形状态。m_icurrentStatus和m_inextStatus以及m_currentRect记录方块的状态时最多用两位表示,第1位用作方块的类型标识(1~7),第2位用作同种类型的方块的不同变换形态 (1~4),七种类型的方块每种类型最多有四种变换形态。</p><p>  将当前方块的状态的记录和先前的下落方块保存下来,利用random(小于或等于所指定的正整数),并根据这

85、个正整数来确定下一个下落方块的类型。接下来进行初始化,在屏幕的左上角根据上述的产生的方块状态进行更新图。注意在方块刚开始下落的时候要保证方块要全部显示在所指定的游戏区域里,所以要进行纵坐标的根据方块的类型状态向下进行一定的偏移。</p><p>  (3)当前方块底部到达的判断与销行的实现</p><p>  图4-1 处理方块到达图</p><p>  当新的方块

86、下落时,要判断这个方块是否已经到达了区域底部,可以利用数组InterFace[74][4]所记录7种不同类型方块的4种不同形态的接触面信息,通过当前下落方块所对应的接触面的方块位置为被占用状态(MAP_STATE_NOT_EMPTY=1)来确定。如果方块到达底部,则需判断情况。如果满足消行条件,则进行消行,如果不满足,则记录当前方块下落的位置并加载下一个方块继续游戏,最后改变数据状态。</p><p>  统计分

87、数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值(即小区的行数)决定分数的多少,统计分数的规则:x*(x*100),x为同时小区的行数,x是大于等于1且小于等于四的正整数。即消一行得100分,同时消2行得400分。如果没有满行,则加载下一个方块继续游戏。</p><p>  图4-2 判断满行及销行图</p><p>  检测游戏区域中的所有行,,并对每行的所有纵列状态进

88、行检测,如果其中有一列是空闲状态则不可以销行。如果可以某行或某几行满足销行的话,改变统计分数,并且将该行或几行清空,再将该行或几行上面的所有方块都向下偏移一个或几个单位,以填充该行或几行的空缺。</p><p>  if (m_isBottom)</p><p>  {//判断是否已得分</p><p>  for (i=0;i<m_iRow;i++)<

89、/p><p>  {m_bIsSucced = TRUE;</p><p>  for (j=0;j<m_iCol;j++)</p><p>  if (GameStatus[i][j]==MAP_STATE_EMPTY)</p><p>  m_bIsSucced = FALSE;//如果得分,则销掉此行</p><p

90、>  if (m_bIsSucced)</p><p>  {for (k=i;k>0;k--)</p><p>  for (j=0;j<m_iCol;j++)</p><p>  GameStatus[k][j] = GameStatus[k-1][j];//第1行清零</p><p>  for (j=0;j<m

91、_iCol;j++)</p><p>  GameStatus[0][j]=MAP_STATE_EMPTY;</p><p>  m_iMuch += 1;}}</p><p>  在视图类对象中增加了m_iStartX和m_iStartY两个成员变量,它们分别为视图窗口的左上角起点的坐标偏移值。如果该函数检测到有消行的操作,经过数据的修改后,将消行行后的区域空白出

92、来以及分数显示区域的部分进行修改即进行重绘。所以函数体分别先计算出这两个小矩形区域的位置,然后再调用InvalidateRect()函数对这两个区域宣布重绘,从而触发视图的重绘。</p><p>  4.2 主要的功能函数</p><p>  在MFC视图类中添加功能构造函数,主要的功能函数设计如下:</p><p>  CELSblockView():</p

93、><p>  函数原型:CELSblockView::CELSblockView()</p><p>  CELSblockView()初始化游戏的各项数据,“矩形”容器(游戏地图)、游戏级别、当前部件的ID、游戏分数、随机函数。定义并初始化MAXCOM个方块部件信息(MAXCOM为7),且在对应的析构函数中释放回收内存。</p><p><b>  OnDr

94、aw():</b></p><p>  函数原型:void CELSblockView::OnDraw(CDC* pDC)</p><p>  OnDraw()导入背景图片,画游戏区域、不能移动的方块、下落的部件,显示得分、级别、下一个方块。</p><p>  OnKeyDown():</p><p>  函数原型:void C

95、ELSblockView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)</p><p>  OnKeyDown()对键盘信息处理,读取键盘操作值,对当前部件,调用CanLeft()、CanRight()、CanRotate()、CanDown(),并实现左移、右移、旋转、加速下落。</p><p>  OnTimer():</p&

96、gt;<p>  函数原型:void CELSblockView::OnTimer(UINT nIDEvent)</p><p>  OnTimer()是定时器消息处理函数,显示预览部件,调用CanDown()判断能否下移,实现方块自由下落,调用Disappear()消去满行,调用CheckFail()判断游戏是否结束,调用NewComponet()产生新部件。</p><p&g

97、t;  NewComponet():</p><p>  函数原型:void CELSblockView::NewComponet(void)</p><p>  NewComponet()产生新部件的函数,并将新部件的信息拷贝到当前部件的结构体m_CurrentCom中。</p><p>  CanDown():</p><p>  函数原

98、型:bool CELSblockView::CanDown(void)或false。</p><p>  CanLeft() :</p><p>  函数原型:bool CELSblockView::CanLeft(void)</p><p>  CanLeft()判断游戏方块是否可以左移,并返回值true或false。</p><p>  

99、CanRight():</p><p>  函数原型:bool CELSblockView::CanRight(void)</p><p>  CanRight()判断游戏方块是否可以右移,并返回值true或false。</p><p>  CanRotate():</p><p>  函数原型:bool CELSblockView::Can

100、Rotate(void)</p><p>  CanRotate()判断游戏方块是否可以旋转,并返回值true或false。</p><p><b>  CanNew():</b></p><p>  函数原型:bool CELSblockView::CanNew(void)</p><p>  CanNew()判断是否

101、可以在“矩形”容器中产生新的游戏方块,并返回值true或false。</p><p>  CheckFail():</p><p>  函数原型:bool CELSblockView::CheckFail(void)</p><p>  CheckFail()判断游戏是否结束,并返回值true或false。</p><p>  Disappe

102、ar():</p><p>  函数原型:CELSblockView::Disappear(void)</p><p>  Disappear()判断是否有满行,且消去满行,记录消去行数,并按规则增加和显示游戏分数。</p><p>  MyInvalidateRect():</p><p>  函数原型:Void CELSblockView

103、::MyInvalidateRect(POINT ptStart,int intDimension)</p><p>  MyInvalidateRect()刷新了一个以ptStart为坐上角,长度为intDimension且不超出游戏区域的正方形区域。</p><p>  OnGameStart():</p><p>  函数原型:void CELSblockVi

104、ew::OnGameStart()</p><p>  OnGameStart()游戏开始的菜单和工具栏消息函数。</p><p>  OnGameEnd( ):</p><p>  函数原型:void CELSblockView::OnGameEnd()</p><p>  OnGameEnd( )游戏结束的菜单和工具栏消息函数。</

105、p><p>  其他相关的功能实现函数:</p><p>  PreCreateWindow( )</p><p>  函数原型:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)</p><p>  PreCreateWindow( )设置生成主窗体的大小、风格。</p>

106、<p>  4.3 响应事件原理</p><p><b>  (1)处理键盘事件</b></p><p>  关于按键命令消息的响应,可以通过对WM_KEYDOWN消息的处理函数进行截获并重写来实现,下面是对该处理函数OnKeyDown()的重写。</p><p>  功能:处理用户的输入,方块的左,右移,加速及变形</p>

107、;<p>  void CSkyblue_RectView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) </p><p>  {switch(nChar)</p><p>  {case VK_LEFT:</p><p>  RectArrow(LEFT);</p><p&

108、gt;<b>  break;</b></p><p>  case VK_RIGHT:</p><p>  RectArrow(RIGHT);</p><p><b>  break;</b></p><p>  case VK_UP:</p><p>  RectChan

109、ge();</p><p><b>  break;</b></p><p>  case VK_DOWN:</p><p>  RectArrow(DOWN);</p><p><b>  break;}</b></p><p>  CView::OnKeyDown(nCh

110、ar, nRepCnt, nFlags);}</p><p>  图4-3 图键盘事件功能图</p><p>  当方块要进行变形或向左、右、下移动时,首先要对方块将要移动到的位置进行判断,判断是否有障碍,如果有该操作不被执行,方块则仍然保持到原来的位置不变;如果没有则根据玩家所按的键执行相关的操作。并把该方块的位置显示出来。其实方块的各个方向的移动知识对方块所处的坐标的变化。</p

111、><p><b>  (2)变形的实现</b></p><p><b>  图4-4图方块变化</b></p><p>  本游戏通过键盘的向上键来控制方块的变形。即当玩家按下向上键时,程序就会执行方块变化change()函数。方块的类型有七种(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),而每个随机产生的方块都有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 众赏文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论