游戏编程在C++教学中的应用

2014-04-21 09:05李江华胡群香苏曼虹张靖邦
深圳信息职业技术学院学报 2014年3期
关键词:语句编程界面

李江华,胡群香,苏曼虹,张靖邦

(深圳信息职业技术学院机电工程学院 广东 深圳 518172)

游戏编程在C++教学中的应用

李江华,胡群香,苏曼虹,张靖邦

(深圳信息职业技术学院机电工程学院 广东 深圳 518172)

提出了在C++语言课程教学中采用游戏软件编程的教学方法。以打飞机游戏程序的编写为案例,对游戏的设计原理,设计方法和游戏编程教学过程的实施步骤进行了探讨。实践展示了C++语言编写游戏的可行性;同时展现了C++游戏教学方法的优越性,为C++教学提供了一种有效的方法。

C++语言;游戏教学;打飞机游戏;案例教学

用C++编写游戏已经初步显示了它的魅力[1-4]。它的实现对于传统的C++的教学方式即理论和实践相对独立的方法注入一股新的活力,吸引了无数教学工作者对它的推广应用和深入探索。

我们从C++的教学中总结出用C++编写一个完整的、并且学生感兴趣的实例可激发学生的学习兴趣和探索精神。为此,我们用C++编写了“打飞机”游戏的程序,并将其作为教学内容,引导学生学习和编程。该程序实现起来相对容易,而且又用到了C++中基础知识点。同学们在学习和扩展编写该游戏的过程中,不自觉地就掌握了C++的主要内容,还能积累一些编程方法和技巧,并能学习一些从教材中学不到的知识。这种方法也有人做过这方面的探索[1-4],但大都浅尝辄止,没有作更深入的、系统的分析,更没有根据分析的结果做更进一步的拓展。因此,我们编写一个包含了C++的基础知识点但简洁的游戏。在编写游戏的过程中学习 C语言,是C语言游戏式教学进一步的完善和补充。

1 打飞机游戏的设计思想

打飞机游戏是一款容易编写的小型游戏。简洁的键盘操作方式和直观显示,使其极易上手;人机对弈或人人互玩,使其充满乐趣;如此简洁的游戏程序却包括了C++的所有基本知识点。因此,我们采用打飞机的游戏贯穿在C++学习的过程中。

教学引入中提到如下疑问:首先是怎样确定活动的空间?C++告诉我们用数组可以确定界面。为此,复习关于二维数据的下标、行列、初始化和二维数据的产生。比如区域大小为5×5,则数组可以定义为fj[5][5]。但是C中以0为起始小标,则fj[0][0]为水平和垂直方向上的第一个位置。其次是怎样来控制各物体的运动?由于游戏的趣味性,各物体以随机方式出现,因此随机函数random的实现比较重要。按照游戏的进程,三种句型结构必须熟悉:for的双重循环即二维数据的变化来实现物体的上下左右的运动、if-else语句判断游戏中呈现的多个阶段和switch语句判断按键控制物体的移动方向。最后是如何利用函数的调用来实现程序的模块化?函数调用表面上好理解,但真正使用中就会面临诸如参数传递、函数返回上一级,变量初始化的问题,而指针能较好的解决上面的问题。

理清游戏过程及实现方法后,可绘制程序流程图如图1所示:先用一个二维数组产生一个游戏界面,即飞机允许的活动范围。在本游戏中,我机在界面底部做水平运动,敌机在界面顶部上下左右运动。我机通过键盘操作发射子弹,追踪定位敌机后,子弹将飞机击落,我方得分。如在规定时间内未追踪定位到飞机,则当飞机位于我机正上方快接触时,我机被击落。我方的飞机只有一架,被击落则游戏失败,游戏结束。我们用坐标函数初始化,用随机函数优化速度参数;用键盘捕捉函数,捕捉键盘是否有被按下,有则进入下一步,无则跳过;再利用字符提取函数,提取的字符代表不同的运动方向。程序包含C++教材中的基本章节的主要内容,如如常量和变量、顺序语句、选择语句、循环语句、条件语句、函数定义与调用、函数,数组,字符,指针等等,对于初学编程者是一个很好的典型例子。

