• 沒有找到結果。

函數及數學表示式

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

一、使用內建函數(function)

[範例一] 探測機器人

在月球上的探測機器人 spiderRobot。機器人偵測到右邊有石頭 rock,於是 頭向右轉,並往石頭的方向移動,而且 spiderRobot 移動的距離等於它和 rock 之間的距離,但是我們並不知道 spiderRobot 和 rock 之間的距離是多長,所以 這時候就需要用到 function,讓 Alice 幫我們計算兩者之間的距離。

1 在月球上有一台登陸器 和探測機器人,還有岩石

2 spiderRobot 朝向 rock 3 spiderRobot 朝 rock 走過 去,移動距離等於它和 rock

步驟二:編輯程式碼

1、編輯 spiderRobot 向前移動的動作。

完成上個動作可看到程式碼如下,表示 spiderRobot 會向前移動 1 公尺。

2、使用內建函數 spiderRobot distance to

如果我們想要 spiderRobot 移到 rock 旁邊,也就是移動的長度等於

spiderRobot 和 rock 的距離,這時候我們就需要用到 functions。因為我們不 知道實際上 spiderRobot 和 rock 的距離,使用 functions 會自動告訴我們這 個距離值。

點選樹狀結構中的 spiderRobot’s,再選擇 Function 中的 distance to,將此 標籤移至 1 meter 的方框中,此時會出現一個下拉式選單,請在 object 中選 擇 rock。

完成後,你可以看到如下圖的程式碼。spiderRobot 所移動的長度,將會等 於 spiderRobot 和 rock 的距離

3、改變 spiderRobot 往前移動的方向

按下 play 之後,你發現 spiderRobot 是往哪個方向移動呢?有沒有照我們所 預期的,往 rock 的方向移動呢?沒有,對不對?所以我們現在在 spiderRobot 向前移動之前先做一個動作,就是讓 spiderRobot 面向 rock,怎麼做?

(1)選擇 spiderRobot 中的 method – turn to face 放在 move toward 之前:

(2)target (目標) 選擇 rock,這樣 spiderRobot 就會面向 rock,並且朝 rock 的方向移動。再按下 play 觀看執行結果。

----4 、Alice 中物件的中心點

看看執行結果 spiderRobot 竟然 跑進 rock 裏去了,怎麼會這樣呢?這是 因為在 Alice 中,所有物件的距離都是 以物件的中心點起算的.

所以 spiderRobot 和 rock 的距離,

如右圖所示:

5 修正 spiderRobot 移動的距離

為了不讓 spiderRobot 跑進 rock 中,我們可以再針對程式碼做修正,縮短 spiderRobot 移動的長度。注意看下圖,

(1)選擇 rock 右邊的倒三角形

(2)先選擇 math

(3)再選擇 spiderRobot distance to rock -

(4)再選擇 1

(3)

(2) (4)

(1)

如果你的動作正確的話,你應該會看到如下圖的結果,下圖這行程式碼的意 思是:spiderRobot 向前移動的長度是,spiderRobot 到 rock 的距離再減 1

6、利用另一個內建函數 rock’s width

但是現在我們希望移動的長度不是 spiderRobot 到 rock 的距離再減 1,而是 spiderRobot 到 rock 的距離再減”rock 的寬度”。在 rock 的 function 中選擇 rock’s width,將這個標籤拉至數字 1 的方框中。

完成後如下圖:

7、完成,可以按 play 看執行結果是否正確。

[概念說明]

(一)內建函數

Alice 將大部份和物件有關的資料儲存在 functions(函數)裏,例如:

Proximity-

和距離相關的屬性 Size --

和長、寬、高,及大小相關的屬性 Spatial relation --

與其他物件的相對位置。如 to left of,在某物 of a subpart of the object(物件其中一部份的 名字)

像這種在 Alice 裏面已經自動建好的 functions(函數),稱為內建函數。我們可 以藉由使用 functions 獲得我們想要關於物件的資訊,例如使用 distance to 可以 得到 spiderRobot 和 rock 的距離,使用 spiderRobot’s width 可以得到

spiderRobot 的寬度等等。不同的 functions 會傳回不同資料型態的值,例如:

number(數字) :2 , 45 , 31

Boolean value(布林值) :True 或 False String(字串): “hello world”

Object(物件):a spiderRobot

(二)運算式

