温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
EasyX
图形
语言
项目
教学
中的
探索
陈兵
本栏目责任编辑:王力信息化与计算机教育Computer Knowledge and Technology电脑知识与技术第19卷第4期(2023年2月)第19卷第4期(2023年2月)E-mail:http:/Tel:+86-551-65690963 65690964ISSN 1009-3044Computer Knowledge and Technology电脑知识与技术Vol.19,No.4,February2023EasyX图形库在C语言项目化教学中的探索陈兵,王雪梅(安徽信息工程学院,安徽 芜湖 241199)摘要:C语言是学习计算机编程基础性的语言,但是C语言学习较为单调、枯燥,如何开展项目化教学、寓教于乐一直是C语言教学的一个问题。EasyX图形库作为一个C语言的库,可以在C语言教学中发挥积极作用。文中以弹球游戏案例为例,简单探讨了项目化教学的过程和形式,希望达到抛砖引玉的作用。关键词:C语言;EasyX;项目化教学;教学研究;弹球游戏中图分类号:TP311文献标识码:A文章编号:1009-3044(2023)04-0130-04开放科学(资源服务)标识码(OSID):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不同的彩色)收稿日期:2022-01-24基金项目:2020年安徽省质量工程重大教学项目 面向软件工程专业类课程的“两树”建设与研究(2020jyxm0831);2021年安徽省质量工程课程思政示范课程-C语言程序设计基础(2021kcszsfkc199)作者简介:陈兵(1980),男,安徽省合肥市人,助教,硕士,主要研究方向为软件工程;王雪梅(1968),女,黑龙江哈尔滨人,教授级高工,硕士,主要研究方向为数据库、数据仓库、教学现代化。130DOI:10.14004/ki.ckt.2023.0206信息化与计算机教育本栏目责任编辑:王力Computer Knowledge and Technology电脑知识与技术第19卷第4期(2023年2月)第19卷第4期(2023年2月)图1碰撞的球-基础而强化项目,在基础项目的基础上,再实现一个用键盘控制的特殊的球(下图中白边的小球,可以进行水平移动和竖直移动)来“吃掉”其他的球,即碰到其他的球就让被碰到的球消失。强化项目要用键盘控制白色小球,因此还用到了EaysX的peekmessage函数来接收键盘按下事件,该函数的参数还用到了指针和结构体。故与基础项目一起,整个项目基本涵盖了C语言的主要知识点。图2碰撞的球-强化由于基础项目和强化项目涵盖了C语言的大部分知识点,因此需要在期末推出项目。如果希望尽早在教学中引入项目,比如在教授完选择和循环后就希望推出项目,那么可以另行采用其他项目,或者采用碰撞的球的简化版本,比如,实现单个球的碰撞,这样就不需要使用类似数组这样课程偏后面的知识点。单个球的碰撞项目,仍然可以采用基础项目和强化项目这样的两阶段的形式。比如,基础项目是实现单个球的碰撞到边缘的反弹,任务提供代码片段,学生只需要代码整合;而强化项目是反弹模式发生变化,比如碰到左边缘,从右边缘出来,反之亦然,并且只提供部分代码。这样难度就有阶梯。项目案例从易到繁,迭代式地引入课堂中,也是类似五星教学法所推荐的模式5。图3迭代项目3.1 碰撞的球之基础项目下面给出期末版本的基础项目的各个子任务的例子,以做参考。1)给出代码框架,并做出解释。#define BALL_NUMBER 20#define WIDTH 640#define HEIGHT 480int random(int min,int max);int main()intxBALL_NUMBER=0,yBALL_NUMBER=0,radiusBALL_NUMBER=0,velXBALL_NUMBER=0,velYBALL_NUMBER=0;COLORREF colorBALL_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+)radiusi=random(10,20);xi=random(0+radiusi,WIDTH-radiusi);yi=random(0+radiusi,HEIGHT-radiusi);velXi=random(-5,5);131本栏目责任编辑:王力信息化与计算机教育Computer Knowledge and Technology电脑知识与技术第19卷第4期(2023年2月)第19卷第4期(2023年2月)velYi=random(-5,5);int gray=random(0,255-64);/255减去64是避免球的颜色过亮,和白色背景不好区分colori=RGB(gray,gray,gray);该代码随机产生一定范围的整数值,用来初始化各个圆的半径、x坐标、y、坐标、x方向速度、y方向速度、颜色值。其中RGB是EasyX库的带参数的宏,用于将红、绿、蓝颜色分量合成颜色。代码中这3个分量都相同,产生的是灰色。3)核心动画代码处框架如下:while(true)/清除屏幕setbkcolor(WHITE);/背景色为白色cleardevice();/绘图代码./休眠30毫秒Sleep(30);4)绘图代码处首先补充代码,绘制圆球for(i=0;i BALL_NUMBER;i+)setfillcolor(colori);solidcircle(xi,yi,radiusi);setfillcolor 库函数用来设置填充的颜色,solidcircle用setfillcolor设置的填充颜色来绘制无边框的填充圆。5)绘图代码处继续补充代码,做边缘碰撞检测for(i=0;i=WIDTH)velXi=-velXi;if(xi-radiusi=HEIGHT)velYi=-velYi;if(yi-radiusi=0)velYi=-velYi;xi+=velXi;yi+=velYi;上面代码中4个if分别判断各个圆球是否与右、左、下、上四个边缘发生碰撞,如果发生,则相应修改圆球的移动速度属性,这样动画中就有边缘碰撞引起的反弹效果。6)绘图代码处继续补充代码,做圆球之间的碰撞检测for(i=0;i BALL_NUMBER;i+)for(j=0;j BALL_NUMBER;j+)if(j!=i)int dx=xi-xj;int dy=yi-yj;double dist=sqrt(dx*dx+dy*dy);if(dist radiusi+radiusj)int gray=random(0,255-64);colori=colorj=RGB(gray,gray,gray);双重循环检查任意两个不同的圆球是否发生的碰撞,一旦发生碰撞,则将碰撞的两个圆球都设置成一个随机产生的新颜色。以上就给出了完成基础项目的6个子任务。这6个子任务的代码都是提供出来的,学生只要将各个任务代码整合就可以完成这个阶段。这样项目难度就降低了。可以根据实际情况增减难度,比如可以去掉部分核心语句,要求学生补充。显然,这是与学生水平相关的。强化项目阶段可以比基本项目再适当增加难度。3.2 碰撞的球之强化项目强化项目在基础项目的基础上,使用了一个独特的白色无填充的球来“吃”其他普通的球,这个白球可以用键盘进行上下左右移动控制,因此比基础项目在难度上有所提高。在强化项目任务单中,可以和基础项目类似地给出框架和代码,如果要增加难度,那么部分代码可以让学生来补充。代码框架如下:#define BALL_NUMBER 20#define WIDTH 640#define HEIGHT 480int random(int min,int max);int main()srand(unsigned)time(NULL);/定义普通碰撞的球intxBALL_NUMBER=0,yBALL_NUMBER=0,radiusBALL_NUMBER=0,velXBALL_NUMBER=0,velYBALL_NUMBER=0,existsBALL_NUMBER=0;COLORREF colorBALL_NUMBER=0;/定义能“吃”普通球的球int sx=0,sy=0,sradius=0,svelX=0,svelY=0;COLORREF scolor=WHITE;int i=0,j=0;/定义消息变量ExMessage m;/初始化普通碰撞的圆球for(;i BALL_NUMBER;i+)radiusi=random(10,20);xi=random(0+radiusi,WIDTH-radiusi);yi=random(0+ra