图1 程序流程图Fig.1 The Diagram of Program Process

2 程序的算法实现

3 分析和拓展

对于初学者,程序越简单越好。为此,我们依据图1的逻辑顺序编写了上面的程序:首先通过头文件声明,复习头文件的使用方法,即头文件在编译过程中用来将下面程序中需要用到的标准数据类型和由C语言编译器提供的一些标准输入/输出函数,时间函数等包括进来,生成可执行代码;然后通过二维数组对系统界面初始化,通过改变二维数据的值观察界面的变化。因此,形象而生动的讲解到二维数据的应用中。本程序中语句fj[39][i]=1;横坐标常量定义了我机的初始位置在界面的最低端水平线上,纵坐标变量来表现我机的左右移动;语句fj[i1][rand()%50]=3;定义了随机产生的飞机位置;这种用坐标变化来表示运动是数学思想在编程上的理论基础。随机数函数srand(time(NULL))定义随机产生敌机的数量;选择函数switch(fj[j][k])的数值由0递增到4分别代表如下5种选择:空白,我机,边界,敌机,子弹。另外一个选择函数用了字符’a’,‘d’,‘s’ 描述了玩家通过选择这些字符控制我机的运动方向和子弹速度大小。条件语句if(++x1%5==0)和if(++x%100==0)定义敌机产生速度和子弹移动速度的条件;主函数中使用了2个函数分别为子弹函数move_the_bullet和敌机函数move_the_plane。它们展示了如何实现子弹和飞机在游戏过程中的三种可能情况:敌机保持前进、在前进过程中被击落而我机得分、一直没有被击落而超出界面消失;我机保持水平运动,一旦被击落,生命为1 (shengming==1),清除界面,跳出死循环:system(“cls”);break;,游戏结束(游戏输出界面如图2所示)。结束游戏函数为game_over(),该函数使用图形输出函数cout()。

通过整个函数知识点的讲解,学生们可以更好的掌握c++语言中基本点的学习。如cout()函数、switch语句、while语句,if语句,并能切身体会到三种基本结构的嵌套。程序还可以把这2个子函数置于主函数的外部,在主函数中调用,每一模块对应一个函数,在系统中有函数的调用。从而可以使学生对函数的调用及参数的传递这一部分内容有一个更前面的掌握。对比一下函数的调用的优势,函数调用方便于程序的修改,可读性和修改性都增强。这样的对比使得教学上一目了然。程序中的难点是如何使用指针,也是本程序的两点,程序中列出了有指针和没有指针的对比。指针是表示存放数据的地址,它是通过寻找地址再找到地址对应的数值。而没有使用指针的语句是直接传递数据。C中函数调用是按值传递的,传入参数在子函数中只是一个初值相等的副本,无法对传入参数做任何改动。但实际编程中,经常要改动传入参数的值。这一点我们可以用传入参数的地址而不是原参数本身,当对传入参数取地址运算时,就可以直接在内存中修改,从而改动原想作为传入参数的参数值。可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的,使程序设计具有灵活、实用、高效的特点。

学生在编写游戏为目的的驱动下学习,可以使C++的主要知识点更加系统、条理,生动,不再是一盘散沙;学生更能系统的掌握知识点,更能灵活运用相关知识,切实做到学以致用,理论和实践紧密结合。然而,程序到此并没有结束,真正的学习才刚刚开始。学生可以在这个程序的框架基础上做更精致层次上的扩展。例如飞机的图像如何描述?目前使用的是简单的标志符,我们可以在窗体绘制飞机和子弹立体图像来代替点图形;目前飞机的移动只有平移和纵移两种直线方式,那么,曲线运动的又是如何表示?目前飞机的运动速度是匀速的,看看加速度如何给子弹产生“有质量”的效果?另外,可设计游戏升级,分成多个等级,分成一人模式和二人模式,等等。趁热打铁,激发学生的兴趣后引导学生自己主动去学习更多的知识。如除用C++外,也可以用Flash制作比较精致的画面。篇幅有限,这里不一一举例。学生掌握一定的基础上,有目的的引导学生努力的方向。学生的主动性被激发,能收到一石激起千层浪的教学效果。

