APP下载

EasyX图形库在C语言项目化教学中的探索

2023-03-24陈兵王雪梅

电脑知识与技术 2023年4期
关键词:项目化教学C语言教学研究

陈兵 王雪梅

关键词:C语言;EasyX;项目化教学;教学研究;弹球游戏

1 引言

C语言是大学理工科专业的必修课,是编程的入门课程,为学生的编程实践和计算机理论打好基础。在编程语言教学中,项目化教学的重要性越来越被认识到,但是由于C语言是偏底层语言,C语言开发环境不像开发Java程序那样自带图形、界面等一些库,因此用C语言编写应用并不非常方便,这就为在C语言教学中开展项目化教学带来了困难[1]。

2 EasyX 图形库

EasyX是一个可以用C、C++语言进行编程的免费绘图库,可以帮助C/C++ 初学者快速上手图形和游戏编程。如官网介绍的那样,“EasyX Graphics Library 是针对Visual C++ 的免费绘图库,支持VC6.0 ~VC2022,简单易用,学习成本极低,应用领域广泛。目前已有许多大学将EasyX 应用在教学当中。”简言之,EasyX有如下特点:

1) EasyX安装简单,对包含VC6.0之后的VC各版本都支持。

2) EasyX使用简单,利用简单的绘图函数和如颜色、坐标几个绘图相关的基本概念就能编写图形和游戏程序。

可以说,EasyX库的绘图功能是基础且充分的,对语言初学者很友好,让初学者可以专注在编程语言课程知识上,不被绘图部分牵扯太多精力。利用EasyX 编写包括游戏类的程序可以激发的学生的学习兴趣。因此,利用EasyX 图形库编写图形、游戏,是C 以及C++语言进行项目化教学非常合适的工具[2]。

3 项目案例

下面,介绍一下对项目设计的总体思考。常见的游戏项目有井字棋[3]、贪吃蛇[4]、碰撞的球等,由于碰撞的球总体难度相对较低,而且在MDN(Mozilla 开发者社区)等教程中也被使用,故本文就以碰撞的球项目为例。

由于一下子将项目的整个内容呈现在学生面前可能加大学生的接受难度,因此可以将项目分为基础项目和强化项目这样两阶段的形式。基础项目难度较低,强化项目在基础项目的基础上增加一些功能,并增加实现难度。比如,基礎项目的形式是提供代码片段,让学生整合代码,强化项目可以提高更少的代码,让学生自己补充部分代码。基础项目和强化项目合起来基本涵盖了C语言的主要语法,包括选择、循环、数组、函数、指针、结构体等。基础项目和强化项目可以分前后两个阶段,在学期末作为个人或者分组项目作业布置到班级中去。

比如,对于碰撞的球项目来说,基础项目是实现碰撞的球。即多个灰度不同的球(随机产生的)在窗口中以不同的速度运动(随机产生水平和竖直运动速度),碰到窗口边框就反弹,两个球之间相互碰到则将它们的灰度都变成一样的(随机产生的)。基础项目应用到了选择、循环、数组、函数等知识点。(为了方便打印,各个球的颜色是R、G、B分量都相同的灰色,也完全可以是R、G、B不同的彩色)

而强化项目,在基础项目的基础上,再实现一个用键盘控制的特殊的球(下图中白边的小球,可以进行水平移动和竖直移动)来“吃掉”其他的球,即碰到其他的球就让被碰到的球消失。强化项目要用键盘控制白色小球,因此还用到了EaysX的peekmessage函数来接收键盘按下事件,该函数的参数还用到了指针和结构体。故与基础项目一起,整个项目基本涵盖了C语言的主要知识点。

由于基础项目和强化项目涵盖了C语言的大部分知识点,因此需要在期末推出项目。如果希望尽早在教学中引入项目,比如在教授完选择和循环后就希望推出项目,那么可以另行采用其他项目,或者采用碰撞的球的简化版本,比如,实现单个球的碰撞,这样就不需要使用类似数组这样课程偏后面的知识点。单个球的碰撞项目,仍然可以采用基础项目和强化项目这样的两阶段的形式。比如,基础项目是实现单个球的碰撞到边缘的反弹,任务提供代码片段,学生只需要代码整合;而强化项目是反弹模式发生变化,比如碰到左边缘,从右边缘出来,反之亦然,并且只提供部分代码。这样难度就有阶梯。项目案例从易到繁,迭代式地引入课堂中,也是类似五星教学法所推荐的模式[5]。

3.1 碰撞的球之基础项目

下面给出期末版本的基础项目的各个子任务的例子,以做参考。

1) 给出代码框架,并做出解释。

#define BALL_NUMBER 20

#define WIDTH 640

#define HEIGHT 480

int random(int min, int max);

