沈宫新
(南京化工职业技术学院,江苏南京 210048)
C 语言与C++语言是不少高校广泛开设的课程,从C 语言到C++语言的学习转化是一个艰难的过程,因为在这其中要实现结构化程序设计向面向对象程序设计的转化,同时,操作系统的环境也有很大的不同,增大了教学的难度。为了说明结构化程序设计与面向对象程序设计的不同之处,同时简单了解WINDOWS 的基于消息的编程思维,我们将DOS 下用C 语言编写的贪吃蛇小游戏改编为C++编写,用面向对象的思想来组织,用类来封装,在 WINDOWS 下以窗口形式运行WIN32 的应用程序。
贪吃蛇小游戏包括注释不到200 行,是一个经典的游戏案例,能够较好说明结构化编程的思想。主函数包括四块,第一块是初始化图形系统,在TURBO C 中包括图形库的引用,对应显卡驱动的适配,进入TURBO C 的图形开发方式。第二块是初始化游戏界面,设定游戏的范围在围墙中,并显示围墙。第四块是退出图形模式,响应用户任意键退出游戏。游戏的主要部分在第三个模块中实现,包括随即产生和显示食物,蛇的产生、显示和移动。蛇的三种情况的判断,包括蛇吃食物,蛇会增长,蛇碰墙或蛇首尾相碰,蛇死退出游戏。整个小游戏的流程并不复杂,但对初学者还是有一定难度。
由于前面的小游戏是在DOS 下通过调用TURBO C 的图形库(GRAPHICS.LIB)来实现图形工作方式的,而我们学习C++一般采用的是VC++6.0 的开发环境,该环境不支持图形库(GRAPHICS.LIB)。这使得很多DOS 下的C 语言游戏代码在VC++6.0 中不能通过编译,我们只能使用WINDOWS API 函数来完成图形的绘制,要求在预编译时包含“WINDOWS.H”,这样就可以调用大部分的API 函数,同时要熟悉WINDOWS 图形编程中用到的设备上下文DC(DEVICE CONTEXT),包括创建 DC,创建画刷,创建画笔。
在C 语言结构化编程中,代码是顺序执行的,有固定的次序。在WINDOWS 消息驱动的工作方式下,我们为不同的消息准备了不同的处理模块,在程序运行时,程序一旦初始化结束就进入等待消息状态,依照不同的消息来触发不同处理顺序,没有固定的执行次序。程序通过接受特定消息来结束程序的运行。
(1)VC 工程的建立。在 VC++6.0 建立WIN32APPLICATION 工程,选择建立典型的“HELLO WORLD”应用,可以让VC 的开发环境为我们自动生成框架代码。包括WINDOWS 系统下的主函数和回调函数,要做的就是添加和改写代码,来实现自己的功能。进入主函数后,在创建窗口类时改写窗口的外观、背景和光标等样式。然后,注册刚刚创建的窗口类,显示窗口,进入WINDOWS 消息循环。
(2)对象化的改造。在DOS 下蛇和食物都是结构体,在 WINDOWS 下改造成类和对象来实现。食物的改造比较简单,原来食物的结构体包括食物出现的横、纵坐标和食物显示、隐藏的一个BOOL 值,现在的食物类中不仅要包括上述变量,还要包括对食物的操作,主要有食物的显示方法和隐藏方法,通过传递当前的DC 句柄结合食物的位置来显示和隐藏。食物显示位置通过随机函数在围墙内生成,食物隐藏发生在蛇吃掉食物后,在蛇的运动过程中存在判断是否吃到食物的情况和是否要重新生成食物,而类的封装特性不允许直接访问类的成员变量,即成员变量一般设置为私有属性,因此在食物类中有对应的方法来访问和设置到上述属性。而蛇的改造要稍显复杂,原来蛇的结构体包括两个整形的数组,分别存储蛇每节的横、纵坐标。另外三个整型的变量分别存贮蛇的节数,蛇的移动方向和蛇的生命状态。在构造蛇类中可以把上述结构体内的成员改写成类中的私有成员变量。在类的构造函数中设定蛇的初始位置、节数、移动方向。蛇的运动中要判断是否吃到食物,需要有方法得到蛇头的坐标和改变蛇的节数的方法。蛇也要有显示自身的方法和通过隐藏来显示蛇运动效果的方法。蛇碰墙或蛇头碰蛇尾蛇会死,蛇类中要有改变蛇生命状态的方法。
(3)定时器的使用。DOS 下的蛇的运动间隔通过调用“DELAY”函数来实现,在 WIN32APPLICATION中通过设定定时器和响应定时事件来实现。首先在 WM_PAINT 消息来时实现游戏界面初始化,初始化结束设定定时器,在定时器事件触发时,来实现蛇的移动的吃食等情况的判断处理。
(4)蛇的运动控制。蛇的运动分为自动和手动,DOS 下的蛇的自动根据实时的方向来移动,手动通过调用“BIOSKEY”函数接受键盘消息改变蛇头移动方向。在WIN32APPLICATION定时事件响应中来实现自动,在键盘的按下或弹起事件中接受键盘消息改变蛇头移动方向。
上述要点还有待同学们在实际改造中认真领会,老师加以引导。在本案例的基础上可以进一步扩充,让同学们进一步认识到面向对象编程的特点和优势,比如食物可以设定不同颜色来设定蛇吃到食物加分分值。分别在DOS 下的结构化的C 代码中改写,和在 WINDOWS 下的面向对象的C++中改写,并加以比较。复杂一点的,可以对蛇的外观和运动方式加以修改,再加以比较。
案例教学已经是计算机教学的趋势,在C++教学的结束之时,通过一个小游戏的改编,一方面可以提高同学们编程的兴趣,另一方面可以进一步强化面向对象概念和思想。虽然本案例使用的是VC++的开发环境,但是在转化过程中并不涉及MFC 框架的使用,可以作为面向对象的WINDOWS 开发的入门案例。
1 候俊杰.深入浅出 MFC [M].武汉:华中理工大学出版社2001 ,5
2 杨正校.新概念车C 语言程序设计 [M].南京:河海大学出版社 2008 ,5
3 熊歆斌.Visual C++程序设计培训教程 [M].北京:清华大学出版社.2002 ,7