图2 游戏输出界面Fig.2 Game output interface

但如果教师设计一个综合型的案例,如:通过设计一个基类Shape 包含成员函数Show(),将Show()声明为纯虚函数,Shape 类公有派生矩形类Rectangle 和圆类Circle,分别定义Show()实现其主要几何元素的显示,逐步地引导学生写出相应的程序代码,最终使程序具有多态性的功能,把复杂的问题简单化,那么,学生将很容易地掌握案例所涉及的知识点。

案例的分析与讨论是案例教学实施过程中的关键一环,也是体现课堂上师生互动性的核心环节;因此,教师需要根据事先设计好的问题,充分地引导学生围绕这些问题对案例进行分析与讨论.在分析与讨论的过程中,教师需要注意以下几个方面:1) 预先估计在讨论中可能会出现的问题,并做好相应的准备,把讨论引向深入;2) 有效地引导学生抓住问题的本质,尽量地避免拘泥于问题的现象;3)善于营造一个使学生能各抒己见的氛围;4) 鼓励学生积极思考、踊跃发言,使案例的分析和讨论能有序地进行。

4 总结

本文的程序是一个包括C++基础性内容(如常量和变量、顺序语句、选择语句、循环语句、条件语句、函数定义与调用、指针等)的实例。但它们不是零散的出现,而是按照一定的逻辑贯穿在完整的游戏程序中。学生能对旧知识进行回顾的同时也思考如何建立程序的整体框架,是一个很好的深入学习的途径。学生掌握了规律和方法后,可自行改动游戏规则而修改程序。这种有创造性的反复是学生有效学习的途径。到学习者有一定编程经验后,可以尝试用C++的高级内容如结构体、动态分配与链表等优化我们的程序,可以从而提高程序的可读性,减少程序占用的资像,使程序更加模块化。这样,我们的学习程序就如阶梯式,引导学生在漫漫求学路上前进。

(References)

[1]彭三城.案例教学方法在C++语言教学中的应用研究[J].肇庆学院学报,2013,34(2):18-21.PENG Sancheng.Application of Case-teaching on C Language Teaching[J].Journal of Zhaoqing University 2013,34(2):18-21.(in Chinese)

[2]王鹏.C语言教学的游戏方法探析[J].中国科教创新导刊,2013,23,174.Wang Peng.Analysis of Game Programming of C Language Teaching[J].China Education Innovation Herald,2013,23,174.(in Chinese)

[3]周小云.C语言的快乐教学之旅[J].课程教育研究,2013,1:156.ZHOU Xiaoyun.Happy Journey of C Language Teaching[J].Course Education Research,2013,1:156.(in Chinese)

[4]倪建新.基于C语言的游戏开发教学平台的设计与实现[J].电脑知识与技术,2012,8(35):8401 NI Jianxian.The Design and Implementation of a C-based Language Teaching Game Development Platform[J].Computer Knowledge and Technology,2012,8(35):8401.(in Chinese)

Application of game programming on C++ teaching

LI Jianghua,HU Qunxiang,SU Manhong,ZHANG Jingbang

(School of Michanical and Electrical Engineering,Shenzhen Institute of Information Technology,Shenzhen,518172,P.R.China)

The paper presents game programming method in the C++ language.Based on the analysis of A case of plane fighter using C++ language,it discusses the case designing principle,method,and the implementation steps of case-teaching process.The practice shows that it is possible to use C++ for game development,as well the superiority for teaching.Thus,it offers an effective way for C++ teaching.

C++ language;game teaching;game of plane fighter;case teaching

G642

:A

1672-6332(2014)03-0057-05

【责任编辑:高潮】

2014-09-02

国家自然科学基金(项目编号:31200629)

李江华(1980-),女(汉),广东梅县人,博士后。主要从事生物光学方面的研究。E-mail:lijianghua25@163.com

猜你喜欢
语句编程界面
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
国企党委前置研究的“四个界面”
重点:语句衔接
纺织机上诞生的编程
基于FANUC PICTURE的虚拟轴坐标显示界面开发方法研究
人机交互界面发展趋势研究
手机界面中图形符号的发展趋向
如何搞定语句衔接题