[學習重點]:
了解無窮迴圈、有限迴圈、巢狀迴圈、有條件執行的迴圈這四種迴圈的概念和使 用時機。
一、無窮迴圈與有限迴圈
[範例一]:當程式開始執行時,蝴蝶即會上下左右飛舞
(二)動手做:
[自己動手做]
步驟一:加入物件
你可以在 Animals 內找到蝴蝶兔子,在 Animals 內的 Bugs 資料夾內找到蝴蝶,
或是直接使用原本 if/else 的檔案。
步驟二:編寫程式碼
1、編輯程式碼 butterfly.fly。
(1)先在 butterfly 下新增一個 fly 的 method。
(2)將 Loop 標籤拉進 butterfly.fly 程式碼編輯區,在 times(次數)的地方選擇 infinity(無窮的)。
(3)再將 move 標籤拉進 loop 中,選擇(A)移動方向和(B)距離。
(A)
(B)
(4)將上面的動作再重複三次,分別設定成下圖的樣子。
(5)將 fly 加入 world.my first method 中,這樣等程式一開始執行的時 候,就會自動執行 butterfly.fly。
2、按 play 觀看結果,可以發現蝴蝶上下左右移動,但是翅膀卻沒有在拍動,
對不對?所以我們現在來編輯翅膀拍動的程式碼:
(1)先在 butterfly 下新增一個 flp 這 個 method。
編輯 flap 程式碼:先加入兩段 Do together 標籤,再分別在兩段 Do together 中加入下面兩段程式碼
(A)
Do together{
butterfly.leftWing.roll.left = 0.5 revolutions ; butterfly.rightWing.foll.right = 0.5 revolutions ; }
(B)
Do together{
butterfly.leftWing.roll.right = 0.5 revolutions;
butterfly.rightWing.foll.right = 0.5 revolutions }
(B)
(A)
3、接下來將 Do togher 標籤拉進 butterfly.fly 中,再將左邊的 flap 和下面的 butterfly move up 0.01 meters,拉進 Do together 中。
完成後如下圖,對照看看你做的是否正確。
4、同樣的動作再重複三次,完成後如下圖。
5、完成!
(三)概念說明:
迴圈最簡單的定義就是某指令或動作執行不止一次。以生活上的例子來說,
車子要不斷的往前進,輪子必需不斷的轉,轉愈多圈車子跑愈遠。使用迴圈 的好處在於方便,省時。我們不需要重覆編輯或複製標籤,只要設定重覆的 次數即可。在Alice的編輯環境中有個Loop標籤,可以設定重覆次數,如果 是無窮盡的重覆的話,則屬無窮迴圈,選擇infinite times,如此一來你所設 定在loop內的動作會一直重覆進行,直到你按下stop按鈕為止;如果需要設 定重覆次數的話,可以在下拉式選單中設定想要的次數,設定完重覆次數之 後,此迴圈即成為有限迴圈。
二、巢狀迴圈
[範例二]
旋轉摩天輪,連接兩個車輪的橫桿會向右旋轉 10 次 ;橫桿每向右旋轉 1 次,兩個車輪分別會向左旋轉 2 次。
[自己動手做]
步驟一:加入物件
在 Amazements 的分類裏可以找到這個 FerrisWheel(旋轉摩天輪物件)。
步驟二:編寫程式碼
1、先編寫橫桿往右轉 10 圈的程式碼
(1)將指令區的 loop 標籤拉進程式碼編輯區,並將次數設定為 10 次。
做完這個動作之後,你應該會看到如下圖的結果。
再將 Do together 的標籤拉進 Loop 中。
(2)選擇樹狀結構中 ferrisWheel 下 的 doublewheel。
(3)再選擇 doublewheel 中 methods 的 roll。
(4)direction 選 right,amount 選 1 revolution,做完上述的動作之後你會看到 如下圖的結果,再按下 more,style 選 abruptly,選擇 abruptly 是為了讓程 式執行能夠流暢,因為 Alice 預設的 style 是 gently,選擇 gently 的話,會 使得每次程式在執行的開始和結束的時候,都會慢下來。
(5)選完 style 之後再按一次 more,會有 duration 的選項,這個選項是指定程 式在幾秒內會做完這行指令。這裏我們選擇 2 秒。做完上述的動作之後你 會看到如下圖的結果。
2、重覆上面的動作,再編寫兩個車輪向左轉 2 圈的程式碼,完成後你會看到如 下兩個程式碼,因為是巢狀迴圈,所以我們將第二個迴圈拉進第一個迴圈內,
這樣就可以完成這個範例了。
3 完成!
1
2
[概念說明]:
在一層 loop 迴圈中再包一層 loop 迴圈或是多層 loop 迴圈,就稱為巢狀迴圈
以這個程式碼來看,當外層迴圈執行一次時,內層迴圈會執行二次;當外層迴圈 執行十次時,內層迴層總共會執行二十次。
三、有條件的迴圈
[範例三]
在海裏這種弱肉強食的世界,鯊魚吃掉金魚是很常見的!現在我們來摸擬鯊魚吃 掉金魚的情況。
鯊魚(shark)追逐金魚(goldfish)。 當鯊魚(shark)和金魚(goldfish)的 距離小於 0.5 公尺(meters)時,鯊魚
(shark)吃掉金魚(goldfish)。
(一) 動手作
步驟一:加入鯊魚(shark)和金魚(goldfish)這兩個物件。
步驟二:編寫 goldFish.randomMotion 和 goldFish.flee 這兩個程式碼。
1、設定 goldfish 上下、左右、前後的動作。因為當 move up 的值為正的時候,
例如 move up 0.1 meter,即表示向上移動 0.1 公尺;當 move up 的值為負 的時候,例如 move up -0.1 meter,即表示向下移動 0.1 公尺。所以雖然有 上下、左右、前後總共六個方向,但是我們只要設定 up、left、forward 這三 個方向就可以了。
利用 World’s details 內的函數 random number,可以讓 Alice 隨機 產生一個由我們決定範圍內的數值。
增加 min 和 max 這兩個數字型態的 parameters 參數
2、goldflish.flee 這段程式碼的功用是讓金魚可以左右游來游去,goldfish.tail 指 的是金魚的尾巴,turn left 和 turn right 是讓他可以左右擺動。最後再加上 goldfish.randomMotion,傳給 goldfish.randomMotion 兩個數值,分別是 min(最小值)和 max(最大值),有了這兩個數值之後,Alice 會隨機產生介於 mix 和 max 這兩個數之間的任何值。利用現在我們設定 min = - 0.2,max = 0.2,,goldfish.randomMotion 便會傳給 gold.flee 介於- 0.2 ~ 0.2 之間的值。
3、編寫 shark.swim 和 shark.eat 這兩個程式碼。
(1)鯊魚只需要向左向右游和向前游而已,所以把向左向右游和向前游設定完
就好了。
(2)接下來編輯 shark.eat 的程式碼如下圖。在第二行 what set opacity to 0
(0%),意思是將 what 這個物件的可見度設為 0。最後一行 shark.jaw turn backward 0.1 revolution 意思是 shark 的 jaw(下巴)向後轉 0.1 revolution,
一個 revolution 是 360 度,0.1 revolution = 36 度。
請檢查你的 goldfish’s details 和 shark’s details 是不是如下圖所示?在 goldfish 裏有 flee 和 randomMotion 這兩個 methods,在 shark 裏有 swim 和 eat 這兩個 methods。
(3)設定 while 條件式
A. 將 Do in order 標籤拉進 World.my first method 的程式編輯區中,再將 while 標籤拉進 Do in order 中。
B. 接 下 來 選 擇 World’s 中 的 functions,在 math 分類中選 擇 a > b。
C. 將 a > b 標籤拉進 true 中。
D. 設定 a、b 的值,這裏我們先 將 a、b 設為 0 , 0。
E. 因 為 我 們 要 設 的 條 件 是 ” 距 離”,在 goldfish’s 的 functions 中選擇 distance in front of。
F. 將 goldfish distance in front of 拉進 while 右邊兩個方框中,左邊的那個 方框裏。
(10)將 object 設為 goldfish -> the entire goldfish。
(11)將目標指向 shark-> the entireshark。Goldfish distance in front ofshark 的意思是金魚和鯊魚前端的距離。
(12)將右邊的方框數值設為 0.5。
4、新增 Do in order together
(1)為了讓 shark 去追 goldfish,所以我們 要讓 shark 朝 goldfish 的方向游去。在 shark’s 的 methods 中,選擇 point at,
將 turn to face 標籤,拉進 while 中的 Do in order。
(2)設定完 duration = 0 seconds 和 style = abruptly,接下來再將 Do together 和 shark.swim 和 goldfish.flee 放入 Do together 中。
(3)最後在 Do together 後加入 shark.eat。
5 完成!
(三)概念說明:
在 Alice 中另一個設定迴圈標籤的是 while,while 迴圈是判斷是當某個條件
以流程圖表示:
world.chase
仔細看下圖的程式碼,可以發現 chase 呼叫了 shark.swm 和 goldfish.flee 及 shark.eat 這三個 method 的功能說明如下,shark.swim 是 shark 游向 goldfish,goldfish.flee 是 goldfish 游離開 shark,shark.eat 是 shark 吃掉 goldfish 。
World.chase:
While (goldfish 和 shark 的距離大於 0.5 meters) Do in order
shark 朝向 goldfish Do together
shark.swin //shark 繼續游 goldfish.flee //goldfish 逃離
shark.eat (what =goldfish) //shark 吃掉 foldfish
shark.swin
shark 尾巴向左擺並往前進 shark 尾巴向右擺並往前進 shark 尾巴向左擺並往前進
goldfish.flee Do together 搖擺尾巴 游向任意地方
shark.eat
paoameter: what shark 朝向 goldfish
shark 打開嘴巴 goldfish 消失了 shark 閉上嘴巴
[課後練習]:
1 有一隻小兔子非常喜歡吃 broccoli(球花甘藍),所以偷偷溜到隔壁人家花園 裏,去吃別人種的 broccoli(球花甘藍),請你設計小兔子的動作,先讓小兔 子面朝 broccoli(球花甘藍),再讓兔子跳向 broccoli(球花甘藍)8 次,要記 得做出跳子跳躍時,腳掌上下轉動的動作哦!(在 nature 的分類下可以找到 garden(花園),在 animal 的分類下可以找到 bunny(小兔子),但是在 Alice 中實際上沒有 broccoli(球花甘藍)這個物件,你可以在 Nature 裏面找一些 小植物來模擬成 broccoli(球花甘藍))。
1 一隻在花園裏的小兔子,
在它的左前方有一些 broccoli(球花甘藍)。
2 使小兔子面向右邊的 broccoli。
3 小兔子面向 broccoli 跳 8 次。
2 練習一裏的兔子真是頑皮啊!竟然跑到別人院子裏去偷吃球花甘藍,兔爸爸要 來把小兔子帶回家打屁股。
1 兔爸爸出現了 2 小兔子轉向兔爸爸
3 小兔子朝兔爸爸的方向跳過去 4 小兔子跳到兔爸爸旁邊
3 這裏有一隻可愛的玩具企鵝,上緊發條的時候,它便會搖搖擺擺地往前走,發 條停止的時候,企鵝就會停止走動。請你寫一個 method,模擬發條旋轉時,
企鵝向前走的動作。(在 Animales 裏可以找到 penguin(企鵝),在 objects 裏可以找到 windUpKey(發條))。
4 去遊樂園的時候,我們最常看到的就是旋轉木馬,請設計一個旋轉木馬的情
境,讓這組旋轉木馬會不停的轉動。(使用無窮迴圈)。(在 Amusement Park
(遊樂園)裏可以找到這個 carousel(旋轉木馬)物件)。
5 電風扇是我們夏天省錢又方便的消暑良伴了!這個電扇有四個按鍵,分別是─
high(高速)、medium(中速)、low(低速)、off(停止)。請寫一個 method 可以控制風扇葉片的轉速。當使用者按下 high 這個按鈕的時候,葉片轉速最 快;當使用者按下 low 這個按鈕的時候,葉片轉速最慢。風扇葉片要能持續轉 動,直到使用者按下 off 按鈕,或是程式停止運轉時才停止。(你可以在 object 的分類下找到 fan(電風扇))。