• 沒有找到結果。

第六章 迴圈結構 Loop

在文檔中 1. 程式設計教學的發展。 (頁 79-98)

[學習重點]:

了解無窮迴圈、有限迴圈、巢狀迴圈、有條件執行的迴圈這四種迴圈的概念和使 用時機。

一、無窮迴圈與有限迴圈

[範例一]:當程式開始執行時,蝴蝶即會上下左右飛舞

(二)動手做:

[自己動手做]

步驟一:加入物件

你可以在 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(電風扇))。

在文檔中 1. 程式設計教學的發展。 (頁 79-98)

相關文件