程式設計與實體運算

課程總覽


學校日簡報

學校日簡報六年級上學期

單元ㄧ:魔幻水族箱

單元二:聲控遊戲

利用音量變化來控制遊戲中的主角作出相應動作,稱為「聲控遊戲」,與鍵盤滑鼠的控制不同,音量的控制需要天份,一般人很難達到純熟,也因此聲控遊戲玩起來特別有趣和刺激。

在電腦開發聲控遊戲必須先設置好麥克風,或者是其它能夠收集聲音的裝置,例如:視訊鏡頭。

在製作遊戲之前,請點擊連結試玩遊戲:https://e.meps.tp.edu.tw/scratch/sound%20fly .html

收集聲波資料

在 Scratch 中可以透過「偵測」類積木的「聲音響度」取得目前的環境音量。如果要在「舞台」上繪製聲波圖,我們必須要收集「聲音響度」儲存到清單」中,然後再用「畫筆」積木繪製出來。

「清單」也是「變數」的一種,是用來記錄一群資料所使用的結構,所有的資料都被以相同的變數名稱存取,但是大家依照順序排序,所以每一個資料項目都有一個索引值,只要指定要存取的索引值就可以從清單中取出或存入資料項目。

當我們將「聲音響度」儲存進清單時,越早存入的資料其索引值就越小,所以當要刪除過時的資料時,必須從第一筆開始刪除,而第二筆資料就會自動遞補為第一筆。這種先儲存的資料先刪除的做法稱為「先進先出法」(FIFO,First In First Out)。

步驟一:

建立一個空白的角色,命名為「聲波圖」,這個角色只用於繪製聲波圖,所以不需要造型。

建立一個清單,命名為「聲波」。

首先將清單內的所有資料清空,以避免反覆執行時,上ㄧ次的資料會遺留在裡面。

接著使用一個「重複無限次」迴圈開始收集資料,檢查資料項目是否超過 480 筆,如果是則將超過的舊紀錄刪除。

之所以只保留 480 筆資料,是因為「舞台」的寬度是 -240 ~ 240,只有 480 個點。

擴展積木與函式積木

在 Scratch 中有三種程式積木可以使用,分別是:預設積木、擴展積木、函式積木。

「畫筆」積木是 Scratch 的擴展積木,可以從右下角的「添加擴展」。

函式積木的執行方式

建立函式積木時,如果將「執行完畢再更新畫面」打勾,則函式積木中的所有程式都會在背景執行,執行過程將看不到,但可以提高執行效能。

不打勾則積木會在前景執行,可以從舞台觀察到執行的過程,但其他程式必須等待函式積木執行完畢,因此會有畫面延遲(lag)的現象。

通常在程式需執行大量運算時(例如:設計互動遊戲),會讓積木在背景執行。在本單元中,你可以試試看兩種執行方式有何不同,特別是在「畫圓」的時候,請好好體驗前景與背景執行的速度差異。

繪製聲波圖

步驟二:

建立一個變數「掃描線」,用來記錄清單「聲波」目前的索引值。這個變數請設定成「僅適用當前角色」。

建立一個函式積木,命名為「畫聲波」,記得將「執行完畢再更新畫面」勾選起來。

首先將「筆跡全部清除」,將畫筆(即目前的角色)定位到螢幕的左側邊緣,將變數「掃描線」歸零。然後再下筆。

請使用一個「重複 480 次」的迴圈,將掃描線加ㄧ,並從清單「聲波」讀取相對應的資料,也就是從第一筆開始讀,直到第 480 筆。

由於「聲音響度」數值範圍是從 0 ~ 100,沒有負數。所以繪製出來圖形不像聲波圖,可以把「聲音響度」數值乘以 -1 來模擬。

迴圈執行完畢後,使用「停筆」積木停止繪圖功能。

這裡我們繪製的聲波圖,其實不是真正的聲波圖。真正的聲波圖除了聲音響度(聲音震動的幅度)以外,也會收集聲音振動的頻率,而形成複雜的波形。

步驟三:

將剛剛定義好的「畫聲波」積木,插入到主程式中,一邊繪製聲波圖,一邊收集聲音響度,如右圖。

請測試執行結果是否與預期相同。

用音量控制飛行貓

步驟四:

