基于Funcode平台的儿童益智类游戏设计与开发

2020-10-09 11:01刘硕王海森李其伟
软件 2020年8期
关键词:软件设计

刘硕 王海森 李其伟

摘  要: 本文基于Funcode平台,以“小小饥饿鲨”游戏为例,研究儿童益智类游戏的设计与开发方法。代码采用了C++面向对象程序设计方法,结合平台提供的事件处理函数实现游戏的功能,游戏中玩家通过不断吃掉指定类型的鱼来获得相应的生命值,并且在获得相应数量的生命值后不断升级。

关键词: Funcode平台;游戏开发;软件设计;儿童益智

中图分类号: TP3    文獻标识码: A    DOI:10.3969/j.issn.1003-6970.2020.08.016

本文著录格式:刘硕,王海森,李其伟,等. 基于Funcode平台的儿童益智类游戏设计与开发[J]. 软件,2020,41(08):52-55

【Abstract】: Based on Funcode platform, this paper takes Tiny Hungry Shark as an example to study the design and implement methods of childrens puzzle games. C++ object-oriented programming method is employed and functions of event handling provided by the platform are combined to implement the function of the game. In the game, the player continuously eats the specified type of fish to obtain the corresponding health value, and continuously upgrades after obtaining the corresponding number of health value.

【Key words】: Funcode platform; Game development; Software design; Childrens puzzle

0  引言

随着我国教育改革的不断深入与发展,《国家中长期教育改革和发展规划纲要(2010-2020年)》[1]中曾明确指出:要推进儿童教育信息化进程,促进儿童教育领域的教育内容、教学手段和方法现代化。游戏作为儿童的基本活动,由于具有自主性的特点,相较于其他类型的活动更加强调儿童的自主参与,强调内部动机的引导,注重在其内部动机的激发下实现自我成长,是儿童获得良好发育的重要方式。本项目开发的儿童益智类游戏“小小饥饿鲨”,旨在通过对游戏中不同游戏角色种类的判断以及使用键盘进行灵活操作等方式训练儿童,提高孩子的判断能力和反应能力,对儿童的早期发育起到一定促进作用。

Funcode[2]是上海锐格软件有限公司开发的,支持C、C++、Java、Python等语言的基于游戏和动画界面的综合实验教学平台,用于开发互动式游戏或应用系统。Funcode提供了各式素材、API以及相关页面布局,简化了游戏的开发过程,让游戏的设计变得更为简单及有趣。

1  游戏设计

1.1  游戏规则

游戏玩家所面对的有普通鱼以及特殊鱼。对于这两种鱼的碰撞规则是不同的:碰撞到普通鱼的话,若该鱼的等级比玩家低,那么玩家吃掉普通鱼,并获得一定的生命值;否则,若是该鱼的等级高于玩家等级,则普通鱼吃掉玩家鱼。当玩家吃掉足够的普通鱼并达到相应数量生命值时,即可升级(1-4级)。而对于特殊鱼,玩家必然是会被减掉相应的生命值。当玩家受到的伤害使生命值降低到对应等级生命值标准时会被降级。若玩家的生命值变成0或者被普通鱼吃掉,玩家失败,游戏结束;或者等级4而且生命值达到5000及以上时,游戏结束,并判定为玩家获胜。

1.2  游戏界面设计

色彩常常在儿童的认知中起到重要作用。朱敏等[3]在对色彩在儿童APP界面中的作用研究中指出:色彩可以极大地提高对真实世界的还原度,减少儿童的认知障碍和学习负担,并且颜色的使用可以还原事物的固有属性,使儿童更容易辨识。为此,将游戏界面的整体色调以及游戏角色本身的颜色设计为蓝色,而这一色调与游戏本身的背景“海洋”相呼应,能够为玩家带来更好的游戏场景还原,提供更好的沉浸式游戏体验。

在界面布局设计中,为了减轻儿童的视觉负担,需要将图标尽可能地简洁突出一些。游戏界面的正中间突出了游戏主角——小小饥饿鲨的游戏形象以及游戏按键操作提示,充分符合儿童的心理和认知需求,对儿童这一用户群体非常友好。另外,在界面左上角,设置有等级和生命值这两个用户可见参数的显示框,游戏中玩家能够随时直观地看到自己的等级和生命值变化。

1.3  游戏难度设定

方浩等[4]认为,如果游戏的难度远超过了玩家的真实能力水平,或明显过于简单,都可能导致玩家放弃游戏,放弃对APP的继续使用。该游戏中,普通鱼和特殊鱼的属性设定是根据玩家自身等级变化的,即通过判定玩家自身等级来产生具有不同属性的精灵,因此,游戏的难度会随着玩家等级的不断提升逐步递增,从而保证了游戏的难度与玩家的能力水平相匹配并具有足够的挑战性。以下为两种鱼的详细属性设定:

