APP下载

基于可视化图形编程的C语言引导性教学项目设计

2023-06-24林伟铭

中国新通信 2023年3期
关键词:砖块数组C语言

摘要:针对大学生初学C语言课程容易出现的枯燥、缺乏兴趣的问题,本文通过结合C语言语法和EasyX图形库函数,设计了两个图形可视化编程的引导性游戏项目。结合课程教学过程,将项目内容分解为配合教学进度的小题,逐步完成整个项目内容。从而通过趣味项目引导学生自主学习和分析,提升学生的编程能力和解决问题的能力。

关键字:C语言;EasyX图形库;图形化编程;引导性教学

一、引言

程序设计能力是应用型本科电子类专业学生的一项重要能力,尤其在新一轮智能技术革命的影响下,程序设计能力的重要性显得更加突出[1]。而C语言程序设计课程通常开设在电子类专业的大一学年,是大部分学生首次接触到程序设计的课程。因此C语言作为程序设计能力的基础,对学生后续掌握单片机、嵌入式、Java程序设计、Python等课程知识的影响十分重要。

然而不少学生在学习C语言的过程中,普遍反映对C语言不感兴趣或感到枯燥。这也表明部分学生在C语言的学习上存在困难和缺乏兴趣引导[2]。为了在新工科建设的理念下,培养具有创新思维、解决问题能力和自学能力的新一代电子信息类新工科人才,以问题为导向的教学方式逐渐受到重视[3]。本文将以C语言为基础,结合EasyX图形库,设计两个可视化编程的趣味游戏项目。并将项目设计内容逐步分解为多个小题目,随着课程教学内容的进行同步发布给学生。学生可以根据当前所学内容逐步完成游戏项目,直到课程结束时最终完成整个项目。让项目贯穿在教学过程中,引导学生自主学习,自主分析,从而提升学生的编程能力和解决问题的能力[4]。

二、EasyX图形库

EasyX 图形库是一款免费绘图库[5],其设计目的虽然针对C++,但也可以应用在C语言编程教学中[6]。只需要在C语言编译环境中安装easyX插件就可以简单实现图形的绘制及可视化。因此本文通过EasyX图形库实现C语言编程的可视化,可以加深学生对编程的直观印象。然后通过EasyX图形库设计趣味游戏项目,学生完成项目后可以得到直接的反馈,形成较强的满足感和成就感,可以进一步提升学生的学习兴趣。

本文设计的两个趣味游戏项目需要用到的EasyX函数较为简单,涉及的内容主要有:窗口建立,直线、矩形和圆形的绘制,鼠标键盘的输入,屏幕内容清空等功能。相关的函数及说明如表1所示。

三、案例1—图形化五子棋游戏编程

本项目内容是实现一个五子棋游戏界面,可以响应鼠标点击事件,并在点击位置为止放置黑白棋子。最后能根据五子棋的胜负规则,程序自动判断胜负并给出提示。游戏界面如图1所示。该项目涉及的C语言知识包括了变量声明、循环、函数设计、二维数组操作、文件操作等。学生根据设计功能要求逐步完成各项模块代码,最终完成五子棋游戏程序的设计。该项目根据教学进度可分解为五个小题,分别为:

(一)五子棋游戏项目第一题—棋盘的显示

该小题需要使用循环的语法,可在循环课程结束后进行。要求生成600×600的窗口,使用矩形填充棋盘背景色为0x55AAAA。然后使用循环绘制15条间距为40,长度为14×40的横线。同理使用循环绘制15条竖线。即可以显示一个棋盘。该小题训练学生对循环的使用,并通过可视化的方式显示出来。循环过程中的数值出现错误很容易在图形界面中体现出来,学生可以得到直观的反馈并进行改进,从而提高学生对循环的掌握和使用能力。

(二)五子棋游戲项目第二题—棋子的显示

该小题需要使用函数和数组语法,可在函数和数组结束后进行。要求设置一个全局变量二维数组char CHESS[15][15],用于保存棋盘上15×15个位置的棋子信息。使用嵌套循环遍历二维数组的所有元素,根据数组元素值,在棋盘对应的位置上绘制填充颜色为黑色或白色的圆形棋子,或不绘制棋子。最后编写一个函数void reDraw(),将绘制棋盘和棋子的代码打包到该函数中。该小题可训练学生对二维数组的操作,数组操作错误则体现为棋子的显示错误,学生通过自行调试和纠错可以积累经验,更深入理解数组的作用。

(三)五子棋游戏项目第三题—棋子的输入