切換到小貓角色的造型分頁,新增 Scratch 內建的「Cat Flying」造型,並將原有的兩個造型刪除。將角色名稱修改為「飛行貓」。

設定飛行貓的迴轉方式、起始位置和角度,然後進入遊戲迴圈。

我們需要一個變數「高度」,用來計算和儲存飛行貓上升或下降的幅度,請勾選「僅適用於當前角色」。

以 20 分貝為基準,當音量大於 20 分貝就增加高度,小於 20 分貝就降低高度。將聲音響度減掉 20 以後,還必須除以 3,讓高度變化不要太劇烈,你可以試試看除以 1 或 2 的效果,這個數字是可以依照個人喜好自由調整的。

飛行貓的 Y 座標,依照計算出來的高度增減(高度為負數時,就是減少),注意不要讓飛行貓飛出舞台的範圍,也就是說,Y 座標要介於 -160 ~ 160 之間,考慮到舞台上方要顯示目前的生命值和飛行距離,所以略為下降到 125 左右。以上數據僅供參考,你必須根據自己飛行貓的大小和變數顯示的方式來調整這些數字。

為了讓飛行貓表現出往上飛和往下飛的動態,我們也可以修改飛行貓的旋轉角度,朝右平飛是 90 度,而當變數「高度」為正數時,角度必須往上傾斜,也就是角度必須小於 90 度,「高度」為負數時,必須往下傾斜,也就是角度必須大於 90 度,因此是用 90 度減去高度變化。為了讓角度變化看起來比較明顯,會先把「高度」乘以 3,然後再用 90 去減。與前面相同,要不要乘以 3,還是要乘多少,可以自由調整。

請測試執行結果是否滿意,如果不滿意請調整以上數學算式裡的相關數據。

捲軸動畫-背景水平捲動

我們的飛行貓雖然 Y 座標會變化,但 X 座標始終固定在舞台上同一個位置。如果要表現出往前飛行的動畫效果,我們就必須移動背景才行。你可以想像背景圖是一張很長的圖片超過舞台的寬度,而我們只能看到出現在舞台的部分。

由於 Scratch 並不允許造型的寬度超過舞台太多,因此只能使用多個角色,或多個分身來接圖。底下的範例將使用分身來接圖。

步驟五:

首先,繪製舞台背景,只需要單純的天空色和太陽。太陽使用內外漸層,內部為橘黃色,外部為透明。

建立一個新的空白角色,命名為「背景」。切換到造型分頁,先畫出矩形,然後使用「塑形」工具拉出山脈的形狀。這樣的造型需要兩個以上,請注意靠近舞台邊緣的地方,必須調整山脈的高度讓它可以跟下一個造型的山脈銜接在一起。

注意到舞台左下和右下各加一個點,以保證造型移動到舞台邊緣時可以無縫接圖。

Scratch 為了防止角色不小心移出畫面,所以當角色邊緣靠近舞台邊緣時,座標會被凍結。加兩個點讓角色邊緣變大,就可以讓這個機制延後發生作用。

本體與分身

分身是本體的複製版本,跟直接複製角色不一樣的地方有三個:

為了在分身與本體之間分配程式碼,請使用「當分身產生時」積木,把程式碼指派給分身執行(本體不會執行這一段程式)。要給本體執行的程式,請使用「當綠旗子被點擊」積木(分身將不會執行這一段程式)。如果使用「當收到訊息...」積木,則無論本體或分身都會執行該程式。

「分身刪除」積木的作用是將自已刪除,所以必須分配給分身執行才會有效果。如果以後還會用到這個分身,可以直接使用「隱藏」積木,而不需要刪除,等到要用到時再「顯示」就可以了。如果確定不會再用到它,則可以在遊戲結束之前直接刪除,以便進一步減少記憶體的使用量。

步驟六:

建立變數「背景圖位置」和「顯示位置」,請設定為「僅適用當前角色」,這樣可以讓每個分身都擁有自己的同名變數。

建立變數「主角位置」和「速度」,都是「適用所有角色」。前者用來設定主角飛行貓目前在整張拼合的背景圖中的位置,後者則是飛行貓的飛行速度,其實也就是背景捲動的速度。

角色「背景」(不是舞台背景)本體是不需要顯示的,因此先隱藏起來。設定第一個分身的造型和位置,然後「建立自己的分身」。如果要往左捲動,那麼下一張圖片應該接在第一張圖片右邊 480 的位置。

