Scratch全国少儿编程竞赛获奖作品《疯狂跑车》解析

本文介绍的作品是全国青少年创意编程与智能设计大赛创意编程比赛一等奖获得者童心恺同学的参赛作品。

作品说明

这是一款将玩跑车与交通安全知识相结合的跑车游戏。 通过这款游戏,玩家不仅可以训练自己手脑协同反应能力,还能够在游戏中学到各种《小学生交通安全知识》,通过寓教于乐方式加强知识的记忆,达到意想不到的学习效果。 游戏应用了克隆、克隆体单独控制、自定义积木块、逻辑判断、循环控制、随机选择等多种编程技术,增加了背景音乐和各种音效,各种技术手段相互嵌套使用,使得游戏的可玩性、趣味性和难易度都得到了很好的控制。

 

正文

 

做一名赛车手是很多男孩子的梦想,包括果冻老师小时候也是,那时候的四驱赛车是很多同学放学后相互比赛的玩具。大家一定看过《赛车总动员》这类的动画电影,也一定玩过像《极品飞车》《QQ飞车》这样的手机游戏,这些都是我们追求超越人体自身限制,实现速度梦想的载体。作为一名赛车的狂热爱好者,童心恺同学今天为我们带来了一款Scratch疯狂跑车的游戏,这个作品拥有和其它赛车游戏一样的追逐、躲避操作,但是还拥有不一样的知识问答环节,将《小学生交通安全知识》与游戏结合在一起,童心恺同学是想告诉大家追求速度固然刺激,但是安全才是第一。

 

就像上面的作品说明中介绍的,游戏中应用了克隆、克隆体单独控制、自定义积木块、逻辑判断、循环控制、随机选择等多种编程技术,增加了背景音乐和各种音效,各种技术手段相互嵌套使用。既然这个作品这么的厉害,那我们赶紧就来学习一下吧。

 

点击绿旗

 

点击绿旗之后,舞台区中首先映入眼帘的是游戏的开始界面。

 

 

 

 

开始界面中包含有三个游戏元素:一个“游戏开始”按钮,一个“游戏说明”按钮,还有一张背景图片。

 

在《视频课1》这篇文章中,果冻老师给大家介绍了如何实现鼠标悬停按钮变大的效果,而这里的两个按钮呢就使用到了文章中介绍的方法:

 

 

 

 

当把鼠标放在按钮上时,按钮会变大,提示我们可以点击它。于是,我们就先来点击一下“游戏说明”按钮,看看游戏是怎么操作的吧。

 

 

 

 

点击“游戏说明”按钮后会发出显示说明的广播,接收这个广播的当然就是说明的文字角色了。

 

 

 

 

接收到显示说明的广播后,说明角色的代码非常简单,把自己显示出来就可以了。

 

 

 

 

屏幕中的文字告诉我们,通过键盘上的上下左右按键控制跑车的方向,并躲避石头或者其它车辆。每一局有3次生命值,如果跑车撞到石头或者其它车辆都会减少1次生命值,3次生命值减少到0则游戏结束。游戏的过程中需要捡拾赛道上的金币,一个金币代表一分,游戏结束后会按照得分进行排名。游戏的赛道中还会随机的出现红包,捡到红包会出现交通安全知识问题,答对问题后可以一次性获得10个金币,并且跑车的速度会减慢。游戏结束后输入玩家的姓名,还可以存储玩家的游戏成绩。

 

好,了解游戏的玩法之后,我们就点击右下角的返回按钮,去开始比赛吧!

 

倒计时

 

在《极品飞车》这类手机游戏中,每一局比赛开始前都有一个3,2,1的倒计时过程,这个过程也是模拟现实中赛车比赛的,它让所有参赛车手做好心里准备,系好安全带,油门踩到底,准备出发!同样,这里也不能少了这个流程,当我们点击“游戏开始”的按钮之后,代码就会发出倒计时的广播。

 

 

 

 

按下鼠标判断的语句,也就是点击按钮的代码中,有一条将y坐标设为-130的语句,这条语句的作用是将原本显示在屏幕中间位置的“游戏开始”按钮移动到屏幕下方,这样是为了设置竞赛时游戏暂停后开始按钮显示的位置。

 

接着,设置屏幕上显示出生命值、金币数、速度值这三个变量的值,这是游戏中最重要的三个变量,就如同赛车的仪表盘一样,它们显示出了游戏中最关键的三个指标值。

 

然后,代码中发出了倒计时的广播并且等待接收这个广播的角色执行完。接收广播的一定就是倒计时角色了。

 

 

 

 