普通鱼的产生:当玩家等级为1时,只产生1级和2级的鱼,且两种等级鱼产生的概率是不一样的,1级鱼产生的概率为65%,2级鱼为35%;当玩家等级为2级时,会产生1、2、3共三种等级的鱼,等级1概率为30%,等级2为50%,等级3为20%;当自身等级不低于4级时,1、2、3、4四种等级的鱼的产生概率分别为10%、20%、50%、20%。

特殊鱼的产生:玩家为1级的时候,特殊鱼伤害值为10;玩家等价为2级的时候,特殊鱼伤害值为100;为3级的时候,特殊鱼伤害值为 500。同时,该类型鱼的刷新时间被设定为5-10秒/次。

在该游戏中,HP代表生命值,Level代表等级。游戏中的HP和Level变化规则如表1所示。

1.4  游戏的奖励机制

郑晓丽等[5]认为,要善于利用游戏的机制和元素, 如过关、成功的聲音、徽章、等级等,让儿童获得成就感和快乐感,维持其学习动机。因此,笔者设计了该游戏两方面的奖励机制,现作简要概述:

首先是采用了等级的激励方法。玩家需要通过不断吃鱼来获得生命值并在达到相应阈值后升级,从而使玩家能够不断地获得激励,建立对游戏的主动性,使其更好地专注于游戏本身。其次,采取视觉上的激励方法。玩家控制的游戏角色本身的模型大小在不同等级时是不同的:在游戏开始玩家等级为1时,其模型大小设定仅为1/4,并在玩家升级至满级4级的过程中逐步增大至1。这种视觉上的成就感同样可以很好的激励玩家,带来更好的游戏体验。

2  具体实现

2.1  游戏的初始化

Funcode平台实际是一个小型游戏引擎,对设计处理流程的细节进行了封装,将游戏的运行过程划分为游戏初始化、游戏运行和游戏结束三个函数[2]。在每一关开始时,该游戏都会进行一次初始化,清空上一次游戏的数据。GameMainLoop作为主循环函数,被不停地循环反复调用,引擎每刷新一次屏幕,此函数即被调用一次,从而用于游戏的开始、进行中以及结束等状态的处理。该函数中包含了一个判断游戏状态的switch语句,当判断为游戏开始时,即调用GameInit函数初始化游戏,清空上一局相关数据,并将游戏状态设置为进行中,同时创建玩家控制的鱼,该鱼出生等级为1,生命值为10;不然,若判定为游戏进行中,则处置各类游戏逻辑。

2.2  存储结构的实现

因为随机鱼产生的数量是随机的,所以需要使用一个如图2所示的双链表(FishList)来存储游戏中的鱼,从而便于鱼的插入和删除,当添加鱼时就创建一个新节点插入到链表的最后,遍历一遍列表找到最后一个节点,插入到链表的末尾。同样,删除一个鱼的时候是根据鱼的名字进行删除的,遍历链表,找到与删除鱼的名字相同的节点,从链表中移除该节点,并删除该鱼在地图中的显示。在游戏结束时,则按序删除链表中的每个节点,释放内存,最后将头节点删除。使用该存储结构每当创建一个鱼时,就动态地申请相应的存储空间,进而可以避免不必要的空间浪费。

2.3  游戏精灵的产生与控制

精灵是Funcode游戏中的一种术语,在Funcode平台,一切游戏资源都称为精灵,如图片、动画、特效、文字、声音等。所有的精灵都继承了class CSprite这个在Funcode中已经封装好的基类,在该类中定义了精灵坐标、X朝向等属性。本游戏中的鱼也是一种精灵。不论是玩家鱼、普通鱼还是特殊鱼,都继承了所有鱼的基类(class CgameSprite),而这一基类继承了class CSprite。自定义类的UML图如图3所示。当鱼产生时,创建该鱼的对象实例,将该鱼添加到存储链表中,给予坐标及速度。对于玩家鱼,游戏运行初始化时,会产生一个玩家鱼的精灵位于屏幕的水平垂直正中心。因为游戏地图宽高比为2∶1,所以设定玩家通过键盘控制鱼移动时,水平速度是垂直速度的两倍。对于普通鱼和特殊鱼,其产生的位置是在地图右侧边界的外侧产生,然后在边界右侧看不见的地方开始游出来,因此是在世界的右侧再加一点距离,并且需要将鱼的X朝向翻转过来,这样也可以避免其他鱼直接在地图内部创建后直接碰撞到玩家鱼。

