通过前三节我们已经用scratch做出了一个赛车的游戏,但是在运行的时候还存在一些bug,本节我们将学习如何定位问题,分析问题,然后解决bug(Geekid 游戏丨极品飞车v1.2 - 修订版)。

问题描述:

在运行程序时,左右方向键可以控制赛车改变方向移动。如果遇到一种极端的操作,比如快速的切换左右方向键,也就是让赛车左右来回快速变换车道,赛车就可能失去控制,一直朝着一个方向移动,最终掉落到公路外,如图。

Geekid 游戏丨极品飞车v1.2 - debug

分析原因:例如,在按下向左的方向键时,变量“X velocity”开始不断减小,瞬间切换到方向右键,此时如正好判断按键Key的值为R,那么就会跳过速度归零的重复操作,“X velocity”就会维持在一个固定的值,如图。

Geekid 游戏丨极品飞车v1.2 - debug

改造方案:简化左右键功能,只控制左右移动。然后将不进行按键操作速度归零的功能独立出来,如图。

Geekid 游戏丨极品飞车v1.2 - debug

问题解决了吗?让我们再运行程序测试一下,还是不断地切换左右方向键,发现问题依旧存在,变量“X velocity”会一直增加或者减少,而不是之前的固定值。

Geekid 游戏丨极品飞车v1.2 - debug

按理说不按方向键,程序会让变量“X velocity”值回到0的呀。

分析:程序里能改变变量“X velocity”的脚本有4处,,那必然是这里其中一处出了问题。例如,当按下左键,赛车向左侧移动,速度不断-1变为负值,然后快速按下方向右键,这时赛车向右侧移动,速度“X velocity”开始加1。在进行按键切换的瞬间,按键处于非按下状态,那么就会进入速度归零的操作,由于切换时速度“X velocity<0”,所以归零时会给速度变量“X velocity”加1,直到速度为0时停止。由于两个地方都在改变这个变量值,那么变量“X velocity”极有可能从-1瞬间加到1,因此会跳过重复执行停止的判断条件“X velocity=0”,这里就会陷入死循环(一直重复执行给变量+1)

问题找到了就很好解决了,为了不越过重复执行的停止条件,修改程序,如下图所示。如果左键抬起,速度开始归零,给变量+1直到小于0不成立。同理右键抬起,重复执行直到变量大于0不成立,如下图。

Geekid 游戏丨极品飞车v1.2 - debug

速度的问题解决了,同样的还有方向问题(方向无法自动回正),原因都是一样的,修改后的程序如下图。

Geekid 游戏丨极品飞车v1.2 - debug

第三处bug,这种情况不易发现,当赛车在非无敌状态下生命值还有2时,碰到了障碍物,根据游戏规则,生命值-1,游戏继续,但是有时间会结束掉。这是因为下图中的两段程序是并行的,执行中存在时差。

Geekid 游戏丨极品飞车v1.2 - debug

当生命值为2,先执行了碰到障碍物-1,此时生命值为1,这时判断游戏结束的程序发现生命值为1,也侦测到了碰到障碍物,那么执行停止全部,游戏结束了。其实这是碰到了同一个障碍物,由于执行的先后导致的错误,所以修订后作为判断语句的两个分支,不让它并行处理即可。

Geekid 游戏丨极品飞车v1.2 - debug

编写程序谁都不敢说一次性就能做到完美,而是通过不断地优化改进,渐渐的趋于完善,在这个过程中我们分析问题,解决问题可能会花费很多的时间,但是这种分析问题、解决问题的能力才是我们学习少儿编程的核心目的之一,才是提高我们自身能力的重要途径之一。

   少儿编程网scratch中文素材在线生成