不知道同学们是否还记得在《喜迎奥运会》这个作品中,滑雪的游戏前也有一个3,2,1的倒计时,可见,和体育竞赛相关的作品都少不了倒计时的过程。《喜迎奥运会》中的倒计时是通过切换角色的造型来实现的,而这里也是一样的,3,2,1每个数字都对应有一个造型,我们在代码中只要按顺序切换下一个造型就可以了。

 

 

 

 

重复执行一共会执行3次,每次切换角色的造型为下一个,同时游戏中还会同步发出倒计时的音效,在角色的声音选项卡中分别导入了名字为1,2,3,Go的声音文件,代码中我们需要使用播放声音语句结合-倒计时这个变量,使得声音与造型在游戏中同步切换与播放。

 

倒计时的代码运行完后,会将是否移动和isPlayLive?这两个变量的值设置为1,是否移动这个变量非常重要,它是触发比赛开始的关键元素。代码中接着会发出ok的广播,从这里开始,游戏就进入真正的比赛环节了,我们需要操控赛车躲避障碍并完成答题任务。

 

 

 

 

开始比赛

 

从上面的截图中可以看到,比赛开始之后,屏幕中出现了很多的游戏元素,其中有地线、红包、石头、金币、路边的装饰,还有玩家控制的赛车以及随时出现的其它赛车。

 

 

 

 

游戏的背景是这样的:

 

 

 

 

而上面的这些角色组合起来就在背景上实现了竞速、躲避、得分、问答的这些游戏功能。下面果冻老师和大家一起来看看它们的代码吧。

 

首先是地线这个角色,它的造型呢就是一条白色的竖线。

 

 

 

 

而游戏中可以看到,道路中间白色实线的两侧分别都有一条白色的虚线,而且这两条虚线还会不停的向下移动,那一个单独的地线角色是如何实线两条虚线的样式呢?不用老师再介绍了吧,这一定使用了克隆大法。

 

 

 

 

前面说过是否移动这个变量非常重要,当倒计时完成后就会将它的值设置为1,所以说我们可以通过这个变量来判断比赛是否开始。如果比赛开始了,我们就每隔一段时间克隆一次地线角色,而这个间隔时间并不是固定的,游戏开始时,速度值这个变量的值被初始化成5,所以一开始每间隔1÷5=0.2秒克隆一段竖线,随着跑车速度不断的变快,速度值变量的值也会增加,而克隆的间隔时间就会变得越来越短,反映到屏幕上我们看到的道路虚线就会向下移动的越来越快。

 

克隆的过程写成了一个自制积木,由于道路两边分别有两条虚线,所以自制积木中要克隆两次:

 

 

 

 

这时候,在道路的最上方左右两侧就会各出现一个白色的竖线。

 

 

 

 

虽然代码一直在重复执行,但是克隆出的竖线都显示在同一个位置上了,所以接下来我们要让这些竖线向下移动,模拟出道路虚线在移动的效果。

 

 

 

 

这些竖线向下移动的速度也是在变化的,随着跑车的速度不断加快,竖线的移动也相应的加快,这样游戏整体的速度变化效果才能是一致的。

 

 

 

 

OK,地线角色从一个白色的竖线克隆变成两条不断移动的虚线的过程果冻老师就介绍完了,后面的角色就不会像地线角色这样说的这么详细了,因为它们和地线角色一样,都是克隆出很多替身,然后在道路上不停的向下移动,所以代码基本上都是类似的,而老师只会讲解那些不同的地方。

 

第二个角色,红包。红包与地线角色一样,也是每隔一段时间克隆一次自己,不同的是克隆的间隔时间是随机的,而且红包的显示位置也是随机的。

 

同学们都知道,红包角色最重要的功能就是,当赛车碰到红包时,游戏中会出现交通安全知识问题,答对问题就会一次性获得10个金币的奖励。既然要答题,那就必须提前准备好一套题库,那这套题库放在哪里呢?有同学立马想到了,对!就是列表,Scratch中能够能够保存数据的元素有两个,一个是变量,一个是列表,变量适合保存单个并且简单的数据,而多项数据,类似于一道一道题目的数据保存在列表中是最适合不过了。

 

有题目,那对应的必须有答案,所以,我们分别创建了名字为题目与答案的两个列表,这两个列表是属于红包角色的私有列表,然后按顺序一一对应的将文字内容输入进去就可以了。

 

 

 

 

童心恺同学在题库中预存了86道交通安全知识问题,同学们有没有感受到一丝丝的恐惧啊,这可比学校期末考试的试题数量还要多啊!可是,交通安全可不是开玩笑的,乱闯红灯、不按规定行车那是会威胁到每个人的生命安全的,所以题目再多我们都必须全答对,大家说对不对?

 