2.4  等级及生命值的实现

所有鱼的基类(class CGameSprite)中定义了m_iLevel为鱼的等级,m_iHp为生命值。玩家控制的鱼(CMyFish)如果m_iLevel大于普通鱼(CNormalFish)的m_iLevel,则可以吃掉该普通鱼,玩家鱼的m_iHp值更新为原来该玩家鱼对象中m_iHp值加上该普通鱼对象中m_iHp值。玩家鱼只要碰到特殊鱼(CSpecialFish),必然是被减HP,而不用进行等级判断。减去的HP值,等于该特殊鱼对象本身的m_iHp大小。游戏进行时,需要通过CGameSprite中定义的SetLevel和SetHp函数对玩家鱼对象中的等级及HP值这两个数据实时更新。

2.5  碰撞的处理

(1)精灵与精灵碰撞的处理

在Funcode中提供了精灵与精灵碰撞事件的接口,并传入发起碰撞和接受碰撞精灵的名称,开发者需写碰撞事件代码[6]。在精灵与精灵碰撞事件处理的函数OnSpriteColSprite中,设置有两个参数:字符型参数“szSrcName”为发起碰撞的精灵名字,字符型参数“szTarName”为被碰撞的精灵名字。当引擎捕捉到精灵与精灵之间碰撞之后,即调用OnSpriteColSprite,首先通过Funcode提供的精灵碰撞的接口来比较各个字符串(“wanjiayu”为玩家鱼,“putongyu”为普通鱼,“teshuyu”为特殊鱼),判断哪两种鱼之间发生了碰撞,若是玩家鱼碰撞到了普通鱼或特殊鱼,则继续找到被碰撞鱼的对象实例,然后根据游戏规则对玩家HP值和等级的加减进行判断及处理。需要指出的是,碰撞之后,不管是谁吃谁,最终都要将被碰撞鱼的对象实例删除掉。精灵与精灵碰撞的处理流程图如图4所示。

(2)精灵与世界边界碰撞的处理

由于游戏中2种类型的鱼都是从右边游动到左边,所以需要设计一个世界边界。左边的世界边界比游戏中的场景要往左些,等鱼游出场景,碰到左边的边界之后,将其删除。该处理方式同样使用了Funcode提供的相关接口,具体实现方式如下:

在边界碰撞事件处理的函数OnSpriteColWorldLimit中,也同样分别设置了两个参数:字符型参数“szName”为碰撞到边界的精灵名字,整型参数“iColSide”為碰撞到的边界(0为左边,1为右边,2上边,3下边)。当精灵碰撞到边界时,首先根据“iColSide”的值来判断碰撞的是哪一边界,若其碰撞的边界为左边(即“iColSide”的值为0),则继续判断是不是要处理的鱼(即名字里包含“putongyu”或“teshuyu”的字符),若是,则将其删除。精灵与世界边界碰撞的处理流程图如图5所示。

3  结语

在游戏设计方面,作为一款益智类游戏,其简洁突出的图标设计、易上手的按键操作、精美的游戏形象、合理的游戏难度设定以及奖励机制的设计等均保证了游戏的趣味性及可玩性,能够带来良好的游戏体验。而在代码方面,经多次修改及测试,运行状况良好,无明显bug,并且有着可读性好、代码结构清晰等特点。同时,代码的拓展性良好,可以根据需求,进一步实现如对玩家分数进行保存并排名或者通过设置游戏时间以防沉迷等功能。

参考文献

[1] 国家中长期教育改革和发展规划纲要(2010-2020年) [EB/OL]. http://old.moe.gov.cn/publicfiles/business/htmlfiles/moe/ info_list/201407/xxgk_171904.html?authkey=gwbux.

[2] 汪红兵, 姚琳, 张敏, 等. 基于Funcode平台的软件课程设计[J]. 教育教学论坛, 2016, 31: 253-255.

[3] 朱敏, 罗岱. 色彩在学龄前儿童App界面设计中的应用探究[J]. 设计, 2019, 6: 128-129.

[4] 方浩, 张言林, 周婷婷, 等. 学龄前儿童教育类APP交互设计研究[J]. 包装工程, 2016, 37(20): 113-117.

[5] 郑晓丽, 陈子超. 基于游戏化学习的汉语拼音教育软件设计[J]. 教育信息技术, 2019, Z2: 109-112.

[6] 陈强, 刘洋. 基于FunCode平台的“太空星战”游戏开发与设计[J]. 信息与电脑(理论版), 2019, 2: 124-126.

猜你喜欢
软件设计
基于单片机SPCE061A的字幕机点阵式字母电子显示屏的设计制作