反過來說,如果是要向右捲動,那麼下一張圖片位置就是 -480。

捲動背景圖

介紹捲動最簡單的方法,將所有圖片(所有的分身)同時一起向左移動「速度」點,當圖片往左移出舞台外面時( X 座標為 -480),將圖片接回到舞台的右側( X 座標為 480)

這個方法雖然簡單,但是有底下三個缺點:


考慮以上所有情形,將捲動程式改良如下。

步驟七:

計算背景圖與主角的距離,並儲存到變數「顯示位置」中,「顯示位置」就是背景與主角此刻的相對位置。

計算「顯示位置」除以背景圖總寬度的餘數。如果角色「背景」有兩個造型,則總寬度為 480 x 2 = 960。假設「顯示位置」為 1200,因為 1200 已經超出背景圖總寬度 960,而超出部分是 240(餘數為 240)。也就是說主角已經位於循環一次的背景圖中 X 座標為 240 的位置

如果要讓背景圖向左或向右捲動都能正常執行,那麼一開始就必須在第一個造型的左右兩側各準備一個分身,如果有兩個造型就需要三個分身。

或者我們可以這樣想,一開始主角就是在第二個造型中,這樣主角就可以向左回到第一個造型,或向右走到下一個造型。因此,把整張背景圖往左邊一個舞台寬度擺放就可以了,這就是餘數還要 - 480 的原因。好處是我們不用多準備一個分身。

當主角移動時,無論是往左或往右,都能正確匹配主角與背景圖。

請將右側的程式,加到飛行貓「重複無限次」迴圈中。

為了向左、向右都可以捲動,需要準備三個分身,或者是把整張背景圖向左移動一個畫面。

補充教材

加入前景捲動動畫

如果要讓背景更有立體感,我們可以加入前景,前景捲動速度應該比背景更快,這樣整個舞台空間會更有層次。前景的做法與背景差不多,我們將準備背景兩倍數量的造型,這是因為我們希望前景捲動速度快兩倍,因此造型的消耗速度也就會快兩倍,一開始就準備足夠的造型才能應付需求。

這次要產生四個分身,可以考慮用「重複 4 次」的迴圈來處理。

另外顯示位置是「背景圖位置」減去「主角位置」的兩倍距離。這樣捲動速度就會變成兩倍。

加入敵人

只有飛行貓自己一個人太寂寞了,我們來增加一些敵人。首先,建立兩個「適用所有角色」的全域變數,分別是「生命」和「距離」,用來儲存玩家的剩餘生命和累計飛行距離。記得在飛行貓的程式裡,設定「生命」的起始值,例如:「變數生命設為 5」。

我們將利用「生命 < 1」當作遊戲迴圈的結束條件,請將上面的所有程式中有使用「重複無限次」的迴圈,通通改成「重複直到 生命 < 1」

在飛行貓的程式中,請在「重複直到 生命 < 1」迴圈中將「距離改變 1」,用來統計目前的飛行距離。

建立新角色「敵人」,找一些適合的造型當作敵人,如下圖。在敵人角色中,建立新的變數「敵人速度」,並設定成「僅適用目前角色」,這樣可以讓所有的敵人分身都擁有「敵人速度」這個變數。

敵人在飛行距離到達 500 以後才會出現,出現的敵人數量為飛行距離 500的倍數,例如:當距離為 1000 以上會同時出現兩個敵人。

敵人向右飛行,碰到邊緣時就刪除,碰到玩家時,將玩家生命減 1,並且刪除分身。

加入輔助道具

有了敵人之後,我們也加入可以補命的輔助道具。

建立新角色「生命」,使用 Scratch 內建的「heart red」愛心造型,如圖。

愛心出現的間隔時間為 8 秒,這個可以自由修改。

愛心的飛行速度是飛行貓的 3 倍,這個數字也可以自由修改。

單元三:樂透抽籤機

共同討論:

小朋友你們有參加過大賣場舉辦的摸彩活動嗎?大家都是如何提高得獎機會?

如何保證摸彩的公平性呢?

參考答案

1.每人限投一張。

2.規定折疊方式。

3.抽獎前必須攪拌10秒。

4.彩劵應該裝在圓形容器裡抽出。

基本款抽籤機