好了,题库已经有了,那接下来在代码中每次赛车捡到一个红包,就随机的从题库中抽取一道试题。

 

 

 

 

这段代码很长,果冻老师给每一行都添加了说明注释,方便大家理解。

 

代码中涉及到了几个变量。第一个-id变量用于区分问题答对的前后,因为问题答对前与答对后角色的造型是不一样的,一个会显示为红包的造型,一个会显示为金币的造型。

 

第二个是否移动变量,这个变量在之前介绍过,它用于判断游戏是否开始,当值为1时,赛车就会一直进行着比赛,当值为2时,比赛会暂停,因为当玩家答题的时候是不需要比赛运行的。

 

第三个是随机变量,它保存了数字1和题目的项目数(即86)之间的一个随机数,这个随机数后面会在题库中取出相应的题目和对应的答案。

 

第四个变量是回答,它用于保存玩家输入的文字,并且用于判断回答是否正确。代码中还有一个叫答案的变量,它保存的就是题目的正确答案,当玩家回答错误时,使用这个变量可以显示出正确答案。

 

第六个变量,速度值,在地线角色中也使用到了这个变量。这里每当我们答对一次问题,速度值都会减去1,这样游戏的难度就会减小,但是速度值最小不能小于5。而我们答错问题的时候,速度值就会增加1,相应的游戏难度也会增加,但速度值最大不会大于15,否则,玩家就反应不过来了。

 

第七个变量计时,这个变量主要用于游戏时间的计算,每过一秒它的值就增加1,当计时变量的值增加到10时,就会将速度值变量加1,并且计时变量重置为0,换句话说游戏每过10秒,速度值就会增加1,游戏难度就会增加一级。但是如果我们答对了问题,除了速度值减1外,计时变量也会重置为0,这无疑使得游戏的难度大大降低了。

 

好,理解了这七个变量的含义后,基本上红包角色的逻辑就搞清楚了。

 

当我们答对问题之后,屏幕中会克隆出10枚金币,并且自动增加到金币数这个变量之中。

 

 

 

 

十枚金币依次从赛车的位置滑行到屏幕左上角金币数变量显示的位置,并将变量的值增加10,同时游戏后台会播放收获到金币的声音,大家玩游戏的时候应该最爱听到这种声音了吧,是不是?哈哈!

 

到这里,第二个红包角色的代码就分析完了,一个红包就能一次获得10枚金币,还能减缓赛车速度,这简直就是开挂的奖励啊!还犹豫什么,这个红包是必捡的啊。

 

 

 

 

第三个角色,石头,它是游戏中的障碍物,碰到它就会使生命值减1,所以大家要离这个东西远一点。同样的,石头每间隔一段时间出现,出现的时间也是随机的。

 

石头角色一共有三种造型:

 

 

 

 

这三个造型看起来区别不大嘛!它们会在游戏中随机的出现。

 

 

 

 

如果赛车碰到了石头,生命值就会减少1次:

 

 

 

 

代码中有一个无敌?的变量,这是不是说明赛车可以开启无敌模式?哇,太棒了,这才是神级开挂啊!但是别着急,无敌模式我们后面再看,这里如果没有开启无敌,那游戏就会暂停并且将生命值变量减去1,接着会发出启动特效的广播。

 

接收启动特效广播的角色是爆炸特效:

 

 

 

 

它会模拟出赛车碰撞燃烧爆炸的效果:

 

 

 

 

角色一共有6个造型,在代码中将这些造型按顺序显示一篇就形成了爆炸的效果。

 

同时,还会判断是否还有生命值,如果还有命,那么就会将是否移动变量设置为1,游戏继续进行。

 

 

 

 

第四、第五个角色分别是钱和路边装饰,这两个角色就没有什么特别的要介绍了,赛车捡到钱,也就是金币会增加金币数,而路边装饰就是赛道两边装饰性的房子和树木,它们只是随着赛道一起移动罢了。

 

第六个角色,车2,也就是赛道上的其它跑车,是另一种障碍物,碰到它们同样会减少游戏的生命值,不同的是,石头在赛道上是固定不动的,可是这些跑车与玩家控制的赛车一样是在运动中的,所以它们更加的危险。而且,这些跑车还会从上下两个方向随机的驶出来,上面出现的车还好躲,但是下面出现的就太考验我们的反应能力了,这无疑会增加游戏的难度。

 

 

 

 

从代码中能够看到,上下两个方向的跑车是随机出现的,通过面向XX方向语句可以调整车头的方向,四个造型对应不同的四种颜色款式的跑车,它们也会在游戏中随机出现。接着使用重复执行直到语句配合将y坐标增加XX语句使跑车一直的移动,你发现了吗?朝下移动的跑车是比朝上移动的跑车速度快一点点的。

 

