少儿编程游戏CodeMonkey通关攻略:第61-65关
这次我们接着闯关,上一次咱们一起闯过了关于for循环的第56-60关,这次我们再接再厉,再闯过与for循环有关的第61-65关。
你准备好了接受挑战了吗?跟着我直接进入游戏吧!
第61关
这是进入第61关的画面:

猴博士告诉我们,for循环可以用来指定其他对象。在前五关中,for循环多用来指定香蕉。在这5关里,我们还可以用for循环指定小龟龟。事实上,我们可以用for循环指定任意对象做同样的动作,只要这个对象不止一个。

看看这个画面,我们分析一下:猴子如果要吃到香蕉,那么就需要跨过三条小河,但是我们这个游戏是假定猴子不会游泳的。这时候,就需要小龟龟走过来,帮助猴子跨过这三条河,从而让猴子吃到香蕉。
我们可以看看代码:

如果直接点击运行,可以看到如下画面:

上图中,小龟龟没有走到猴子面前,自然猴子也就无法跨过小龟龟的背部,也就无法吃到香蕉。

我们估计小龟龟还需要再走10步才能到猴子面前,所以x最好设置为x=20。如果不确定距离,别忘了我们还有左上角的小尺子呢。

可以看到,x=20正好让小龟龟稳稳地停在了猴子面前。不过为了让小猴子吃到香蕉,还需要在代码下面加一句,比如:

这最后一句是让小猴子走向香蕉的。效果如下:

闯关成功!

第62关
仔细观察这一关,我们发现猴子站在石头上,遥望着可能是他的家乡(五指山?)的地方,在这里,他可能要背几首古诗:滚滚长江东逝水?湛湛长江去,冥冥细雨来?
背完了古诗,猴子觉得肚子有点饿,想吃几根香蕉。可是这茫茫大海中,哪里有香蕉呢?他不免悲从心来,又吟诗一首:无边落木萧萧下,不尽长江滚滚来?
到这里,我们要告诉猴子一个生活中的哲学:只要你转身,生活中处处都是惊喜!
猴子的背后有四根香蕉呢!

为了帮助猴子吃到香蕉,我们来改改代码:

代码中,turnTo raft这句只是让猴子转身,面向木筏。可是为了让猴子吃香蕉,我们需要让猴子走到木筏上,然后就可以开始循环了:面向香蕉0,走向香蕉0;面向木筏,走向木筏;面向香蕉1,走向香蕉1,;面向木筏,走向木筏;。。。。。。
这可以用一个循环表示:

代码的含义是:
1. for b in bananas:对于bananas里的每一个香蕉b
2. turnTo raft:让猴子面向木筏
3. step distanceTo raft:让猴子走向木筏
4. turnTo b:让猴子面向香蕉b
5. step distanceTo b:让猴子走向香蕉b
运行效果如下:

猴子终于不用吟诗了!闯关成功!

吃完了香蕉猴子会干嘛呢?也许什么都不想吧。
巨海一边静,长江万里清。
第63关
猴子棉铃的挑战越来越复杂了,这一关的界面如下:

可以看到,猴子不能直接去吃到香蕉,因为在程序里,猴子还没有学会自动拐弯的技能。
也就是说,如果我们写的代码如下:

那会把猴子带到沟里去的,那到底要怎么写呢?

我们如果点击猴子脚下和面前的这些像土豆一样的小岛,就会发现,其实他们也是对象,也可以用于for循环!

那么我们自然会想到,如果让猴子沿着这些小岛(islands)走,就可以经过这些香蕉,那顺便吃到香蕉,不是自然而然的事情吗?代码如下:

点击运行,效果如下:

看来这个挑战也没有那么复杂嘛!

有时候,只要我们换个正确的对象(把香蕉换成小岛),一切都会变得容易起来。
这句话没有引申义,不要多想。
第64关
随着猴子越来越厉害,也就是小朋友运用编程解决问题的能力越来越强,小猴子面临的挑战也越来越复杂!

在这一关里,猴子怎么才能吃到三个香蕉呢?
猴子需要先走到最上面那条河里的小龟龟的背上,然后小龟龟背着猴子游到第一条河里的香蕉;
然后猴子走到中间那条河里的小龟龟的背上,然后小龟龟背着猴子游到中间那条河里的香蕉;
然后猴子走到最下面那条河里的小龟龟的背上,然后小龟龟背着猴子游到最下面那条河里的香蕉。
我们看看代码:

如果直接点击运行,我们可以看到这个效果:

遇到失败,第一反应是找出问题并且解决问题,不要有失败的情绪。
我们分析一下:第一个问题,猴子没动。这个好解决:把step 0改成step 7即可,7是猴子和小龟龟之间的距离,用尺子测量出来的。第二个问题,小龟龟只走了与香蕉之间距离的一半。这个也好解决,把t.step 10改成t.step 20即可,20是小龟龟和香蕉之间的距离,这也是用尺子测量出来的。
于是,改正之后的代码如下:

点击运行,效果如下:

猴子的确吃到了三个香蕉,但是我们发现,我们只得到了一颗星!

原因是我们用step 7这行代码让猴子走到小龟龟背上,这个是不那么聪明的做法。其实我们不需要测量猴子和小龟龟之间的距离,用代码step distanceTo t就可以让猴子自动走到小龟龟的背上。
不过,为什么小龟龟到香蕉的距离不用step distanceTo b之类的代码呢?
这是因为小龟龟和香蕉都是变动的,也就是小龟龟0游到香蕉0,小龟龟1游到香蕉1,小龟龟2游到香蕉2。所以我们需要用一个标量去完成for循环,for循环的对象应该是标量0,1,2,而不是小龟龟0,小龟龟1, 小龟龟2。
一个可能的代码是:
for b in [0 1 2]
step distanceTo turtles[t]
turtles[t].step distanceTo bananas[t]
但是这个代码在这里是无法运行的。也许是目前还没有学到这个知识点。这里我们知道真实的代码中可以这么做就可以了。
修正后的代码如下:

点击运行,看看效果:

挑战成功!

第65关
这一关里,我们会遇到哪些新的挑战呢?

我们可以看到,每个香蕉的上面有一个坑。我们的猴子只能吃到香蕉,吃到香蕉猴不能多走一步,这也好说,用step distanceTo b就可以了。但是如何让猴子往回走到小龟龟背上,并且正面朝上呢?有两个方案:
方案1:转身180度,走回小龟龟的背上,然后再转身180度;
方案2:倒着走小龟龟与香蕉之间的距离;
我个人觉得方案2更简洁一些,不过为了实施方案2,我们需要用一个变量明确定义猴子与香蕉之间的距离。
所以我们要把原来的代码:

改成:

这段代码里,每一行的含义是:
1. for b in bananas:对于bananas里的每个对象b
2. d = distanceTo b:d是猴子与对象b之间的距离
3. step d:往前走距离d
4. step -d:往后走距离d
5. turtle.step 8:小龟龟往左走距离8,让猴子面对下一个香蕉。
点击运行,效果如下:

挑战成功!

这一周的5关又这样被攻克了,在这5关里,我们知道了for循环里的对象可以是任何一个对象。
这算是对上一周的for循环给出了新的玩法。
希望大家的孩子们玩的开心~