基于三阶段棋类游戏开发的程序设计实践课程改革
2019-08-07徐建军陈振邦尹良泽
徐建军,陈振邦,尹良泽
(国防科技大学 计算机学院,湖南长沙 410073)
0 引 言
计算机程序设计是实践性非常强的课程,该课程的实践教学环节在教学体系中占有非常重要的地位。只有通过具体的编程实践,才能有效地将理论知识和实际应用有机结合起来,从而培养学生分析和解决较复杂工程问题能力。所以,目前很多高校的计算机专业在程序设计基础课程之后,会开设一门程序设计实践课程[1-2]。
我校对应课程的名字是“程序设计实践课程”,其主要目的是通过一个规模较大的实例,让学生以小组形式完成分析、设计和编程实现,以全面梳理所学的程序设计知识,巩固和提高程序设计能力,并培养学生熟悉新语言和开发环境以及团队协作的能力,为更深入地学习后续相关课程和工程实践打下良好的基础。
对于这门课程来说实践选题至关重要,理想的选题应该难易适中、体现当前主流软件的开发实践、能够激发学生学习兴趣。此外,具体教学实施的组织形式,学生实践成绩的评价机制等也会影响教学效果。笔者在教学过程中,针对这些方面做了一些改革和探索。
1 程序设计实践课程的需求
实践选题直接影响该门课程的教学效果,但首先选题的难易程度不好掌握,太易则达不到教学效果,太难又会打击学生的信心,让学生产生畏难情绪,此外实践选题还应该具有一定的实用性和趣味性,以提高学生的学习兴趣[3]。
我校在计算机程序设计课程中教授的是C语言,所以前几年在后续的“程序设计实践课程”中,实践选题是在VC++环境下开发一个图形界面程序。但在信息技术高速发展的今天,此类传统选题已经不能有效地激发学生的积极性和主动性。另外,目前Java、Python等编程语言在实际的软件开发中应用更为广泛,学生出于今后应用目的考虑,对这些高级语言更感兴趣。
因为一般是以项目小组的形式开展课程实践,不可避免组内成员在任务分工方面存在不均衡的问题,甚至有些学生在分组时“抱大腿”,找到成绩优异的同学组队,具体实践过程中则在组内“打酱油”。所以如何充分调动每位学生的积极性,并对学生的工作量进行科学的评价,都是在课程实施时需要仔细考虑的问题。
此外,在目前的互联网时代,网络上开源社区和资源非常多,教师出的实践题目很多都能在网上找到对应的开源代码,所以还需要考虑如何避免抄袭现象的发生。
2 三阶段棋类游戏开发实验
基于上述具体需求,笔者近年来对这门实践课程采取了一系列的改革措施,实践项目选题定为一个棋类对弈游戏的开发实验,基本理念是:开发式和递进式。开发式是项目对具体棋类游戏没有限制,同时不限制编程语言和运行平台,在完成目标任务的前提下,项目小组可以自由选择编程语言和开发技术。递进式是把棋类对弈游戏开发分成三个阶段进行:单机版、网络版和智能版,如表1所示,每个版本有不同的任务和目标,但这是一个循序渐进的过程,即后一阶段必须在前一阶段基础上才能顺利进行。
表1 三阶段的棋类游戏开发实验
这门课程目前在我校设置了40个学时,分成10周完成,每周4个学时主要用于教师讲解实施思路、检查项目进展、阶段验收和答疑,具体实践项目的开发则由学生在课后完成。三个阶段的完成时间分别为4周、3周和3周,每个阶段必须在截止时间之前通过验收,如果在截止时间之后完成,每超一周总成绩扣5分。三个阶段的成绩有不同的评分区间。
2.1 单机版
单机版的目标是实现一个有图形界面的单机版棋类对弈游戏,但对具体游戏没有限制,例如五子棋、中国象棋、国际象棋、围棋等。这个阶段的主要任务是实现游戏界面和主要的游戏规则,要求程序上支持人人对弈,界面美观清晰,无明显缺陷。
在这个阶段,除了实现游戏规则之外,学生的主要任务是实现游戏的图形界面。虽然棋类对弈游戏的界面并不是很复杂,但大多数学生没有图形界面程序(GUI)编程的经验。教师在这个阶段需要给出各种主要高级语言GUI编程的参考资料和VC、QT、Eclipse和Pycharm等开发环境的GUI编程框架,以及简单介绍GUI编程思路。
2.2 网络版
网络版的目标是基于教师提供的游戏服务器,为单机版游戏加入联网通信功能,要求实现在局域网范围内的联网人人对弈,程序通信流畅,无明显缺陷。教师提供的游戏服务器实际上是一个Socket服务端,并且预定义了游戏通信的消息格式,具体为JSON格式的字符串。JSON是一种轻量级的数据交换格式,具有良好的可读性,可以在不同的平台间进行数据交换。
所以学生在这个阶段的核心任务是在单机版的基础上,实现Socket客户端通信和JSON消息解析,即一方面把己方的下棋动作封装成预定格式的JSON消息发给游戏服务器,另一方面解析游戏服务器发过来的JSON消息,还原成对方的下棋动作。目前,Socket通信和JSON消息解析在各种主流高级语言中都有相应函数和库的支持,教师只需给出示例代码即可。在此基础上,为了游戏有更好的用户体验,网络版还应该加入多线程机制,教师也可以给出多线程编程的基本思路和示例代码。
可能有些小组在实现单机版阶段会参考互联网上的开源代码,但网络版需要按照教师提供的游戏通信协议进行实现,所以这个阶段必须在对单机版程序完全理解掌握的基础上,对代码的架构和逻辑进行改造,才能实现联网通信功能。
2.3 智能版
智能版的目标是在网络版的基础上,为游戏加入对应的AI博弈算法,要求支持局域网范围内的机机对弈或人机对弈,AI程序响应迅速,无明显缺陷。
由于棋类对弈游戏在人工智能领域属于典型的二人零和博弈,还具有全信息和非偶然的特点,教师在这个阶段开始之前先简要介绍AI博弈算法的主要思路,包括博弈树的构造和极大极小搜索过程,以及与具体棋类游戏相关的评价函数定义策略等。
2.4 其它教学措施
在实践项目分组时要求2人一组,一方面是为了更合理地分配工作,避免有人在其中滥竽充数,另一方面是要求采用结对编程[4]。结对编程(Pair programming)是一种敏捷软件开发的方法,有助于开发出高质量的程序,增强工作的纪律性,提高开发的效率,同时也有利于学生之间的互相学习。
实践项目的三个阶段都要进行验收,只有当前阶段的验收通过,才能进入下一阶段的开发。验收时,每组由教师随机选一位成员来演示和回答问题,其表现情况决定全组成绩,这样进一步加强组内成员对实践项目的理解。最后在智能版验收时,要求实现同一种游戏的小组之间进行AI对抗赛,每一局比赛赢的队伍总成绩加1分,输的队伍则扣1分。
此外,在每次验收时还引入了代码相似度自动比对系统JPlag[5]。JPlag是一个代码相似度比对工具,目前支持Java、Python、C、C#、C++等主流编程语言。课程规定如果JPlag检查发现代码相似度在90%以上,则组内所有成员直接成绩不及格,实践项目提前终止。
在实践项目全部结束之后,还需要每组提交一个项目总结报告,这个报告在总成绩中占5分。虽然本课程是一门编程实践课程,但文档撰写能力在今后的软件工程实践中也非常重要。总结报告需要写清楚项目设计思路和主要算法,以及组内成员的各自贡献。
3 实践效果
这里以2018学年度笔者所负责的一个教学班为例介绍具体的实践教学成果。这个班共有135名学生,分成了67个项目小组(有个别组成员是1人和3人)。这些组最后所选择的编程语言如图1所示,从中可以发现,目前主流的编程语言都被选择,包括Python、Java、JavaScript、C、C++和C#。其中,选择Python的比例超过了一半,这集中体现了当下Python语言的受欢迎程度以及学生希望学习Python的意愿,选择C语言系列的小组主要原因是前期的计算机程序设计课程教授的是C语言,所以学生从学习成本角度出发选择了C、C++和C#。
图1 实践项目选择的编程语言
图2展示了实践项目所选择的棋类游戏,这些游戏都是学生平时比较熟悉的,包括五子棋、中国象棋、国际象棋、围棋、围棋和黑白棋。有46%的小组选择了五子棋,原因是学生普遍认为五子棋在游戏规则和AI算法实现时会比较简单,有33%的组选择了学生熟悉且感兴趣的中国象棋。
图2 实践项目选择的棋类游戏
最后在单机版阶段,这67组全部通过了验收(其中有5组是超过截止时间通过验收),有多个组在单机版游戏中还加入动画、音效等多媒体效果,提高了游戏的用户体验。一共有41组通过了网络版的验收,可以基于教师提供的游戏服务器在局域网范围内进行联网对战,这其中有19组为游戏加入了多线程机制。最后,共有22组通过了智能版的验收,通过验收的小组还在同类游戏之间进行了AI对抗赛。
4 结 语
针对程序设计实践课程对选题和课程组织等需求,我校的“程序设计课程设计”课中引入了三阶段棋类游戏开发实验的选题,把实践过程分成单机版、网络版和智能版三个阶段,具有开放性和递进性的特点,并且在项目验收、成绩评价和相似度比对等方面采取了一系列的改革措施,极大激发了学生对编程的学习兴趣和自信心,学生课后普遍感觉收获很大,取得了显著的教学效果。
但是这门课的三个阶段都要检查验收,再加上实践指导答疑等工作,教师的工作量非常大,所以还需要更多有丰富编程经验的助教加入教学团队。此外,JPlag的相似度评价结果的准确度以及对编程语言的支持效果方面还需改善。这些是本课程下一阶段希望改进的环节。