電腦抽籤比較公平:避免人為操控、抽中機率接近公平(隨機數的特性:抽籤次數越多越公平)

製作抽籤機程式時,為了適應各班人數不同,抽籤範圍應該由使用者自行輸入

此程式共需要三個角色,佈置如右。

步驟一:

步驟二:

十位數

個位數

步驟三:

修改【機器人】角色的程式,
當點機器人一下就可以重新抽籤
(跳過提問和回答的程序)

實體運算

如果不使用電腦,也能公平地抽籤嗎?

分組討論:


當問題很複雜時,我們可以嘗試簡化問題降低難度,例如:

老師歸納解法,關鍵在於將骰子點數分組以便匹配人數。

參考答案

分組討論:

參考答案

回到原來的問題:

由於班上同學人數無法剛好分成六個人一組,所以需要例外處理,如果抽中不存在的人,就必須重抽。

若第一次抽中 4,第二次抽中 3,如何知道實際上抽中的同學是誰呢?

參考答案

假設第一次抽中的是 X,第二次抽中的是 Y,如何把剛剛的討論結果轉換成演算式?

參考答案

(X-1) * 6 + Y

如何將序號轉換成座號呢(假設男生從 1 號開始,女生從 21 號開始)?

參考答案

方法ㄧ:

假設男生人數為 14,抽中號碼小於或等於 14  則不需要換算,抽中等於座號;如果抽中是 15,轉換成座號就是 21 號。

抽中之序號若為 X,則座號就是 (X - 14) + 20

如果把男生人數改為 A,女生的座號從 B 開始,則

座號 = (X-A) + (B-1)

如果把變數改成中文,也就是

座號 = (抽中 - 男生人數) + (女生起始座號 - 1)

方法二:

計算中間沒有人的空號 21-1-14 = 6(從 15 號到 20 號有 6 個號碼是空號)

如果抽中為 X 而且「抽中>男生人數」,則座號就是 X + 6

如果把男生人數改為 A,女生的座號從 B 開始,則

座號 = X + (B-1-A)

如果把變數改成中文,也就是

空號 = 女生起始座號 - 1 - 男生人數

座號 = 抽中 + 空號

方法三:

如果想要節省計算的時間,也可以事先製作「序號與座號對照表」,利用「查表法」來求得答案。

跳號抽籤機

任務:將上上一節課完成的基本款抽籤機,該成通用型抽籤機

(本校任何一個班級都能使用,女生座號都是從 21 號開始)

步驟一:


步驟二:

查表法簡介

在 Scratch 裡面,剛剛講的抽屜也就是前面介紹過的「清單」。

程式設計步驟:

單元四:海龜畫圖

LOGO 海龜畫圖

Logo是一種電腦程式設計語言,在1966年由西摩爾·派普特和Wally Feurzeig設計,Logo一詞源自希臘語邏各斯(logos)。Logo是一種直譯語言,和其他語言不同的是,它內建一套海龜繪圖(Turtle Graphics)系統,通過向海龜傳送命令,使用者可以直觀地學習程式的執行過程,因此很適於初學者特別是兒童學習程式設計。

海龜繪圖使得Logo使用者可以通過簡單的編程創作出豐富多彩的視覺效果或圖案。假想一隻帶著畫筆的海龜可以接受簡單的命令,例如向前走100步,或者左轉30度。通過對這隻海龜傳送命令,可以讓它繪製出較為複雜的圖形,例如正方形,三角形,圓等。

海龜的移動相對於它本身所在的位置。例如,命令"左90"意味著讓海龜左轉90度,學生可以站在海龜的角度來思考它將如何執行命令,這使得程式設計更加形象化,也更易於理解。

LOGO 海龜畫圖線上版

code.org 冰雪奇緣闖關活動

網址:https://studio.code.org/s/frozen

底下三個難關,請依據老師課堂上的提示,嘗試過關:

第六關:巢狀迴圈的應用

第十關:平行四邊形四個外角的計算方法

第十四關:自定義函式(Function)的應用

從畫點到畫線

要在舞臺上畫出線條,必須用到 Scratch 的畫筆積木

使用畫筆積木,應該先做「初始化」,也就是把舞台上所有筆跡清除,並讓畫筆角色回到舞台中央面朝上

練習使用函式積木定義自己的指令積木

使用新定義的積木清除畫布(舞臺)