该小题需要使用函数和数组语法,可在函数和数组结束后进行。要求在棋盘界面上用鼠标左键点击,可以在相应的位置上放置棋子。使用while(1)循环获取鼠标点击事件和坐标,根据鼠标点击的坐标,计算距离最近的棋盘交叉点的行列号,修改全局二维数组CHESS[15][15]对应元素的值。然后调用reDraw()重新绘制修改后的棋盘和棋子图形,实现游戏动态显示。该题目主要训练学生对数组的操作和函数的调用,通过鼠标坐标计算二维数组的小标,让学生更深入理解二维数组的使用。该步骤通过调用reDraw()函数绘图,利用模块化设计思路避免了程序代码间的耦合,让学生简化程序设计思路,体现模块化设计的优势。

(四)五子棋游戏项目第四题—胜负判断

该小题需要使用函数和数组语法,可在函数和数组结束后进行。要求每次落下棋子,都要进行胜负判断。以新下棋子的坐标为中心,四个方向(横向、竖向、斜下和斜上)上[-4,4]的范围内出现五个同色棋子连在一起,即该色棋子获胜。判断过程中要避免边界问题,即二维数组的下标越界问题。该小题的胜负判断虽然依然只设计到二维数组操作,但作为本题目的主要步骤,是相对较难也较容易出错的一步,具有较高的挑战性,却更能激发学生的斗志和兴趣。学生需要在二维数组中进行四个方向上的元素数值判断,掌握二维数组和循环语法的灵活使用方法才能较好地完成该题。

(五)五子棋游戏项目第五题—游戏的保存

该小题需要使用文件操作语法,可在文件读写课程结束后进行。要求将每次下棋的坐标记录下来,游戏结束后保存在txt文件里。并可读取txt文件重现棋谱步骤。该小题利用C语言课程最后教授的文件操作,增加了五子棋游戏功能,可以激发学生的创新意识。学生可以自由发挥,对五子棋的各种功能进行补充和改进。

四、案例2—图形化敲砖块游戏编程

本项目是实现一个敲砖块的游戏。游戏窗口上方显示多排砖块,有一个小球在窗口范围内反弹,小球敲到砖块会让砖块消失。游戏窗口下方有个滑板,由两个按键控制滑板的左右移动,当小球下落时,滑板要能及时接住小球,否则小球落入屏幕下方则游戏失败。游戏界面如图2所示。

该题目涉及的C语言知识同样包括了变量声明、循环、条件判断、函数设计、二维数组、文件操作等。该项目根据教学进度可分解为六个小题,分别为:

(一)敲砖块游戏项目第一题—小球的移动

该小题需要使用循环语法,可以在循环课程结束后进行。要求利用循环和easyX图形库的编程知识,在界面中显示一个移动的小球。首先生成1000×600的窗口,使用矩形填充棋盘背景色为0x55AAAA。然后绘制一个半径为20红色小球,设置全局变量double ball_x, ball_y, ball_speed_x, ball_speed_y,分别表示小球的x,y坐标和x,y轴上的速度。设置while(1)循环(使用Sleep(10)控制循环速度),每次循环令ball_x += ball_speed_x, ball_y + ball_speed_y,然后以新的坐标重新绘制矩形底色和红色小球。从而实现小球的动态移动显示。该小题通过循环操作更新小球位置,最后动态地显示移动的小球,通过可视化直观地体现了循环操作的作用,让学生有较强烈的印象,从而可以激发学生的学习兴趣,为下一步的学习做好准备。

(二)敲砖块游戏项目第二题—滑板的移动

该小题同样只需要使用循环语法,可在循环课程结束后进行。要求利用循环和easyX图形库的编程知识,在界面下方显示一个可控制左右移动的滑板。要求在游戏窗口的正下方绘制一个宽高为200×20的蓝色矩形滑板。设置全局变量double board_x, board_y作为滑板左上角坐标,在上一小题的while(1)循环中,每次循环内都增加按键判断,实现a和d按键减少或增加滑板的x坐标。从而实现滑板的动态移动。该小题同样利用循环来移动游戏界面中的图形,但可以通过按键交互来控制图形的移动方向和速度,进一步提升了编程的趣味性。

(三)敲砖块游戏项目第三题—小球的反弹

该小题需要使用函数语法,在函数课程结束后进行。要求在界面中显示一个能移动和反弹的小球。在上述2个小题的基础上,编写update()和reDraw()函数,update()用于计算小球和滑板的新坐标,而reDraw()则是清除原有绘制内容,并按新坐标绘制小球和滑板。在update()函数中,每次计算小球的新坐标后,都要判断小球的坐标ball_x, ball_y是否碰到边界。然后修改速度ball_speed_x和ball_speed_y的方向。如果碰到滑板,则重新随机生成往上方移动的小球速度。该小题通过在循环中增加判断语句,训练学生将循环和判断语句联合使用的能力,并通过可视化游戏界面体现出来。学生的判断条件出错能在界面中体现出来,学生获得直观的反馈并加以纠正,可以加快学生的学习经验积累。随着代码的增加,将位置更新和图形绘制划分为两个模块函数,可以训练学生梳理代码和模块划分的能力。

(四)敲砖块游戏项目第四题—多彩砖块的显示