選此倒 三角形

[範例二]

利用 if/else 設一個判斷條件,如果 spiderRobot 的高度小於 rock 的寬度的 話,spiderRobot 的脖子會先向上伸再向下縮。

1 spiderRobot 脖子向上伸 2 spiderRobot 脖子向下縮

[自己動手做]

1、先將 if/else 標籤拉進程式碼編輯區中,設定執行條件為 true。

2、選擇 world 中的 functions,

(1)將 a < b 這個標籤拉進 if 右邊 true 的方框中,

(2)先暫時將兩數 a 設為 1,

(3)b 設為 2

(3)

(1)

(2)

完成後,if 右邊的程式敘述應該如下圖

3、利用內建函數 spiderRobot’s height

(1)因為我們要設定的條件是 spiderRobot ‘s height < rock’s width,所以在 spiderRobot’s details 中選擇 spiderRobot’s height,在 rock’s details 選擇 rodk’s

width

(2)設定 < 右邊的值,將 rock’s width 拉進 < 右邊的方框裏

完成後可以看到 if 那一行的程式碼如下:

4 編輯 if 內的區塊

接下來再分別設定 spiderRobot 的動作,選擇 spiderRobot 中的 neck,再設定 move up 和 move down

5 到這裏你已經完成範例二了,按下 play 看看你的程式執行結果是不是和老師

以上面的例子來說(可以看下圖),當 subject = spider’s height < subject = rock’s width 時,方框中 spiderRobot.neck move up 0.2 meters duration = 0.5 seconds more 和 spiderRobot.neck move down 0.2 meters duration = 0.5 seconds more 這兩行程式碼才會執行,否則的話,就什麼事都不做。也就是說,當 spider 的 高度大於或等於的時候,spider 並不執行任何動作。

(二)、關係運算子

在 World 的 functions 標籤中,我們可以看到有一個選項是”math”,在 math 中 有六個選項,分別是 spiderRobot.neck move up 和 spiderRobot.neck move down

二、自己新增函數 [範例三]

一顆在草地上滾動的球,而且球滾動的圈數是依照球滾動的距離來決定。例如當 球的圓周是 3.14 公尺,而滾動的距離是 10 公尺的時候,那麼球滾動的圈數大約 是 10/3.14=3.18 圈。

[自己動手做]

步驟一:加入物件

在 sports 的分類中,找到 volleyBall 這個物件,並加入在 Alice World 中 步驟二:編寫程式碼

1、計算球轉動的圈數

一顆球轉動一圈是轉動一個圓周長,那一個圓周長是多長呢?是 3.14 x 圓的直 徑。如果說,我們要讓一個球轉5公尺的話,那麼這顆球要轉幾圈呢?請你用一 個數學式子表示,並將這個式子寫在下面的方框裏。

一顆球轉動 5 公尺的圈數是:

2、新增自己所需的函數

在 Alice 中除了使用內建函數之外,我們也可以自己新增自己所需的函數,知道 怎麼算出球轉動的圈數之後,在 toyBall1’s details 中按新增函數的按鈕,將新增 的函數取名為 numberOfRevolutions,利用這個函數算出轉動的圈數,將這個函 數寫好之後,以後當我們使用這個函數時,不需要自己去計算球在 10 公尺的時 候滾動幾圈,或是球在 25 公尺的時候滾動幾圈,函數會自動幫我們算出來,並 將算出來的值傳給使用這個 function 的 method。

在這個函數中新增一個變數,取名為 distance(距離),利用這個變數來接收球 要移動的距離。下面的 type 是決定 distance 這個變數的型態,因為距離是數字,

所以我們選擇 Number。

3、接下來我們把剛剛的公式編進函數中。編輯順序是由左而右,也就是先選擇 除號(\)再選擇乘號(*)。

(1)先在 1 右邊的下拉式選單中選擇 math。

(2)再選擇 1/,在這裏我們不用在意為什麼是 1,可以稍後再設定這個數值。

(3)設定 b 的值,選擇 1

(3)

(1)

4、再來是設定右邊乘號(*)的值

(1)在 1 右邊的下拉式選單中選擇 math

(2)再選擇 1 *,在這裏我們不用在意為什麼是 1,可以稍後再設定這個數值。

(3)設定 b 的值,選擇 1

(1)

(3)

(2)