幾何學裡面最基本的單位是點,畫點可以使用「下筆」積木

連續畫點就會形成線,右圖的「畫線」積木用來畫長度 100 的線

改成自行輸入線的長度,積木會更好用,函式積木可以定義輸入方塊以接受外部輸入的資料,在程式設計裡這些方塊被稱為:引數(或稱為「參數」)

引數與變數功能相同,但作用範圍不同,引數僅在該函式積木內有作用。

輸入方塊有兩種:數字或文字、布林值,我們要使用的是前者,並將該輸入方塊命名為 x,你可以把 x 當成該函式積木的內建變數來使用(用拖曳方式引用)

正多邊形的畫法

我們知道繞一圈回原位就是轉 360 度,三角形可以想成是圓形的變形(把一個圓形的橡皮筋套在三根鐵釘上面),因此畫完每一邊要轉 360÷3=120 度,總共要畫三次。

其餘多邊形也可以想成是圓形的變形,畫 N 邊形每次要轉 360÷N 度

把長度和邊數改成輸入方塊並命名為 y 和 z,設計出多邊形函式積木。

利用剛剛設計好的多邊形積木,我們可以畫出複雜圖形

右邊範例是畫 10 個 5 邊形繞一圈的結果,請小朋友自行修改邊長和邊數化出不同的複雜圖形,也可以修改重複次數,但右轉角度也必須同步修改。

圓的畫法

多邊形積木也可以用來畫圓形,方法是把長度改為 1 或 2,邊數改成 360 邊。

我們習慣用直徑來測量圓形的大小,利用多邊形積木畫圓,必須改用邊長,比較難掌握畫出來的大小。

請嘗試設計一個新的積木來畫圓,輸入的資料是直徑。

把直徑乘以圓周率(3.14)算出周長,然後把周長除以 360 就得到 360 邊形的邊長。這樣我們就可以畫出正確大小的圓。

弧的應用

畫圓畫一半就會得到弧線,我們根據畫圓的積木,設計一個新的畫弧積木。

利用畫弧積木,可以進一步設計出更多複雜圖案。

組合兩個弧變成花瓣,然後利用花瓣積木,畫出不同花瓣數量的花。

作業:請利用隨機數在舞台的任意位置,繪製 3 ~ 12 個花瓣,大小 20 ~ 60 的花朵,記得修改畫筆顏色,以呈現出五彩繽紛的花園氣氛。 

範例程式:https://e.meps.tp.edu.tw/scratch/turtle_draw.html

補充資料:五芒星畫法

要畫五芒星,那就先研究三芒星畫法,所謂三芒星其實就是正三角形。小朋友已經知道三角形內角和是 180 度,也就是說「三芒星的三個芒角加起來是 180 度」,事實上「五芒星的個芒角加起來也是 180 度」。

要畫五芒星的話,就是要把 180 度分給 5 個芒角,180÷5=36,每個芒角 36 度。用海龜來畫圖,每次轉彎的角度是外角,外角的算法是 180-內角,以五芒星為例,就是 180-36=144 度。

下面最右邊的積木可以用來畫任意奇數的芒星,但偶數芒星的算法太複雜,這裡略過不討論。

補充資料:螺旋與遞迴

利用課堂上所設計的「畫弧」函式積木,可以進一步畫出螺旋線,方法是一邊畫弧線,然後一邊把直徑縮小,例如:每畫一條 90 度的弧線就把直徑縮小 5 點,一直縮小到直徑為 0 時停止。

這是一個需要反覆執行相同動作的程式,可以利用「重複執行直到」積木來製作,如下圖左邊的函式積木。這個函式積木裡面需要對「引數(參數)」進行運算操作,但可惜 Scratch 的「引數(參數)」不提供運算功能,所以只能改用變數來設計。

換個方式來思考,把螺旋線最外面一條 90 度弧線擦掉,剩下的圖形也是螺旋線,以此類推,我們可以發現螺旋線就是由更小的螺旋線組成的。只要反覆執行「螺旋線積木」就可以把整個螺旋線畫好。這種函式積木「引用自身」的做法稱為「遞迴」演算法。

下面右側示範的是最簡單的遞迴程式,僅只引用自身一次,而這一次不需要用到變數。下列兩個程式的執行結果完全相同,仔細觀察比較很快就會發現「遞迴其實就是重複執行的另一種寫法」。