该小题需要使用函数和数组语法,在函数课程和数组课程结束后进行。要求在界面上方显示5行20列的砖块。设置类型为unsigned long的全局变量二维数组,用于保存5行20列的砖块,每个元素用于保存对应砖块的颜色,如果该值为0,则表示没有砖块。并将二维数组里的值随机设置为不同颜色。在reDraw()函数里增加砖块的显示,每个砖块的宽度应为50,高度设置为30。该小题通过二维数组保存多彩砖块的数据,要求学生学会二维数组的使用方法。其中砖块的显示涉及了循环遍历二维数组,以及数值为0的空砖块判断,可以训练学生综合运用循环、条件判断和数组操作。

(五)敲砖块游戏项目第五题—砖块的碰撞

该小题需要在函数课程和数组课程结束后进行。要求实现小球和砖块的碰撞计算,让砖块消失,并修改小球方向。设置一个函数int blockHited(double ball_x, double ball_y, double block_x, double block_y),用于检测小球与一个砖块是否发生碰撞,返回值为0表示没有碰撞,非0值表示发生碰撞。碰撞的情况下要修改小球的速度方向。小球每移动一次,就與所有的非0砖块遍历一遍。该小题虽然涉及的语法与前面小题一样,但是相对有挑战的内容,小球需要与多个砖块进行碰撞检测,需要涉及循环遍历以及二维数组的更新(砖块的消失)。小球与每个砖块的碰撞及方向更新,则要考虑到碰撞的范围,以及碰撞的位置是处于砖块的上下左右方向,还是四个对角方向,并计算出合理的反弹方向。因此学生容易在该小题上出错,但通过界面直观反馈错误现象,可以吸引学生深入研究代码的执行过程,进而强化学生的程序设计思维,提升编程能力。

(六)敲砖块游戏项目第六题—游戏参数设置

需要使用到文件操作语法,可在文件读写课程结束后进行。要求将一些重要参数保存到txt文件中,并在游戏开始时读取txt文件中的参数,用于游戏的配置,例如游戏界面大小、砖块数量、滑板尺寸、小球速度等。该小题利用文件操作功能扩展敲砖块游戏的配置功能,学生编译出程序后,只需要简单修改配置文件就能调整游戏的难度,可以让学生体验软件设计过程中参数配置过程。此外还可以增加开放性题目鼓励学生开拓思维,发挥想象力,利用所学知识扩展游戏的功能,激发学生的创新思维。

五、结束语

对于刚接触程序设计的学生来说, C语言里的概念会有一定的抽象和难以理解,因此对C语言的学习提不起兴趣。本文设计的可视化编程引导性游戏编程项目,可以通过游戏设计提高学生编程兴趣。再以项目分解成小题的形式,一步一步引导学生完成整个项目,并贯穿整个C语言编程教学内容。对提高学生的编程能力和解决问题的能力有较好的帮助作用。

作者单位:林伟铭 厦门理工学院 光电与通信工程学院

参  考  文  献

[1] 吴紫恒,王兵,李聪,等.人工智能背景下电子信息类新工科人才培养模式的研究[J].湖北工程学院学报,2021,41(03):121-123.

[2] 柴西林,赵亚娟,赵艳,等. 应用型本科电子信息类专业C语言教学现状分析及对策研究[J]. 科技创新导报,2017(6):193-194.

[3] 罗春娅,李丹,马智超,等.以问题为导向的高效课堂的研究——以中美合作办学的电子类专业基础课为例[J].湖北第二师范学院学报,2020,37(02):89-91.

[4] 丁凤娟,洪腾蛟,陈丰,等.基于新工科与专业认证背景下《C语言程序设计》教学改革与实践[J].才智,2022(21):84-87.

[5] 崔北元,李德川.基于EasyX的物体运动状态模拟仿真系统分析抛体运动问题[J].教学考试,2021(49):20-22.

[6] 尹兰兰,磨峰,熊水平.C语言课程中利用easyX进行算法的可视化教学[J].软件工程,2019,22(11):51-55.

基金项目:2021年福建省本科高校教育教学改革研究项目“新工科背景下电子信息类人才软件创新能力培养的探索与实践”(项目编号:FBJG20210085);2020年福建省本科高校教育教学改革研究项目“专创融合-虚实结合打造电子信息系统综合设计课程群”(项目编号:FBJG20200119)。

林伟铭(1983-),男,汉族,福建漳州,博士,副教授,研究方向:模式识别与机器学习研究。

猜你喜欢

砖块数组C语言
JAVA稀疏矩阵算法
Kenoteq的工程师研发环保砖块
砖块迷宫
基于Visual Studio Code的C语言程序设计实践教学探索
JAVA玩转数学之二维数组排序
基于C语言的计算机软件编程
高职高专院校C语言程序设计教学改革探索
只有砖块
寻找勾股数组的历程
论子函数在C语言数据格式输出中的应用