宋雅娟,边 晶
(1.苏州市职业大学 计算机工程学院,江苏 苏州 215104;2.长春大学 计算机科学技术学院,长春 130022)
C语言是计算机基础性程序设计语言,它的发展贯穿了计算机发展的历程,它蕴含了程序设计的基本思想,是理工科高等院校的一门基础课程[1]。一直以来,C语言教学都是围绕语法知识这个主线展开,按照顺序结构、选择结构、循环结构的顺序来学习程序结构,这种线性教学模式可以循序渐进地把教学内容传授给学生,但是很难锻炼学生的整体编程思维。学生长期反复地学习基础知识和经典算法,虽然可以读懂和编写简单的程序,但很难形成对编程的兴趣,也没有自主思维和实践创新的意识[2]。王洋在《Java就该这样学》一书中提出一种以玩游戏的方法来玩代码的思路,借助Java的图形类库引导学生设计自己的小动画,小游戏[3]。标准的C是没有图形库的,图形库都是第三方的扩展,比如TC2.0的graphics.h等等。但目前C语言的教学实践环境主要是在VC环境下进行,而VC下制作图形程序需要使用MFC或者OPENGL,增加了学习的难度。如果能找到在VC环境下制作图形程序的一种方便的库,设计适合的案例引导学生掌握图形程序设计方法,把原来的语法知识融入案例的开发过程中,同时鼓励学生开放想象力自行设计自己的动画,必能激发学生学习C语言编程的兴趣,提高自主思维和实践创新的意识。easyX图形库正是这样的一种工具,它融合了VC方便的开发平台和TC简单的绘图功能,可以帮助C语言初学者快速上手图形和游戏编程[4]。easyX可以从网上下载,安装简单。本文以easyX开发的一个简单案例为线索来设计C语言程序设计课程的教学方法。
easyX是针对C++的图形库,可以帮助C语言初学者快速上手图形和游戏编程。比如,可以用VC + easyX很快地用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法等等[4]。
easyX图形库主要提供了用于绘制图形的常用函数库及相应的头文件。使用easyX非常简单,只要下载文件夹,将其lib文件夹和include文件夹内容分别拷贝到Visual C++的include和lib文件中即可。
在使用easyX提供的函数前需要使用initgraph(640, 480)对屏幕进行初始化,设置显示屏幕的大小,结束后使用closegraph()函数关闭。
easyX主要提供了颜色设置、绘制图形、输出文本等函数。其中前景颜色设置函数为setcolor,如果要将前景色设置为红色,可使用预定义颜色setcolor(RED)或使用RGB颜色setcolor(0xff0000)。填充色设置函数为setfillcolor。可以结合画笔程序对照easyX提供的库函数帮助学生理解函数的意义和用法。画笔程序提供的画图工具如图1所示。
下面列出几个常用于绘制图形的函数:
(1)void circle(int x,int y,radius):以指定的x,y坐标为圆心、radius为半径画圆,对应于画笔程序里的画空心圆的工具。
(2)void fillellipse(int left,int top,int right,int bottom):以left,top为椭圆外切矩形左上角坐标、right,bottom为右下角坐标绘制具有指定填充色的椭圆。
(3)void rectangle(int left,int top,int right,int bottom):以left,top为矩形左上角坐标、right,bottom为右下角坐标绘制具有矩形。
(4)void moveto(int x,int y):将光标移动到坐标x,y 处。
(5)void lineto(int x,int y):从光标所在处画一条直线到坐标x,y处,对应于画笔程序里的画直线工具。
(6)void polygon(const POINT *points,int num):画多边形。
easyX中在指定位置输出文本的函数是outtextxy(int x,int y, LPCTSTR str),可配合settextcolor和settextstyle在屏幕上输出不同颜色和字体的文字。
在实践过程中可结合应用C语言其它的库函数来完成动画效果,比如用随机函数rand()来获得随机值,用Sleep(int time)来使程序进行休眠。
结合1节介绍的函数制作一个动画程序应用案例,程序部分运行效果如图2所示。
图2 不断上升的气泡
程序运行时,屏幕上出现一个640×480的窗口,背景色为天青色模拟鱼缸中水的颜色。水中出现50个大小不同、位置不同的白色气泡。每个气泡都以缓慢的速度在上升,当气泡接触到上边沿时消失,从下方同样横坐标的位置重新出现,重复上升过程,循环往复。这个程序中涉及了顺序结构、循环结构、选择结构、函数、结构体、数组等C语言语法[5]内容。此程序案例作为一个基础,在此基础上可以增加水草、鱼等更多水里不同的生物以及不同的运动方式。也可以继续在此基础上增加鼠标、键盘等处理方法形成人机互动的游戏效果。在实践过程中有学生以此实现大鱼吃小鱼的程序、天空落雨、景物变化等种种不同的动画效果。
easyX用于开发图形案例、动画案例甚至游戏都比较容易上手,在教学过程中首先寻找已有的动画案例,向学生展示动画效果,使学生对C语言的学习结果产生向往。之后,提取出常用的几个函数,简单地向学生讲解一下函数的含义和调用方法。教师使用自行设计的小而全功能的案例在课堂上首先快速开发出原型程序,让学生体会easyX的易用性,激发学习动力。之后,课程即以案例为主线,在开发案例的过程中穿插讲解相关理论知识。
在初始窗口中绘制一个鱼缸及水底一气泡。
(1)图形界面初始化。可通过下面的图形函数进行初始化,运行界面如图3所示。
initgraph(640,480)。
图3 设置初始窗口
当图形绘制结束后,可用图形关闭函数closegraph()进行关闭。
(2)绘制特定颜色图形。例如在特定背景色下绘制特定颜色实心圆,如图4所示。
图4 天青色背景下的指定位置的白色实心圆
initgraph(640,480);
setbkcolor(CYAN);
cleardevice();
setcolor(WHITE);
setfillcolor(WHITE);
fillcircle(300,450,30);
getch()。
上述代码可以让学生了解C语言中的函数调用方式及顺序结构的使用方法。
(3)学生自由绘制。让学生自行学习“帮助文件”,绘制出不同大小、不同位置的圆及其它组合图形。
在基本图形的基础上,结合变量及循环结构的使用,使图形复杂化。
(1)讲解for循环常规语法知识及变量使用。
(2)重新设置圆的坐标及大小为变量值。
(3)使用循环重复在屏幕上画圆,使得后产生的圆都在原来图形位置偏上一点,并且变大一点,如图5所示。
图5 引入循环结构后的多个不同圆的绘制
(4)引入Sleep()函数保持画面稳定。
(5)引入使用背景色重画原图实现擦除原图形效果,从而形成动画效果。
(6)学生自行实践如何使自己设计的组合图形上下左右移动的效果。
此部分可以让学生理解循环结构的作用,学习循环结构的语法知识。还可以引导学生以此为基础设计自己需要的图形及动画效果。
通过案例展示,如何用“选择结构”处理图形绘制过程中的边界问题及事件触发问题。
(1)讲解if…else选择结构的基本语法。
(2)使用选择结构处理不断上升的圆上越界的情况,当上越界时让实心圆从下方重新以原有大小位置出现。
(3)引入鼠标处理方法,完成当鼠标点击到图形内部时图形消失功能。
此部分可以让学生理解选择结构的作用,学习选择结构的语法知识,并引导学生以此为基础设计自己需要的图形及动画效果。
通过案例展示,如何用数组对图形进行批处理。
(1)让屏幕上出现多个不同横坐标的圆,纵坐标及大小保持相同。
(2)引入一维数组实现多个圆的同时存在、同时上升变化等,如图6所示。
图6 引入数组后的多个不同气泡在屏幕上变化效果
(3)使用一维数组保存各个圆的消失和存在状态,当鼠标点击到某个圆时该圆的标志为消失状态。
引入数组后可让学生理解批量数据的使用,在此处即可引导学生制作第2节中案例的多个不同位置的动画形式气泡。
用案例展示如何用“结构体”绘制一批形态各异的气泡。
(1)结构体基本语法讲解。
(2)使用结构体保存各个圆的圆心坐标及半径。
(3)改变程序为各个不同位置及大小的圆。
(4)自定义函数来进行圆的绘制与擦除。
可参考如下代码进行讲解:
void drawcircle(COLORREF color,struct circle mycircles[])
{ int i;
for(i=0;i<50;i++)
{
setcolor(color);
setfillcolor(color);
fillcircle(mycircles[i].x,mycircles[i].y,mycircles[i].r);
}
}
用文件方式保存程序结束时各个圆的状态,在程序运行时打开文件,取出上一次状态,再现前景。
在课程进行过程中,还可以采取各种方式鼓励学生创新,如举办作品展及作品PK等方式激发学生不断发挥潜力,完善自己作品。
随着计算机的发展,计算机编程语言的学习已经越来越普及,目前不只大学生学习计算机语言,中小学生的计算机编程课堂也越来越活跃。因而编程课程越来越需要行之有效并且趣味性强的教学方法。在C语言程序设计课堂应用easyX图形库开发动画程序案例比较符合教学需求。笔者在自己的C语言课堂尝试使用这种方法,提高了学习兴趣,激发了学生的创作欲望,从而以玩游戏的心态来玩代码,学习效果比较明显。当然,为了取得更好的教学效果,还需要编写适合的教材、改革考核方式,这是在以后的教学工作中需要进一步尝试的内容。