题目: 基于win32下俄罗斯方块游戏开发
姓 名 : 学 号 : 院 (系): 专业、年级 : 指导教师:
2012年 4月 1 日
目 录
第1章 引 言..................................................................................................................8 1.1发展现状....................................................................................................................8 1.2目的和意义................................................................................................................8 1.3主要内容....................................................................................................................8 1.4本文的结构................................................................................................................8 第2章 工具的简介......................................................,...................................................10 2.1 游戏的历史.......................................... ..................................................................10 2.2 Windows编程特点..................................................................................................10 2.3 Visual C++ 6.0编程特点 .......................................... ............................................11 第3章 需求分析.............................................................................. ...............................13 3.1 游戏需求.................................................................................................................13 3.2 软硬件需求.............................................................................................................13 3.3 接口控制.................................................................................................................14 第4章 概要设计..............................................................................................................16 4.1键盘消息的产生和发送...........................................................................................16. 4.2 WIN32下游戏编程的框架结构..............................................................................16 4.3 数据结构极其算法..................................................................................................18 4.4 游戏说明..................................................................................................................20 4.5 设计分析..................................................................................................................20 第5章 详细设计...............................................................................................................21 5.1 总体设计..................................................................................................................21 5.2 创建界面的主框架..................................................................................................28 5.3 正常流程的设计......................................................................................................32 5.5结构设计...................................................................................................................33 5.6 功能的完善..............................................................................................................35 第6章 系统测试..............................................................................................................36 第7章 总结和展望..........................................................................................................40
致谢................................................................................................................................41 参考文献..........................................................................................................................42. 附录A............................................................................................................................43
基于Win32下的俄罗斯方块游戏设计
摘 要
近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏
高手完美的表演时,你是否想过我也能达到那种水平,本程序采用世界上最经典的游戏-俄罗斯方块为背景,程序设置了鼠标和键盘操作两个选择方式,游戏运行时随着等级的的提高而速度加快,这需要玩家快速操作。因此本程序主要意义是为高手玩家提供训练的平台。其次也可为刚踏入游戏领域的新手们,提供一个很好的锻炼机会。
本毕业设计主要解决利用Visual C++设计与实现俄罗斯方块游戏的算法、游戏内部功能、游戏区域的绘图的程序设计。在毕业设计中,系统开发平台为Windows 2000,程序设计设计语言采用Visual C++ 6.0,程序运行平台为Windows 98/2000/XP。对于每个俄罗斯方块各自的形态变换改变到下一个形态利用数组来实现,在程序设计中,采用WIN32机制来实现,并且直接从架构的其中一个类对象中继承下来,将它完善而变成有某功能特性的物件对象。
【关键词】 俄罗斯方块 Win32 数据结构 算法 数组
Game Design under Win-32 Based on Russian Box
Abstract
In recent years, with the game industry developing fast, game players’ technology is also growing. When you see the game master’s perfect performances, do you think that you can reach thaot level? This program uses the world’s most classic game Russia Box as the background and sets up both mouse and keyboard as selection modes, which need the
increasing of speed with the game level rising as the game is running. However, it requires the game player’s quick operation f the mouse and the keyboard. Therefore, the main significance of this program is to provide a training platform for master players and a good training opportunity for rookies in this field.
This course is designed to solve the problem of programming by using Visual C + + to design and implementing Russian box game algorithm, the internal functions of the game and the game graphics. In the curriculum design, the system development platform is Windows 2000, and running platform is Windows 98/2000/XP with Visual C + + 6.0 as programming language. As for the change of each Russian square in their morphological transformation and turning to the next form, an array is used to achieve it; in the programming, we use WIN32 to achieve it by making it directly develop from a class object of the structure, and improving it to become an object of certain functional properties.
【Key words】Russian box Win32 data structure algorithm array
第1章 引 言
1.1发展与现状
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的
轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。
究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,俄罗斯方块游戏现在几乎是每个手机必备的游戏,种类千变万化,多种多样。
1.2目的和意义
俄罗斯方块是个老幼皆宜的小游戏,是经久不衰的一款游戏,自从它诞生那天起就一直深受人们的喜爱。几乎每个人都玩过这款游戏,也是人们接触最多的一款游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。然后程序根据这七种方块堆叠成各种不同的模型。
1.3主要内容
本毕业设计是基于Win32下的俄罗斯方块游戏开发,每个方块由四个小的正方形方块组成,由七种不同的颜色,方块共有七种不同的形状,在本毕业设计中方块用一个数组表示,其变形也存储在同一个数组当中。方块旋转时数组坐标加一,等级是按照(ilever*50+50)*ilever/2来计算的。
1.4本文的结构
第2章主要介绍所使用的开发工具,第3章主要是游戏的需求分析,第4章主
要是俄罗斯方块游戏的概要设计,第5章主要是俄罗斯方块游戏的详细设计,第6章主要是俄罗斯方块的系统测试,第7章主要是总结和展望。接着是致谢和参考文献。
第2章 工具简介
俄罗斯方块是个老幼皆宜的小游戏,是经久不衰的一款游戏,自从它诞生那
天起就一直深受人们的喜爱。几乎每个人都玩过这款游戏,也是人们接触最多的一款游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。然后程序根据这七种方块堆叠成各种不同的模型。
2.1 游戏的历史
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。 究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在\联众俄罗斯方块\中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所 。
2.2 Windows编程特点
一、图形用户界面
Windows为用户提供了独立于应用程序的图形设备接口,利用这个接口,程序员可以在应用程序中显示文本和图形;所有的硬件设备都由Windows的设备驱动程序来管理。
二、多任务
在传统的MS-DOS环境中,每次只能够执行一个任务,只有从一个任务中退出才能执行下一任务,这样在客观上就浪费了很多的资源。但是在Windows操作环境中,多个应用程序可以同时运行,每个应用程序在屏幕上都有一个显示的窗口,即为Windows的多任务环境。
三、资源共享
在Windows操作系统中,应用程序之间共享资源的方式共有三种:剪贴板、
DDE和OLE。根据Windows API函数完成的功能,可以将其分为三类:
① 窗口管理函数:实现窗口的创建,移动和修改功能。
② 图形设备接口(GDI)函数:实现与设备无关的图形操作功能。 ③ 系统服务函数:实现与操作系统有关的多种功能。
MFC类库,集成了大量已经预先定义好的的类 ,用户可以根据编程的需要,调用相应的类,或根据需要自定义有关的类。
Window编程需要注意的地方有以下几点: ①窗口事件 ②事件驱动函数
③消息及其在编程中的应用 ④对象与句柄 ⑤匈牙利表示法
2.3 Visual C++ 6.0编程特点
Visual C++6.0是微软公司推出的开发Win32应用程序(Windows 95/98/2000/XP/NT)的、面向对象的可视化集成工具。它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C++类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。
2.4 课题背景
基于Windows的游戏设计有很多方式,如基于java跨平添的设计,基于.net平台的设计和基于MFC的设计,三种设计各有优缺。基于java的设计能够充分运用java跨平台的特性,便于移植,可以做到一次代码在不同坏境下的运行,从而大大提高可移植性,便于在移动设备上运行,但是基于java的设计由于运行在虚拟机上,效率比较低。基于.net平台的设计可以利用.net平台提高的接口大大简化设计过程,然后而其通用性不好,需要,n.net平台支持,在执行奏效上也不如MFC程序。基于MFC的程序设计具有执行效率高的特点,跟windows的契合比较好,但不具有跨平台能力。相比三种设计方案,为了能够在windows平台上以更好的性能运行,综合分析市场Windows的操作系统占据最大份额,为了便于最广大的玩家能有分享这款游戏,本程序采用基于win32下的游戏程序设计,因为win32不像MFC那样系统进行过包装,程序员不需要了解内部情况,只
需使用就是了。而采用win32则需自己来包装下程序,这让程序员有随心编写程序的余地,也大大的增加了编程的难度。采用win32完成俄罗斯方块的游戏。 本程序采用win32下俄罗斯方块游戏编程,具有执行效率高,程序灵活多变,程序员可以按各自不同的方法来实现功能多种多样的俄罗斯方块,也是学习游戏编程的人员很好的学习突破点。本程序的亮点是首先有优美的界面设置,其次是有优美的背景音乐,让人在游戏过程中舒畅,第三,本程序在最下方有一个状态栏,给玩家有温馨的提示,让玩家随时知道自己游戏进行情况,让玩家随时感到有成就感。第四,本程序采用键盘和鼠标双向选择控制,玩家可以根据自己的爱好可以选择键盘操作,也可以选择鼠标进行操作。第五,本程序将每次玩家玩完游戏之后将其保存到系统配置文件,当再次运行时直接从系统配置文件中读取最高分数。
本程序的特点有:涵盖窗口、消息、菜单、工具栏、通用控件、状态栏、资源、对话框、计时器、自绘按钮、GDI、目录操作、INI文件等。一切都用最原始的Windows API方式编写。
第3章 需求分析
3.1 游戏需求
随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,速度不同,若在游戏中各形状填满了给定区域,为输者。游戏功能要求如下表3.1所示:
图 3.1游戏功能求表 功能 简介 旋转 绘制方块 擦除矩形 右移动 左移动 旋转砖块 指定画板上绘制砖块 指定画板上擦除矩形 右移动砖块 左移动砖块
一.游戏界面需求:良好的用户界面,有分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。
二.游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
三.键盘处理事件:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。
四.显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定的分数时过关。每关方块下落的速度不同。
3.2 软硬件需求
硬件的需求如下3.2表所示
表 3.2硬件需求
操作系统 内存容量 显卡要求 声卡要求 交互工具 CPU 光驱 硬盘空间 显示器 Windows 2000/XP/2003 64MB及其以上 8M及其以上 支持DirectX 9.0 音效卡 键盘/鼠标 奔腾133以上 8倍速以上 1GB及其以上 VGA以上显示器 3.3 接口控制
本软件需求通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对方块进行移动变形,要使用键盘的接口事件。
键盘接口功能如下3-3图所示:
等待消息按下方向键越界否是右左按下的是哪个方向键下上不移动
方块向右移动方块向左移动方块下落的速度加快方块顺时针旋转
图 3-3键盘接口功能图
如上述流程图所示程序运行时有一个消息队列,当用户按下一个键的时就给窗体发送了一个消息,此时接收处理消息有两种函数可以调用,一种是GetMessage()函数,另外一种是PeekMessage()函数,两个函数的功能在本质上没什么区别,GetMessage函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回,而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。
当按下一个键时,先判断其是否已经越界了,若发生越界或游戏结束时就不移动方块,然后判断其按下的具体是哪个键。
3.4俄罗斯方块最高分纪录流程
俄罗斯方块的最高分存贮在一个系统配置文件当中,第一次运行时将其最高分设置为一,当第一次运行完毕时,将当前的分数和最高分比较,如果当前最高分比存储的最高分要大,则将当前玩家所玩的成绩设置为最高分,第二次运行时直接读取最高分,并将其显示在游戏界面上,当游戏结束时比较下最高分,使最高分永远都保持在最大分数的状态。
游戏的最高分的纪录如下图3-4所示:
开始读取最高分游戏运行结束大于最高分?YESNO将当前分数赋值给最高分自动结束
图 3-4游戏的最高分纪录图
如图所示是俄罗斯方块的处理流程,从开始判断时候到底底部,到达则做销行操作,然后生成下一个下坠物,将新的下坠无代替旧的下一个下坠物,将旧的下坠无当做当前的下坠物。下到底部判断是否做销行操作,然后判断游戏时候借宿,未结束则继续新一轮的生产方块,若方块到达了底部,占满空间则游戏结束。
第四章 概要设计
4.1键盘消息的产生和发送
键盘作为输入设备,是WINDOWS应用程序的一个十分重要的输入手段。当用户按下或释放一个键时,键盘KEYBOARD.DRV中的键盘中断处理程序对所击键进行编码,并调用WINDOWS的用户模块USER.EXE中的有关程序来生成键盘消息。最终发送到硬功程序的消息队列中等待处理,而处理这些消息则是由应用程序的窗口过程来具体完成的。
键盘上每一个由意义的键都对应着一个唯一的标识值,称之为扫描码。当用户按下或释放某键时,都会产生扫描码,但扫描码是依赖于具体设备的,为达到设备无关性的要求,在应用程序中,往往使用的是与具体设备无关的虚拟码,虚拟码是由WINDOWS系统定义的与设备无关的键的标识。
设备驱动程序截取键的扫描码后,把他翻译成虚拟码,这样,由于键盘的输入,就产生了一条消息,它含有扫描码,虚拟码以及其他与击键有关的消息,设备驱动程序就把这些消息放到系统的消息队列中去,WINDOWS从系统消息队列中取出这条消息。再把它发送到相应的线程消息队列中去,最后,由窗口过程从线程消息队列中取出键盘消息队列,进行必要的后续处理。
键盘消息分成两类,即按键消息和字符消息。每当用户按下或松开一个键时,就产生了一个按键消息。WM_KEYDOWN和WM_KEYUP当一个按键的组合产生一个可以显示的字符,但只有当键盘驱动程序把键盘映射成ASCII后才能产生WM_CHAR消息。同样,字符消息也可以分成两类即:系统的和非系统的。字符消息处理如下图4.1所示:
WinMain系统队列消息循环设备驱动程序应用程序队列WNDPROC其他应用程序DefWndProc 图 4.1字符消息处理图
操作系统在接收到键盘输入后,还要决定哪一个应用程序将响应入Windows操作系统把消息发送给有\输入焦点(input focus)的窗口\由于某些应用程序有好几个窗口,键盘还必须由该应用程序的众多窗口共享,但当按下某一个键时,却只有一个窗口过程能接收到该键盘消息,接收这个键盘消息的窗口输入就称为有\输入焦点\的窗口,该窗口应是活动窗口,或者活动窗口的子窗口,有\输入焦点\的子窗口是所有输入消息的接收目标。窗口函数通过捕获WM_SETFOCUS和WM_KILLFOCUS消息以确定当前窗口是否具有输入焦点。 WM_SETFOCUS表明窗口在接收输入焦点,而WM_KILLFOCUS表示窗口失去焦点.在WinMain函数的消息循环中包含了TranslateMessage函数,他的主要功能是把按键消息转化为字符消息,但只有当键盘驱动程序把字符映射成ASCII码后才能产生
WM_CHAR消息。同样,字符消息也可以分成两类:系统的和非系统的。如下4.1表所示:
表 4.1字符消息分类
消息 WM_CHAR WM_DEADCHAR WM_SYSCHAR WM_SYSDEADCHAR 类型 非系统 非系统 系统 系统 含义 非系统字符 非系统死字符 系统字符 系统死字符
在Windows操作系统中,使用光标(cursor)来指示当前鼠标的位置,用插字符(caret)指示当前正文位置。插字符是应用程序共享系统资源,因此Windows桌面上只有一个差字符。
按键消息一般分成两类:系统按键消息和非系统按键消息。系统按键消息对应于使用了Alt键与相关输入的组合产生的消息。这些键一般由Windows系统内部直接处理,应用程序一般不处理。如果应用程序处理这些一般系统键消息,还要调用DefWindowsProc()函数,以便不影响Windows对他们的处理,非系统消息则对应于那些不使用A lt键组合的按键消息。
4.2 Win32下游戏编程的框架结构
基于Win32下的游戏编程不同于基于MFC编程,MFC许多的模块是已经封装好的程序员只需直接使用就可以了,而Win32没有进行封装需要程序自己动手编写所需要的模块,这也给程序员很多自由发挥的机会,当一个游戏运行的时候运行在一个窗口上面运行时的方式可以是全屏也可以是一个窗口的模式,基于WIN32下的游戏编程主要包括以下过程。
① WinMain函数:程序的入口函数。
② InitCommonControls函数:初始化通用控件类库。
③ RegisterClassEx函数:注册窗口类函数。 ④CreateWindowEx函数:窗口创建函数。 ⑤ShowWindow函数:窗口显示函数。 ⑥UpdateWindow函数:更新窗口函数。 ⑦WndProc函数:窗体过程函数。
4.3 数据结构及其算法设计
每个方块由四个小的正方形方块组成,由七种不同的颜色,方块共有七种不同的形状,在本毕业设计中方块用一个数组表示,其变形也存储在同一个数组当中。方块旋转时数组坐标加一,等级是按照(ilever*50+50)*ilever/2来计算的。
在对一个类对象进行继承并且做功能拓展的时候,一般不会不会有以下两种操作方法和属性出现:
① 操作方法和属性是该扩展功能所特有的,不与基类的任何操作和属性有直接的关联,他们制备新增的方法所使用。
② 操作方法和属性与基类的某些操作方法或属性相关联,他们之间存在着访问之间的关系。
在本程序中的俄罗斯方块用一个数组表示,其相应的旋转也用相应的数组表示,如下所示:
//□□ //□□(1) { }, //□□ // □□(2) { }, // □□ //□□ (2) {
{{1,0},{2,0},{0,1},{1,1}}, {{0,0},{0,1},{1,1},{1,2}}, {{1,0},{2,0},{0,1},{1,1}}, {{0,0},{0,1},{1,1},{1,2}} {{0,0},{1,0},{1,1},{2,1}}, {{1,0},{1,1},{0,1},{0,2}}, {{0,0},{1,0},{1,1},{2,1}}, {{1,0},{1,1},{0,1},{0,2}} {{0,0},{0,1},{1,0},{1,1}}, {{0,0},{0,1},{1,0},{1,1}}, {{0,0},{0,1},{1,0},{1,1}}, {{0,0},{0,1},{1,0},{1,1}}
}, //□□□□(2) { }, // □ //□□□(4) { }, //□ //□□□(4) { }, // □ //□□□(4) { }
{{2,0},{0,1},{1,1},{2,1}}, {{0,0},{0,1},{0,2},{1,2}}, {{0,0},{1,0},{2,0},{0,1}}, {{0,0},{1,0},{1,1},{1,2}} {{0,0},{0,1},{1,1},{2,1}}, {{0,0},{1,0},{0,1},{0,2}}, {{0,0},{1,0},{2,0},{2,1}}, {{1,0},{1,1},{0,2},{1,2}} {{1,0},{0,1},{1,1},{2,1}}, {{0,0},{0,1},{1,1},{0,2}}, {{0,0},{1,0},{2,0},{1,1}}, {{1,0},{0,1},{1,1},{1,2}} {{0,0},{1,0},{2,0},{3,0}}, {{1,0},{1,1},{1,2},{1,3}}, {{0,0},{1,0},{2,0},{3,0}}, {{1,0},{1,1},{1,2},{1,3}}
4.4 游戏说明
4.4.1 约定
①方块是指由四个小方格组合而成的一个大方块 ②游戏区是指方块下落的黑色区域 ③预览区是指显示下一个方块的黑色区域
4.4.2 客户区说明
①小方格 20*20像素
②游戏区小方格矩阵10*19(个),坐标原点20,40(像素)
③游戏区小方格矩阵5*5(个),坐标原点240,240(像素)
4.4.3 计分算法
①级别为n时方块下落时间节拍为550-55n毫秒 ②每满一行加10分
③级别为n时拥有的分数为((n-1)*50+50)*(n-1)/2
4.5 设计分析
在此游戏中方块用一个数组存储起来,其相应的旋转后的结构也用同一个数组表示出来,这大大简化了编程难度和代码的数量,也便于控制。每一个坐标表示一个小方块,使用已经画好的小方块填充,使其变得美观。也便于程序的设计。
在方块的控制方面,使用SetTimer函数,根据等级使用,(550-55*等级)的毫秒时间定时发送一个消息,过程函数接到消息之后然后让方块下落一行。与之相对应的是KillTimer函数,它将断开消息的发送到窗体过程函数中,因此,这个函数用来暂停程序的运行。
游戏开始时,首先要进行初始化,将游戏区的格子颜色设为-1(即黑色)。和初始化界面其他的内容。
第5章 详细设计
5.1总体设计
Win32下的游戏编程首先要基于有线编程的基本框架然后再在框架里面实现自己的游戏功能,完整的应用程序框架的分析。 游戏编程的主框架流程如下图5-1所示:
WinMain窗口专用队列鼠标单击消息。。。。键盘按键消息鼠标创建Windows类键盘注册Windows类创建窗口从队列中取消息窗体主事件循环发送消息事件处理器把消息处理后的结构发送到窗体 图 5-1主框架流程图
① WinMain(HINSTANCE,HINSTANCE,LPSTR,int)函数
WinMain()函数是整个函数的入口函数,程序的执行入口,前面往往会加上一个WINAPI这个声明符的作用是强制WinMain函数的参数从左到右传递。WinMain函数包含四个第一个参数是HINSTANCE是一个实例句柄是Windows为你的应用程序所产生的相当于Windows应用程序的一个名字,你也用使用这个名字让windows应用程序做你所指定的事情,第二个参数也是一个实例句柄,不过现在已经不使用了,第三个参数是 LPSTR,控制终止字符串,第四个参数是
一个int型,其作用是让用户决定打开一个窗口的方式.不过这个参数使用的也不多,往往被另外一个函数是代替。 ②InitCommonControls()函数
此函数的作用是初始化通用控件类库。 ③ RegisterClassEx函数
首先需要对窗体进行注册,注册的程序如下所示: 首先建立一个要窗体结构体对象 WNDCLASSEX wndclass 然后进行注册。
wndclass.hInstance = hInstance;
wndclass.lpszClassName = szClsName; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra wndclass.cbSize wndclass.style wndclass.hIcon wndclass.hIconSm wndclass.hCursor
= 0;
= sizeof(WNDCLASSEX); = CS_HREDRAW|CS_VREDRAW; = = NULL;
= LoadCursor(NULL,IDC_ARROW);
LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); RegisterClassEx函数的参数极其功能如下表5.1所示:
表 5.1 RegisterClassEx函数的参数和功能 名称 hInstance lpszClassName 类型 HINSTANCE LPCTSTR 说明 窗口句柄 用来保存 类的名字需要和创建窗口函数的雷鸣保持一致 指向事件句柄的函数指针(指向WndProc过程函数) 用来指示WINDOWS运行时间信息并保存到windows某些类单元之中,在游戏开发中没什么作用,一般设为0 lpfnWndProc WNDPROC cbClsExtra int cbWndExtra int 用来指示WINDOWS运行时间信息并保存到windows某些类单元之中,在游戏开发中没什么作用,一般设为0 cbSize style hIcon hIconSm hCursor hbrBackground lpszMenueName UINT UINT HICON HICON HCURSOR HBRUSH LPCTSTR 用于获取Windows窗口类的大小 窗口的类型 用来保存一个图标的句柄 指向一个窗口标题栏和windows桌面任务栏图标的一个句柄 用来保存一个光标的图标句柄 用来保存画笔的句柄 指向一个菜单的指针 注:MAKEINTRESOURCE(WORD )这是一个资源加载文件,加载已经装入程序的资源文件。相比直接使用Load类等函数来说,这个函数更加缩小文件的大小。
在注册完成之后再使用if语句来判断是否注册成功if
( !RegisterClassEx(&wndclass) )是否注册成功,如果注册成功就执行后面的创建窗口以及其他的一些功能,如果失败则调用 MessageBeep(0)来发出警报声。 ④CreateWindowEx(DWORD,LPCTSTR,LPCTSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)函数:
在本程序中用一个窗体句柄保存创建的
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE, szClsName,
\俄罗斯方块Win32版(刘新元专用版本)\WS_MINIMIZEBOX|WS_SYSMENU,
GetSystemMetrics(SM_CXFULLSCREEN)/2-370/2, GetSystemMetrics(SM_CYFULLSCREEN)/2-520/2, 370, 520, NULL, NULL, hInstance, NULL);
这个是创建应用程序的关键,此函数包含12个参数,包含了创建窗口所需要的信息
一个参数是DWORD双字节
CreateWindowEx函数的参数及其作用入下表5.2所示:
表 5.2 CreateWindowEx函数的参数极其作用表
类型 DWORD LPCTSTR LPCTSTR DWORD 值 WS_EX_CLIENTEDGE szClsName 说明 Windows风格本程序是下沉边框 窗体类名需和注册时保持一致 \俄罗斯方块Win32版(刘新元窗口的标题 专用版本)\WS_MINIMIZEBOX|WS_SYSMENU 说明窗口的外观和行为等之类,本程序包含最小化按钮 窗口在屏幕上显示的左上角位置的X坐标 窗口在屏幕上显示的左上角位置的Y坐标 窗体宽度 窗体的高度 指向父窗口的句柄,本程序没父窗口 指向属于所属的窗口的菜单的句柄 实例句柄 高级特性,一般在游戏编程中不会使用到故设置我NULL int int int int HWND HMENU HINSTANCE LPVOID GetSystemMetrics(SM_CXFULLSCREEN)/2-370/2, GetSystemMetrics(SM_CYFULLSCREEN)/2-520/2, 370 520 NULL NULL hInstance NULL 注: hwnd用于保存创建的窗口的句柄,GetSystemMetrics()函数用来获取屏幕的大小。
通过CreateWindowEx函数已经讲一个创立出一个窗口了,窗体所含有的信息都已经在函数中已经说明了。加下来的就是要将窗口显示出来。 ⑤ShowWindow(hwnd,iCmdShow)函数:
这个函数在CreateWindowEx()之后,用来显示所创建的窗口将其显示在桌面上。将在内存中的窗体显示出来。 ⑥ UpdateWindow(hwnd)函数:
这个函数在ShowWindow函数之后更新窗口,用来刷新客户区。
⑦WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)函数:
这个函数是Windows的过程函数处理消息队列中的信息,这是本程序的一个最主要的函数。包含窗体的创建消息,绘图信息,俄罗斯方块的控制信息等。主要包含以下的消息:
①WM_CREATE消息:创建界面信息和初始化信息,主要包含以下信息。 WM_CREATE消息的主要作用如5-2所示
创建界面控件工具栏状态栏游戏区外框浏览区外框数据初始化初始化方块位置初始化标志变量初始化游戏区初始化计分器背景音乐初始化图5-2 WM_CREATE消息
菜单栏和MFC类似直接在界面上定义操作就是了。
②WM_PAINT消息:游戏区绘制信息主要包含以下信息,包含了绘制游戏区,绘制方块,绘制浏览区,绘制提示语。如下图5-3所示
绘制游戏区绘制方块绘制浏览区绘制提示语 图 5-3游戏区绘制信息
③WM_TIMER消息:主要用于控制方块下落
此消息主要用于俄罗斯方块下落的控制,根据等级每隔不同的时间使用SetTimer函数发送一个消息,在接到消息之后方块就下落一格。 ④WM_DRAWITEM消息: 此消息主要用于绘制方向按钮。 ⑤WM_KEYDOWN消息:按键消息
此消息主要用来接收按键信息并处理按键信息: 按键消息处理过程如下5-4流程图所示:
消息队列接收到的按键信息处理方向键还是空格键空格键方向键游戏暂停丄键下键哪个方向?左键右键方块旋转加速下落方块左移方块右移
图 5-4按键消息处理过程流程图
⑥WM_COMMAND消息:控制消息
此消息是系统控制消息,用于处理系统控制消息,在本程序中主要包含以下信息。
WM_COMMAND消息包含的信息如下表5.3所示:
表5.3WM_COMMAND消息的参数极其作用
消息 IDM_STOP IDM_NEW IDM_PAUSE IDM_EXIT IDM_ABOUT IDM_HELP IDM_MUSIC1 IDM_MUSIC2 IDM_MUSICOFF IDM_LEFT IDM_RIGHT IDM_UP IDM_DOWN
类型 菜单 菜单 菜单 菜单 菜单 菜单 菜单 菜单 菜单 菜单 菜单 菜单 菜单 作用 游戏结束 开始新游戏 游戏暂停 游戏退出 打开ABOUT对话框 打开帮助对话框 调用背景音乐1 调用背景音乐2 关闭背景音乐 发送按下左键的消息 发送按下右键的消息 发送按下上键的消息 发送按下下键的消息 ⑦WM_CLOSE消息:关闭窗口 此消息处理时调用
⑧WM_DESTROY消息:从内存中退出程序
此消息处理时调用 PostQuitMessage(0),从内存中删除此程序,让其不占用宝贵的内存资源。
5.2创建界面的主框架
主要的界面如5-5所示
图5-5主界面图
游戏界面的主框架主要有菜单栏,状态栏,工具栏,游戏区,预览区,游戏信息记录区,方向键等几个部分组成。
①菜单栏:和MFC类似在界面上直接定义参数和增添一些功能。 菜单栏如图5-6所示
图5-6菜单栏
②状态栏:用于提供玩家最新信息等。
开始前提示信息如图5-7所示
图5-7状态栏
③游戏进行中提示信息如5-8所示
图5-8提示信息栏
状态栏的创建:
hStatus = CreateStatusWindow( WS_CHILD|WS_VISIBLE, NULL, hwnd, IDS_STATUSBAR); SendMessage(hStatus,SB_SETPARTS,2,(LPARAM)(stWidth));
④ 工具栏:工具栏的作用主要是为了便于鼠标的操作。工具栏如图5-9所示
图5-9工具栏
工具栏的创建: CreateToolbarEx( hwnd, //hwnd 父窗口句柄 WS_VISIBLE|WS_CHILD|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|CCS_NODIVIDER, //工具栏风格 IDR_TOOLBAR1, 6, hInst, IDB_BITMAP1, tbButtons, 8, 16, 16, 16, 16, sizeof(TBBUTTON)); 工具栏下的黑线: CreateWindow( TEXT(\ //lpClassName 类名 NULL, //lpWindowName 标题 WS_CHILD|WS_VISIBLE|SS_BLACKFRAME, 1,24, 358,1, hwnd, NULL,
hInst, NULL); //lpParam 额外的参数
⑤游戏区:游戏区的格子用一个数组表示int Matrix[19][10] 绘制Matrix矩阵: for ( m=0; m<=18; m++ ) { for ( n=0; n<=9; n++ ) { if ( Matrix[m][n] == -1 ) { PatBlt(hdc,20+n*20,40+m*20,20,20,BLACKNESS); } else { SelectObject(hDcBitmap,LoadBitmap(hInst,MAKEINTRESOURCE(120+Matrix[m][n]))); BitBlt(hdc,20+n*20,40+m*20,20,20,hDcBitmap,0,0,SRCCOPY); } } }
⑥预览区:用来显示将要出现的方块。预览区如图5-10所示
图5-10预览区
CreateWindow( TEXT(\ NULL, WS_CHILD|WS_VISIBLE|SS_GRAYFRAME, 237,37, 106,106, hwnd, NULL, hInst, NULL);
⑦游戏信息记录区:用于记录游戏进行情况,和最高成绩,这部分是一个控件的创建出来的。游戏信息记录区如图5-11所示
图5-11游戏信息区
hTemp = CreateWindow( TEXT(\ TEXT(\最高分\ WS_CHILD|WS_VISIBLE|SS_LEFT, 240,280, 36,12, hwnd, NULL, hInst, NULL); SetNormalText(hTemp,FALSE); hSorceMax = CreateWindowEx( WS_EX_STATICEDGE, TEXT(\ NULL, WS_CHILD|WS_VISIBLE|WS_GROUP|SS_RIGHT|SS_CENTERIMAGE, 280,276, 60,18, hwnd, NULL, hInst, NULL); SetNormalText(hSorceMax,FALSE);
⑧方向键:用于鼠标控制方块的移动和变形。方向键如图5-12所示
图5-12方向键
CreateWindow( \ NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW, 280,340, 26,26, hwnd,
(HMENU)IDM_UP, hInst, NULL);
同理其他的也是一样只是坐标和IDM_UP不同而已。
5.3正常流程的设计
正常流程如图5-13所示
开始数据初始化背景音乐初始化消息循环等待按键按下键盘按下的是左/右键判断键盘的虚拟码按下的丄键空格键越界?NOYES方块下落方块变形不响应YESNO保存当前方块YES碰到方块?按下的是丄键按下的是下键越界?NO游戏暂停方块下落方块左移不响应YES保存当前方块碰到方块?NO方块加速下落游戏继续运行再次按下空格 图5-13游戏的正常流程图
5.4中断操作流程的实现
游戏的中断在俄罗斯方块中是很重要的一个方面,不过其实现起来很简单通过调用Windows API函数KillTimer就可以断开窗体与键盘的联系,让SetTimer函数不起作用,系统由于没有接收到SetTimer函数发的消息,故程序一直保存在原有的状态。
程序的中断和继续:
void GamePause(HWND hwnd) {
if( bGOver ) return; if ( bStart ) { \
} else { ^-^\
}
bStart = !bStart; return; }
中断操作流程图如图5-14所示
TetrisMusic(TRUE);
SetTimer(hwnd, 1, (550-55*iLevel), NULL);
SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)TEXT(\游戏中 TetrisMusic(FALSE); KillTimer(hwnd, 1);
SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)TEXT(\游戏暂停
按下暂停游戏结束?NOYES不响应bStart标志是否为1YESNO游戏暂停游戏继续bStart取反
图5-14中断流程图
5.5结构设计
方块的设计,方块定义在一个数组Tetris[7][4]中,包括其旋转后的数组Tetris[7][4]中。方块在下落时,初始化数组Tetris[7][4]将其颜色设置为-1,然后调用BitBlt将其设置为黑色(即成了黑色背景),方块下落时,需要动态的修改位置,并擦除原来的位置,使用 RandomBlock函数来随机产生三个数字,
游戏的越界判断:本程序中的越界是通过预览区,产生的方块得到数组的坐标,然后根据下个将要到达的区域是否在游戏区中Tetris[i][j].a.x+x<0 || Tetris[i][j].a.x+x>9 || Tetris[i][j].a.y+y>18,四个方块都需要判断,在下落之后如果遇到已经保存下来的方块就立即保存下来。DropTetris是方块下落的函数,首先要判断其是否下落后是否会越界?若不会发生越界就下落。并擦除刚才的位置
的方块。
5.6 功能的完善
本毕业设计总的说来功能是比较齐全,性能也比较完善,游戏是欠扁万化的和个人的能力有限,因此,本文的后续工作需要在以下几个方面进一步开展研究:
①方块不限于四个小方格,而是动态的随机产生的几个方格。 ②形状不限于方块,三角形,四边形等其他的形状。 ③界面不是很完美
第6章 系统测试
6.1初始界面测试
①初始界面测试如图6-1所示
图6-1游戏初始化
测试结果与预期相符。 ②游戏加分如图6-2所示: 游戏运行界面如下
图6-2游戏加分
结果与预期相符合
③游戏升级如图6-3所示: 游戏运行界面如下
图6-3游戏升级
结果与预期想符合 游戏结束如图6-4所示 游戏运行结构如下
图6-4游戏结束
结果与预期相符合
第7章 总 结
7.1总结
通过本次毕业设计,严格按照软件工程的基本方法,使我对软件开发的步骤有了更深一步的了解,对游戏开发的基本过程有了一定的了解,虽然只是个小游戏,但对我以后开发游戏可谓是有了质的飞跃。
通过本次游戏开发使我对游戏开发的基本流程有了一定的了解,本人在本次基于win32游戏开发中总结游戏开发的经验主要包含以下几个方面:
①基于win32下游戏开的基本框架。 ②游戏界面的设计和布局。
③游戏过程中的系统消息处理过程。 ④游戏过程中游戏自身的处理过程。
7.2展望
总的说来,游戏是欠扁万化的和个人的能力有限,因此,本文的后续工作需要在以下几个方面进一步开展研究:
①方块不限于四个小方格,而是动态的随机产生的几个方格。 ②形状不限于方块,三角形,四边形等其他的形状。
参考文献
[1]Ben Sawyer. 游戏软件设计与开发指南[M].人民邮电出版社,1998 [2]钦科技. Visual C++游戏设计[M]. 北京:科海电子出版社,2003 [3]坂本千寻.Visual C++专业游戏程序设计[M].中国铁道出版社,2004 [4]求是科技.Windows _API程序设计参考大全.人民邮电出版社 , 2006 [5]辛长安.王颜国Visual.C.权威剖析--MFC的原理、机制与开发实例.清华大学出版社 2008.5
[6]王艳平.windows程序设计(第2版).人民邮电出版社,2008.1 [7]罗伟坚.VISUAL C++经典游戏程序设计.人民邮电出版社,2006 [8]侯杰.Windows 核心编程,人民邮电出版社,2007 [9]中国计算机网.游戏编程指南.中国计算机网,2003 [10]More Eaffecitve c++ ,Scoot Meyers 2002
致 谢
本次游戏开发过程中得到卿武明老实的鼎力帮助和监督并耐心的知道才得以完成本次游戏设计。其次要感谢几个亲爱的同学在我遇到困难时对我的耐心的介绍需要用什么函数和函数的作用,并给予极大的鼓励,还要感谢我的几个编程高手网友,给了我一些建议,让我少走了很多的弯路,才使我得以使我的设计提前完成。祝福帮助过我的人在以后的工作中工作顺利,事业有成。和感谢李湘辉妹妹帮我翻译成英文,本人水平有限希望帮助我的人以后再我学习过程中遇到麻烦时能再次帮助我。大家相互学习,共同成长。