到这里,开始比赛的广播发出后,游戏中所涉及到的角色就介绍的差不多了,最后还有一个,那就是玩家操控的赛车角色了,我们需要控制它躲避石头,躲避其它跑车,捡拾金币,捡拾红包并回答问题。

 

玩家操控赛车的代码:

 

 

 

 

果冻老师玩着玩着突然发现一个问题,这是一个没有终点的游戏!只要不碰到石头或者其它跑车,比赛就不会停止而一直进行下去,童心恺同学这是在考验老师的耐力呀!

 

还有一点老师要提醒一下,游戏并不能手动开启无敌模式,无敌的状态只有在赛车刚刚启动不断闪烁的时候是开启的,经过短暂的几秒后,赛车就恢复了正常的状态。想要开挂作弊的同学还是不要妄想了,乖乖正常的游戏吧,除非。。。你自己写一个无敌模式!

 

当赛车碰到石头或者其它赛车三次之后,生命值变量就减为了0,这时候代码会发出game over的广播。

 

GAME OVER

 

游戏结束后,屏幕上首先会出现GAME OVER的提示。

 

 

 

 

同时,F1世界冠军得主,传奇车手费尔南多·阿隆索会出现并告诉小朋友们,要想成为一名合格的赛车手,安全知识的学习是必须过关的哦。

 

 

 

 

传奇车手提示我们接下来输入我们自己的姓名,并按下空格键,进入整个游戏的最后一步。

 

 

 

 

排行榜

 

游戏的最后一页其实是一张排行榜,记录我们每次游戏获得的金币数,并进行排序。这一段代码还稍稍有点复杂,果冻老师就拿出来再讲一下。

 

当接收到game over1的广播后,首先会让玩家输入姓名:

 

 

 

 

记录信息这个自制积木就是记录本局获得的金币数,并显示出排行榜列表:

 

 

 

 

实现排行榜列表并不是想象中那么简单,要将每一局获得的金币数插入正确的位置,需要判断不同的列表状态。第一种状态,排行榜列表是空的,也就是第一次完成游戏后,这种情况很简单,将用户名和本次获得金币数直接插入列表就行了。第二种列表状态,排行榜不是空的,但是本局的金币数小于排行榜最后一名的分数,那我们直接将金币数添加到排行榜的最后一行就可以。第三种列表状态,排行榜不是空的并且本局的金币数需要插入到列表的中间,这种情况稍稍有点复杂,我们需要将排行榜进行循环,将金币数与每一行的分数进行对比,如果大于了某一行的分数值,那就将这个金币数插入到这一行的上方。

 

第二种列表状态需要取得最后一名的分数,第三种列表状态则需要循环取得每一行的分数。取得分数的过程则是通过“获得冒号后的数字”这个自制积木实现的。

 

 

 

 

排行榜中每一行的数据都形如“张三:45”这样,要获取每一行中的分数,就需要先知道冒号的位置,然后再将冒号后面的数字取出来,并保存在retVal变量中。代码中有两个重复执行,第一个重复执行就是找出冒号的位置,然后在第二个重复执行中把冒号后面的数字保存在变量中。其中,有一个j变量很重要,两个重复执行中都用到了它,这个变量是一个数字变量,每次循环它的值都会增加1,主要的作用呢就是通过它来取出数据中的每一个字符。

 

排行榜作为最后一个界面,当它显示出来时整个游戏也就结束了。

 

 

 

 

总结

《疯狂跑车》这个游戏作品的代码到这里就学习完了,其中,比较核心的编程技术就是克隆,无论是赛道上的地线,还是能够增加得分的金币、红包,又或是阻碍赛车行驶的石头和其它跑车,都是通过克隆技术实现的。然后再配合上随机数语句,就可以源源不断的产生各种不同造型的石头与跑车。游戏的最后还实现了一个排行榜的功能,排行榜实际上就是数学中比较简单的一种排序算法,通过重复执行遍历整个列表,将金币数与列表中的分数进行对比,最后将金币数插入合适的位置。同学们别忘了,老师在文章里还给你留了一个小任务,就是给游戏添加上无敌模式,你有没有思路了呢?好好的想一想,如果想好了就赶快去实现吧。

给TA赞助
共{{data.count}}人
人已赞助
综合资讯

打砖块游戏-第12届蓝桥杯Scratch省赛1真题第5题

2023-7-22 8:14:41

综合资讯

scratch 鼠标悬停按钮变大的效果

2023-7-24 8:39:08

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索