陈新龙
前不久,小编和我一起讨论一套Scratch的试卷,两人对一道基础题“小猫躲苹果”却很久没有想出正确的答案。
题目是这样的:天上不停地掉苹果,屏幕内苹果数要超过两个,小猫能自动躲开。(如图1)
這道题是试卷基础题的第三题,理论上应该是不会太难的。但是我们两个人都把题目解法复杂化了,导致几个小时也没写出合格的程序。题目要求随机落下至少两个苹果,这一部分实现很简单。因为小猫需要对苹果侦测,下落的苹果不能用克隆。真正的难点在于自动左右移动躲避苹果。
作为前车之鉴,说说我们的错误思路吧。在做题目的时候一般先考虑从简单情况开始,就先做了一个苹果的随机掉落,判断如果“苹果X坐标-小猫X坐标”的绝对值小于100时认为苹果会砸到小猫,小猫马上移动一段距离。躲避一个苹果是成功的,但是第二个苹果加进去后需要判断的情况一下多了起来,如果两个苹果刚刚好一左一右,那么小猫就可以移动到两个苹果的中间;如果苹果都在左边,那么就移动到右边;如果苹果都在右边则移动到左边;但是遇到舞台边界该怎么计算,这样复杂的条件判断难免会出现问题,这还没有考虑三个苹果的情况。关键是这只是第三题,一套卷子只有三小时的答题时间,不该写这么多复杂的语句。
我静下心来推翻之前的思路从头思考。在仔细梳理各个模块的属性后,注意到“到鼠标指针的距离”这个模块时恍然大悟,简单的事情让我俩想复杂了。
下面是程序代码,代码量确实很少。
两个苹果角色相同代码:X坐标取随机数,等待何时的时间后显示,重复执行下落。这里使用了循环,用来控制苹果掉落的位置和掉落的时间,这里提醒一下苹果掉落了之后不要忘记还要再回到上面。(如图2)
小猫代码:循环判断如果“小猫”到“苹果1”距离小于100或到“苹果2”距离小于100,那么随机改变X坐标的位置。虽然有可能移动后还会碰到苹果,但是因为程序执行足够快,继续换下一个X坐标就可以了,人眼看不出来的。这里用到了侦测到其他角色的距离,加判断语句,保证小猫附近有苹果时会移动。(如图3)
回想起来,本来一道简简单单的题目被复杂化了。没有能够完全理解各种模块的用法是这次问题的根源。
另外这次经历也提醒我,在解决问题时,必须先仔细分析题目要求,构造可行思路。遇到疑难时冷静一下,有时也许还需要有推倒重来的勇气。