周末啦!又可以更新CodeMonkey的闖關(guān)教程啦~
這次我們接著闖關(guān),上一次咱們一起闖過了關(guān)于for循環(huán)的第56-60關(guān),這次我們?cè)俳釉賲枺訇J過與for循環(huán)有關(guān)的第61-65關(guān)。
你準(zhǔn)備好了接受挑戰(zhàn)了嗎?跟著我直接進(jìn)入游戲吧!
第61關(guān)
這是進(jìn)入第61關(guān)的畫面:
猴博士告訴我們,for循環(huán)可以用來指定其他對(duì)象。在前五關(guān)中,for循環(huán)多用來指定香蕉。在這5關(guān)里,我們還可以用for循環(huán)指定小龜龜。事實(shí)上,我們可以用for循環(huán)指定任意對(duì)象做同樣的動(dòng)作,只要這個(gè)對(duì)象不止一個(gè)。
看看這個(gè)畫面,我們分析一下:猴子如果要吃到香蕉,那么就需要跨過三條小河,但是我們這個(gè)游戲是假定猴子不會(huì)游泳的。這時(shí)候,就需要小龜龜走過來,幫助猴子跨過這三條河,從而讓猴子吃到香蕉。
我們可以看看代碼:
如果直接點(diǎn)擊運(yùn)行,可以看到如下畫面:
上圖中,小龜龜沒有走到猴子面前,自然猴子也就無法跨過小龜龜?shù)谋巢浚簿蜔o法吃到香蕉。
我們估計(jì)小龜龜還需要再走10步才能到猴子面前,所以x最好設(shè)置為x=20。如果不確定距離,別忘了我們還有左上角的小尺子呢。
可以看到,x=20正好讓小龜龜穩(wěn)穩(wěn)地停在了猴子面前。不過為了讓小猴子吃到香蕉,還需要在代碼下面加一句,比如:
這最后一句是讓小猴子走向香蕉的。效果如下:
闖關(guān)成功!
第62關(guān)
仔細(xì)觀察這一關(guān),我們發(fā)現(xiàn)猴子站在石頭上,遙望著可能是他的家鄉(xiāng)(五指山?)的地方,在這里,他可能要背幾首古詩:滾滾長江東逝水?湛湛長江去,冥冥細(xì)雨來?
背完了古詩,猴子覺得肚子有點(diǎn)餓,想吃幾根香蕉。可是這茫茫大海中,哪里有香蕉呢?他不免悲從心來,又吟詩一首:無邊落木蕭蕭下,不盡長江滾滾來?
到這里,我們要告訴猴子一個(gè)生活中的哲學(xué):只要你轉(zhuǎn)身,生活中處處都是驚喜!
猴子的背后有四根香蕉呢!
為了幫助猴子吃到香蕉,我們來改改代碼:
代碼中,turnTo raft這句只是讓猴子轉(zhuǎn)身,面向木筏。可是為了讓猴子吃香蕉,我們需要讓猴子走到木筏上,然后就可以開始循環(huán)了:面向香蕉0,走向香蕉0;面向木筏,走向木筏;面向香蕉1,走向香蕉1,;面向木筏,走向木筏;。。。。。。
這可以用一個(gè)循環(huán)表示:
代碼的含義是:
1. for b in bananas:對(duì)于bananas里的每一個(gè)香蕉b
2. turnTo raft:讓猴子面向木筏
3. step distanceTo raft:讓猴子走向木筏
4. turnTo b:讓猴子面向香蕉b
5. step distanceTo b:讓猴子走向香蕉b
運(yùn)行效果如下:
猴子終于不用吟詩了!闖關(guān)成功!
吃完了香蕉猴子會(huì)干嘛呢?也許什么都不想吧。
巨海一邊靜,長江萬里清。
第63關(guān)
猴子棉鈴的挑戰(zhàn)越來越復(fù)雜了,這一關(guān)的界面如下:
可以看到,猴子不能直接去吃到香蕉,因?yàn)樵诔绦蚶铮镒舆€沒有學(xué)會(huì)自動(dòng)拐彎的技能。
也就是說,如果我們寫的代碼如下:
那會(huì)把猴子帶到溝里去的,那到底要怎么寫呢?
我們?nèi)绻c(diǎn)擊猴子腳下和面前的這些像土豆一樣的小島,就會(huì)發(fā)現(xiàn),其實(shí)他們也是對(duì)象,也可以用于for循環(huán)!
那么我們自然會(huì)想到,如果讓猴子沿著這些小島(islands)走,就可以經(jīng)過這些香蕉,那順便吃到香蕉,不是自然而然的事情嗎?代碼如下:
點(diǎn)擊運(yùn)行,效果如下:
看來這個(gè)挑戰(zhàn)也沒有那么復(fù)雜嘛!
有時(shí)候,只要我們換個(gè)正確的對(duì)象(把香蕉換成小島),一切都會(huì)變得容易起來。
這句話沒有引申義,不要多想。
第64關(guān)
隨著猴子越來越厲害,也就是小朋友運(yùn)用編程解決問題的能力越來越強(qiáng),小猴子面臨的挑戰(zhàn)也越來越復(fù)雜!
在這一關(guān)里,猴子怎么才能吃到三個(gè)香蕉呢?
猴子需要先走到最上面那條河里的小龜龜?shù)谋成希缓笮↓旪敱持镒佑蔚降谝粭l河里的香蕉;
然后猴子走到中間那條河里的小龜龜?shù)谋成希缓笮↓旪敱持镒佑蔚街虚g那條河里的香蕉;
然后猴子走到最下面那條河里的小龜龜?shù)谋成希缓笮↓旪敱持镒佑蔚阶钕旅婺菞l河里的香蕉。
我們看看代碼:
如果直接點(diǎn)擊運(yùn)行,我們可以看到這個(gè)效果:
遇到失敗,第一反應(yīng)是找出問題并且解決問題,不要有失敗的情緒。
我們分析一下:第一個(gè)問題,猴子沒動(dòng)。這個(gè)好解決:把step 0改成step 7即可,7是猴子和小龜龜之間的距離,用尺子測(cè)量出來的。第二個(gè)問題,小龜龜只走了與香蕉之間距離的一半。這個(gè)也好解決,把t.step 10改成t.step 20即可,20是小龜龜和香蕉之間的距離,這也是用尺子測(cè)量出來的。
于是,改正之后的代碼如下:
點(diǎn)擊運(yùn)行,效果如下:
猴子的確吃到了三個(gè)香蕉,但是我們發(fā)現(xiàn),我們只得到了一顆星!
原因是我們用step 7這行代碼讓猴子走到小龜龜背上,這個(gè)是不那么聰明的做法。其實(shí)我們不需要測(cè)量猴子和小龜龜之間的距離,用代碼step distanceTo t就可以讓猴子自動(dòng)走到小龜龜?shù)谋成稀?/p>
不過,為什么小龜龜?shù)较憬兜木嚯x不用step distanceTo b之類的代碼呢?
這是因?yàn)樾↓旪敽拖憬抖际亲儎?dòng)的,也就是小龜龜0游到香蕉0,小龜龜1游到香蕉1,小龜龜2游到香蕉2。所以我們需要用一個(gè)標(biāo)量去完成for循環(huán),for循環(huán)的對(duì)象應(yīng)該是標(biāo)量0,1,2,而不是小龜龜0,小龜龜1, 小龜龜2。
一個(gè)可能的代碼是:
for b in [0 1 2]
? ? ? step distanceTo turtles[t]
? ? ? turtles[t].step distanceTo bananas[t]
但是這個(gè)代碼在這里是無法運(yùn)行的。也許是目前還沒有學(xué)到這個(gè)知識(shí)點(diǎn)。這里我們知道真實(shí)的代碼中可以這么做就可以了。
修正后的代碼如下:
點(diǎn)擊運(yùn)行,看看效果:
挑戰(zhàn)成功!
第65關(guān)
這一關(guān)里,我們會(huì)遇到哪些新的挑戰(zhàn)呢?
我們可以看到,每個(gè)香蕉的上面有一個(gè)坑。我們的猴子只能吃到香蕉,吃到香蕉猴不能多走一步,這也好說,用step distanceTo b就可以了。但是如何讓猴子往回走到小龜龜背上,并且正面朝上呢?有兩個(gè)方案:
方案1:轉(zhuǎn)身180度,走回小龜龜?shù)谋成希缓笤俎D(zhuǎn)身180度;
方案2:倒著走小龜龜與香蕉之間的距離;
我個(gè)人覺得方案2更簡(jiǎn)潔一些,不過為了實(shí)施方案2,我們需要用一個(gè)變量明確定義猴子與香蕉之間的距離。
所以我們要把原來的代碼:
改成:
這段代碼里,每一行的含義是:
1. for b in bananas:對(duì)于bananas里的每個(gè)對(duì)象b
2. d = distanceTo b:d是猴子與對(duì)象b之間的距離
3. step d:往前走距離d
4. step -d:往后走距離d
5. turtle.step 8:小龜龜往左走距離8,讓猴子面對(duì)下一個(gè)香蕉。
點(diǎn)擊運(yùn)行,效果如下:
挑戰(zhàn)成功!
這一周的5關(guān)又這樣被攻克了,在這5關(guān)里,我們知道了for循環(huán)里的對(duì)象可以是任何一個(gè)對(duì)象。
這算是對(duì)上一周的for循環(huán)給出了新的玩法。
希望大家的孩子們玩的開心~
周末愉快!