int main(){

int x[BALL_NUMBER] = {0}, y[BALL_

NUMBER] = {0}, radius[BALL_NUMBER] = {0}, velX

[BALL_NUMBER]={0}, velY[BALL_NUMBER] = {0};

COLORREF color[BALL_NUMBER] = {0};

int i = 0, j = 0;

//初始化动画窗口,并设置大小

initgraph(WIDTH, HEIGHT);

//使每次的随机数序列不同

srand((unsigned) time(NULL));

//初始化圆球

...

//核心动画代码

...

closegraph();

return 0;

}

int random(int min, int max){

return rand() % (max - min + 1) + min;

}

其中,BALL_NUMBER 是定义球的数量的宏,WIDTH 和HEIGHT分别是定义窗口宽和高的宏。x、y、radius、velX、velY和color数组分别保存圆球的x坐标、y坐标、半径、x方向的速度、y方向的速度和颜色。random函数随机产生在两个参数min和max的之间的整数,在后续的任务中被用到。

2) 初始化圆球处补充代码:

for(i = 0; i < BALL_NUMBER; i++){

radius[i] = random(10, 20);

x[i] = random(0 + radius[i], WIDTH - radius[i]);

y[i] = random(0 + radius[i], HEIGHT - radius[i]);

velX[i] = random(-5, 5);

該代码随机产生一定范围的整数值,用来初始化各个圆的半径、x坐标、y、坐标、x方向速度、y方向速度、颜色值。其中RGB是EasyX库的带参数的宏,用于将红、绿、蓝颜色分量合成颜色。代码中这3个分量都相同,产生的是灰色。

3) 核心动画代码处框架如下:

上面代码中4个if分别判断各个圆球是否与右、左、下、上四个边缘发生碰撞,如果发生,则相应修改圆球的移动速度属性,这样动画中就有边缘碰撞引起的反弹效果。

6) 绘图代码处继续补充代码,做圆球之间的碰撞检测

双重循环检查任意两个不同的圆球是否发生的碰撞,一旦发生碰撞,则将碰撞的两个圆球都设置成一个随机产生的新颜色。

以上就给出了完成基础项目的6个子任务。这6 个子任务的代码都是提供出来的,学生只要将各个任务代码整合就可以完成这个阶段。这样项目难度就降低了。可以根据实际情况增减难度,比如可以去掉部分核心语句,要求学生补充。显然,这是与学生水平相关的。强化项目阶段可以比基本项目再适当增加难度。

3.2 碰撞的球之强化项目

强化项目在基础项目的基础上,使用了一个独特的白色无填充的球来“吃”其他普通的球,这个白球可以用键盘进行上下左右移动控制,因此比基础项目在难度上有所提高。

在强化项目任务单中,可以和基础项目类似地给出框架和代码,如果要增加难度,那么部分代码可以让学生来补充。代码框架如下:

相比基础项目,强化项目为多个普通碰撞球添加了一个标志是否存在的数组exists[BALL_NUMBER],数组每个元素表示对应的普通球是否已经被白球“吃”掉,初始化为1,表示还存在,被“吃”掉后则修改为0。键盘w、s、a、d按下分别控制白球的上、下、左、右移动,EasyX中需要使用peekmessage函数来获取按键被按下事件。下面代码中变量m是ExMessage类型的,用来存储键盘消息,处理白球移动的代码如下:

如同基础项目那样,后面可以针对代码框架中的代码块布置一些子任务,这里就省略了。子任务的难度可以通过要学生补充代码的多少来控制。

3.3 项目实施的感悟

项目化教学案例还可以用井字棋游戏、翻牌游戏等。个人在项目教学设计方面有一些感悟,就是往往在选择案例和如何实现案例时顾虑较多,可能会出现项目出错、不完善的情况。项目设计的时候也许不需要过于纠结它们的细节和可玩性等方面问题,逻辑清楚、实现较简单的项目就可以起到引领学生入门的作用,因为更重要的是提高学生学习兴趣,后期学生可以自行增加一些感兴趣的复杂功能。例如,碰撞的球例子里面两个球碰撞时,也许教师的第一反应是如同现实那样实现两个球的反弹,但是这个实现难度就提高了。与其为了项目更加“完善”和“真实”,不如适当简化项目,让学生更易上手。

4 小结

EasyX图形库不但可以使用在项目化教学中,而且在C语言各章的教学中就可以用EasyX编写一些小程序来展示C语言语法的在各章中的应用。甚至在C++语言的教学中仍然可以使用EasyX,即接着用面向对象方式来编写代码。总体来看,EasyX可以在C/C++的教学中起到较为积极的作用,性价比还是不错的。

猜你喜欢

项目化教学C语言教学研究
基于Visual Studio Code的C语言程序设计实践教学探索
基于C语言的计算机软件编程
高中数学教学研究
高职高专院校C语言程序设计教学改革探索
高职《管理学》课程实行项目化教学改革与实践策略
交替传译中听记平衡教学研究
论子函数在C语言数据格式输出中的应用
语文课堂有效教学研究
《protel DXP 2004》的教学研究