(4)完成之後,你的 Return 那行程式碼應該會出現如下圖的形式

5、編輯 functions 內的數學式

(1)現在來把該填的數字填進方框裏,將 distance 這個標籤拉進最左邊 1 的框 框中

(2)再設定第二個 1 為 3.14,在下拉式選單中,選擇 other,會出現一個數字 鍵盤,在鍵盤上按 3.14

6、使用內建函數 toyball1’s width

可是我們並不知道一個球的寬度是多少?所以我們可以利用內建函數 toyball1’s width(球的寬度),讓 Alice 告訴我們球的寬度。

7、編輯讓球轉動的 method

寫好計算球轉圈數之後,現在開始寫讓球「轉動」的動作。

(1)在 world.my first method 裏分別設定 toyBall1 向前移動(move forward)

和向前轉動(turn forward)的動作。因為球是同時向前移動又向前轉動,

所以我們需要先放入一個 Do together 標籤。在 move forward 要設定的是 meters(公尺),也就是距離;在 turn forward 中要設定的是 revolution,

一個 revolution 是一個 360 度,也就是一個圓周長。在這裏我們一樣都先 設為 1 meter 和 1 revolution。

(2)由於我們要讓球向前移動,所以需要在 move forward 的後面再設定 asSeenBy 為 ground,也就是以 ground 的前方為球的前方。到這邊為止,你可 以按下 play 看看球是如何移動的,球會向前移動一公尺並滾動一圈。

(3)將剛剛編輯好的 numberOfRevolutions 放進 turn forward 的後面。

4)完成之後如下圖,你可以自由更改球移動的距離,

toyball.numberOfRevolutions 這個 function 會根據距離的長短回傳滾動的圈數 給 World.my first method,turn forward 就利用這個回傳值來決定球要滾幾圈。

要注意的是,move forward 的距離和你傳給 toyball.numberOfRevolutions 的 distance 要一致,如下圖的圈圈所示。

[概念說明]

前面我們介紹完了利用 Alice 內建的 functions 來得到我們想要的資訊,但 是如果我們想要的資訊,Alice 裏面沒有的話,就必須自己新增一個 function。

在 Alice 中,functions 和 methods 其實很像,不同的地方是,methods 功用在 於執行動作,而 functions 在於回傳數值,但並不會使物件動作,也就是說 functions 並沒有辦法讓物件進行 move、turn、roll 等的動作。但是可以使用 functions 確認 world 的狀態,以便決定該使用何種 method。

在每新增一個 function 的時候,我們都會看到裏面有一個 return 標籤,你 會發現,這個標籤是你怎麼移都移不掉的!因為 functions 一定要有一個回傳 值,傳給 method,有了這個回傳值之後,method 才能進行之後的動作。回傳 值可以是數值(1,2,50...)、布林值(true ,false)、物件(object)等。在這個範例中,

從 return (distance / 3.14 * rollball1’s width)這行可以知道

numberOfRevolutions 所回傳的資料型態是數值,因為 distance / 3.14 * rollball1’s width 最後算出來的值是數字

[課後練習]

1、利用剛剛的第一個 spiderRobot 範例改寫,在 spiderRobot 向 rock 移動之後,

使 spiderRobot 面向 lunarLander(月球登陸器),並使 spiderRobot 向前移動 spideerRobot 和 lunarLander 的一半距離

lunarLander

2、讓袋鼠跳上袋鼠前面的大木箱上,使袋鼠的腿(legs)可以前後轉動(turn backward, burn forward),使它看起來像真的在跳躍一樣。可利用 height 這個 function 來引導向前跳的高度。(你可以在 objects 這個分類中找到箱子,在 animals 這個分類中找到袋鼠。)

1 原始的情境 2 向上跳 3 執行完畢的情境

3、在一個乾燥,炎熱的夏天裏,某個蜂巢裏的一群蜜蜂們非常非常的需要花粉,

有一隻蜜蜂自願冒險去找尋新的花粉來源,請你設計一個如下圖的情境,利用 一個藍色的圓形,營造出一個湖的樣子,並且在 Nature 的分類中,加入如下 圖的植物(樹和花)。(你可以在 Animals 的分類中找到這隻蜜蜂。將情境佈置 好之後,請你寫一個程式,模擬蜜蜂繞著湖邊飛行的情形)。

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

相關文件