汤晓燕
(沙洲职业工学院,江苏 张家港 215600)
近年来,高职院校的生源呈现出提前录取、高考普招、中高职3+3、中职对口单招、注册入学等多种层次,专业教师在教学过程中经常遇到实际教学效果与预期目标存在一定差距的情况。[1]如何提高学生对工科专业课的兴趣、如何切实提升工科专业课的教学效果,已成为高职院校专业教师需要研究和解决的一项重要课题。
随着计算机产业的迅速发展及互联网的逐步普及,电子游戏以其虚拟性、交互性、跨时空性、开放性、生动性等优势,受到当代大学生的青睐,学生已成为电子游戏的一个重要群体。大多数学生选择电子游戏是作为打发时间、休闲娱乐和释放压力的一种方式。
目前市面上流行的一些数字小游戏,比如:24点、2048、扫雷、超级玛丽、五子棋、黑白棋、打地鼠、华容道等,由于功能要求相对简单、又有一定的趣味性,可以在高职非计算机专业的编程类专业课程教学中适当引入。本文将2048小游戏的程序设计与“虚拟仪器技术”课程的学习相结合,通过实现2048小游戏的功能,让学生全面掌握基于LabVIEW的原理、设计方法和实现技巧。
2048是一款深受用户喜爱的数字益智小游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。[2]设计小游戏旨在简单易学、操作方便、易于使用、功能齐全、轻松益智。
2048游戏的规则如下:
(1)棋盘为4×4=16格;
(2)游戏开始时随机产生2个数值为2或4的方格;
(3)用户可选择↑、↓、→、←四个方向,若棋盘内的数字出现位移或合并,则视为有效移动;
(4)在用户所选方向上若有空格则会出现位移;
(5)在用户所选方向上若有相同的数字则合并求和,每次位移可以同时合并,但不可以连续合并,合并所得的新数字即为本次合并的有效得分;
(6)每次有效移动,在棋盘空白位置随机产生1个数值为2或4的方格;
(7)棋盘未出现2048,且全部被数字填满、无法有效移动,判失败,游戏结束;
(8)棋盘出现2048,判胜利,游戏结束。
(1)交互式图形操作界面;
(2)使用↑、↓、→、←四个方向键进行操作;
(3)开始游戏、结束游戏功能按钮;
(4)游戏得分和游戏用时时间显示。
从2048游戏的操作需求我们可以看出,这个游戏的开发环境可以有多种选择。
目前,C语言是非计算机专业工科学生学习的首选计算机语言。C语言现已很成熟,并以代码量小、运行速度快、功能强大为主要优点;但也有开发周期长、可移植性不强的缺点。使用C语言作为开发工具,对学生的起步要求低,但对算法的理解程度要求高,生成的交互式图形操作界面比较简单。[3]
C#是微软推出的一门面向对象的通用型编程语言,它除了可以开发 PC软件、网站和 APP,还能作为游戏脚本。对于有C语言基础的学生,C#开发工具上手相对简单,部分代码可以自动生成,面向对象的图形操作界面更友好。但也有代码量大、CPU处理效率低的缺点。
Java是一门面向对象的编程语言,具有简单、安全、稳定、跨平台的优点,但也有运行速度慢、效率低,不支持底层操作的缺点。对于非计算机专业的初学者,需要花费不少时间来熟悉面向对象的概念、语法和编程思想。[4]
LabVIEW是图形化编程语言,更直观,适合图形化仿真;在测试测量、工业自动化、虚拟仪器、科研实验等行业软件开发中已得到广泛使用。LabVIEW平台入门相对简单,开发速度快。但LabVIEW平台下算法的效率还不够好。
对高职学生而言,LabVIEW采用的高度交互式开发环境,可以快速设计原型和渐进式开发应用程序;与代码类编程语言课程对比,学习的难度有所降低。选择LabVIEW作为2048游戏的开发环境,一方面降低编程工作量、算法实现简便,另一方面图形界面友好、设计快捷,对非计算机专业的工科学生是比较合适的。
(1)熟悉LabVIEW各组件,进一步深入学习和研究“虚拟仪器技术”课程所学知识;
(2)使用LabVIEW多种结构,通过独立编制LabVIEW综合性程序,提高编程能力;
(3)学会利用子vi,将复杂的程序模块分解为若干功能单一的子程序;
(4)在游戏的完成过程中,了解程序开发的一般流程,并学习和熟练软件分析与调试技能;
(5)寓教于乐,提高学生学习专业课的兴趣和乐趣。
根据2048的游戏规则,软件设计需要实现的基本功能有:随机生成2或4,上移、下移、左移、右移,判断游戏失败与胜利,显示游戏得分,显示游戏使用时间。
通过LabVIEW的VI层次结构图(见图1)可以看出,2048游戏采用了一个状态机结构。生成2或4、上移、下移、左移、右移、是否失败、胜利,它们分别对应不同的状态;在游戏运行过程中,当条件满足时,会在这几个状态间互相转换。
图1 2048游戏的VI层次结构图
利用一个4×4的二维数组存储棋盘,数组元素为枚举类型,分别为空白、2、4、8、16、…、2048共12个图片元素。在前面板放置图片下拉列表、分数显示框、时间显示框、开始按钮、结束按钮,并合理布局(见图2)。
索引数组程序设计:找出4×4二维数组中0的位置,并输出0所在的行和和列位置,即输出了一个一维数组,,数组中的的元素是一个簇,即0所在的行、列。
生成2或4程序设计:在现有4×4二维数组中0的的位置中,随机生成1个 2或4,并刷新棋盘(见图3)。
整个程序最外部是一个 while循环;循环内部使用用一个条件结构,用来改变状态,状态分别为:初始化、用户控制、上移、下移、左移、右移、生成 2或 4、是否失败、是否胜利。
初始化程序设计:将4×4的的二维数组置0,即清空棋盘;并随机生成两个数(生成2或4),即在棋盘上随机位置放置两个数(2 或 4);游戏分数值清零;游戏时间值清零,并重新开始计时;初始化完成后通过移位寄存器转到到用户控制。
图2 2048游戏的前面板
图3 生成2或4程序
用户控制部分使用一个事件件结构来检测事件,事件分别为:超时、开始值改变、结束值改变、键按下,可以处理游戏过程中用户可能的鼠标和键盘操作。其中,超时事件是用来在程序空闲时更新显示游戏使用时间;开始值改变事件是是用来重新开始新一轮游游戏;结束束值改变事件件是用来停止游戏;键按下事件是在用户按下键盘上的的↑、↓、→、←四个方向键时,通过扫描键盘上按键的扫描代码,判断出键盘上按下的的按键,分别转到对应的的上移、下移、右移、左移状态(见图 4)。
上移、下移、右移、左移四种移动状态是2048游戏中最主要、最频繁的的操作。
左移程序设计:用户按下键盘上的←方向键时,直接删除二维数组中的0(位移),若遇二维数组中同行相邻元素相等的则求和(合并),再补全二维数组中空缺的0(见图 5)。图 6中的同值求和子程序对应合并操作(见图6),按行遍历4×4二维数组中的的每个元素,同行相邻元素若相等则求和,并将所求的的和靠左存放。
图4 用户控制程序
图5 左移程序
图6 同值求和程序
右移程序设计的的思路类同左移程序,方向的改变((左移变右移)在程序中通过LabVVIEW的数组反转功能来实现。上移、下移程序是左移、右移程序设计的基础上,通过LabVIEW的数组转置功能来实现数组的的行列数据改变,从而达到左移变上移、右移变下移的方向改变。
在执行上移、下移、右移、左移程序之后,若移动前后的4×4二维数组数据没有变化,则可能是棋盘已满、游戏失败,程序转到是否失败;若移动前后的4×4二维数组数据有变化,则游戏正常进行,程序转到是否胜利。
是否失败程序设计:移动前后的4×4二维数组数据没有变化,并且棋盘已满、没有有可合并操作,则判断游戏失败,计算游戏总得分,停止更新游戏戏时间,显示示游戏失败信息,待用用户确认后重新开始下一轮游戏戏(见图7)。显示游戏失败信息的界面见图8。
图7 是否失败程序
是否胜利程序设计:在 4×4二维数组中搜索是否出现11(代表 2048),如果搜索到到11,则判断游戏胜利,计算游戏总得分,停止更新游戏时时间,显示游戏胜利信息,待用户确认后重新开始下一轮游戏;如果未搜索到11,则游戏继续进行,程序转到生成2或4。
在已实现的 2048游戏基本功能基础上,对于有兴趣的同学,还可以增加如下程序功能设计:
(1))棋盘大小可选:除了4×4之外,还可选择3×3、6×6;
(2))显示历史最高分:采用配置文件,利用配置文件的队列特性,保存程序运行中的得分数据;
图8 游戏失败界面
(3)添加背景音乐:在游戏进行中,同时播放音频文件,提高游戏舒适度;
(4)优化游戏界面:界面设计仁者见仁、智者见智,在遵循布局合理、主次分明、配色合适的原则下,自主设计游戏的前面板、并做好界面美化;[5]
(5)生成可执行文件:将 2048游戏生成 VI的可执行版本,允许用户运行 VI而无须安装LabVIEW开发系统。
通过2048游戏的设计,全面综合了“虚拟仪器技术”课程中LabVIEW的常用知识点,其中涉及到:
(1)数据类型:数字型、布尔型、字符串型、枚举型、簇、数组、时间标识;
(2)程序结构:循环结构、条件结构、事件结构;
(3)文件操作:数据文件的读出/写入;
(4)界面设计与美化:使用LabVIEW的美化技巧,给用户提供一个布局合理、色彩搭配得当、操作简单的程序界面;
(5)项目管理:通过项目管理器建立项目中的文件、依赖关系、程序生成规范;
(6)发布应用程序:需要发布的应用程序,应该能够脱离LabVIEW开发环境而独立运行;一种方法是生成EXE文件,则只需有LabVIEW的运行引擎,不需要LabVIEW的开发环境;另一种方法是生成安装程序,完全脱离LabVIEW系统,可以独立运行。
在2048游戏的设计和调试过程中,可以给学生推荐相关的技术论坛、技术博客,让学生学会主动关心和学习专业技术的新发展,在游戏中提高自己的专业技能水平。