俄罗斯方块是个老幼皆宜的小游戏,在游戏设计界就好比高深武功的入门起手式。无数人进入游戏编程的世界都是从编写俄罗斯方块游戏开始的,因为这既是一个检验RAD开发工具的好方法,也是检验一个人对开发语言、环境和基本数据结构知识熟练程度的便捷途径。
让我们来看看如何使用C#语言在.NET平台上生成俄罗斯方块游戏。当你完成时,会发现编程竟如此简单,而自己在不知不觉中已跨入了它的大门。
所需条件
我们需要一些语言本身不直接提供的能力,首先,必须能够在屏幕的任何一个位置画东西,其次要能够立即得知用户按了哪一个键。如果第一个条件不能满足的话,你将很难看到一个完整的游戏进行状态图。而如果无法实现第二个条件,恐怕玩起来就必须不停地“按一个键→回车→按另一个键→再回车”,有多麻烦。
我们使用Visual C#就能完全满足要求。
游戏的功能定义
知道了基本条件,就可以开始设计游戏了,编写者必须对俄罗斯方块游戏的规则进行严格的描述。可以这样定义:屏幕上有一个X列Y层的区域,计算机自动产生多种不同类型的方块,并出现在区域的最顶端;然后每过一个固定时间间隔向下落一层,玩家可以使用键盘控制方块向三个方向移动和顺逆时针旋转90度。不过前提是方块移动和旋转后的位置必须是空的。当方块落到区域底部或者另一方块之上将停止移动,然后新的方块会产生。当新方块无处放置的时候:GAME OVER。
设计游戏的逻辑
首先是定义游戏相关的数据存储方法,分为两个主要的部分,一个是当前的方块,需要保存位置、当前的旋转状态;另一个是屏幕区域的状态,这可以用一个二维数组来表示。
我们还需要:
按键分析模块:分析得到按键的含义,做出响应;响应模块:“左”、“右”、“下”、“移动”和“旋转”几个模块,负责改变当前方块的状态数据;画方块模块:位置移动后,把方块画到新的位置之上;检查模块:在每次状态改变之前,对方块企图占用的区域加以检查。如果无处可放,则此次移动失败。如果方块到底了,应该固定在当前位置,这可以调用前面的画方块模块实现,同时再产生一个新的方块。这样还需要写一个产生新方块的模块。还有当每次方块到底的时候,都需要检查一下是否有新的层排满了,如果有的话应该消层。这就又需要写两个模块,检查是否排满和消层。产生新方块时也需要检查其产生的位置,如果这个位置已被占用。那怎么办?猜对了:GAME OVER!这需要调用前面的检查模块实现。
到了这里游戏逻辑就差不多了,但是等等,好像少了点什么。啊哈,我们忘了俄罗斯方块也是会自动下落的,可以检查系统时间,规定过一个指定的时间间隔就调用一次方块下落模块。
在Visual C#上的实现
由于Visual C#使用非常方便,几乎不需要额外的知识就可以完成这个游戏。
进入Visual Studio.net后,在事件栏里双击KeyDown,就会自动产生一个方法。我们在里面只要填写几行代码,就可以判断按键到底是什么(如图1)。
图1
在旁边的工具箱的组件栏里面选中Timer,添加到窗体里面。这是定时器,修改Interval属性可以更改定时间隔。在时间栏里双击Tick,产生一个方法。每隔一定时间间隔这个方法就被调用一次(如图2、图3)。
图2
图3
在程序中,可以使用Canvas对象的FillRectAngle方法实现画一个矩形。而用区域的底色再画一次就是擦除方块了。画方块的代码如下:
Graphics canvas = Graphics.From-
Hwnd(frmMain.handle);
SolidBrush fillBrush = new SolidBrush(填充颜色);
canvas.FillRectangle(fillBrush, 横坐标, 纵坐标, 长, 宽);
|
其他自己实现的模块可以加为窗体对象的方法。至于变量也可以设计成窗体的域。如果你不熟悉C#的语法,不用担心,可以使用向导功能,Visual Studio.net会自动加入你所需要的东西。
关于实现还有更多的细节。通过自己的努力来解决这些问题并不难,还可以获得意想不到的乐趣,在此笔者就不赘述了。
更深入一些
使用Visual C#几乎可以做出一切东西来,从即时战略到三维RPG游戏。当然还有各种应用软件了。如果想开发出更复杂的游戏,还需要学习更多的东西,为了提高显示速度,需要使用DirectX,为了制作3D图像,又要使用Direct3D。由于游戏的流程和内部原理很复杂,所以需要学习数据结构、图形学、操作系统……
学习这么多专业知识需要很大的努力,不过如果心中有一个梦想,那么再难的目标也能实现。“千里之行,始于足下”,尤其是在迈出了俄罗斯方块的第一步之后,你实际上已经走进了软件开发,尤其是游戏开发的大门,前面的世界是美丽多彩而又充满挑战的。 |