歡迎來到演算法與編程:控制與模擬!
你有沒有想過,自動門是怎樣知道何時打開?交通燈是怎樣轉換顏色的?或者電子遊戲裡面的角色,又是怎樣做到像真人一樣跳躍呢?這一切背後的秘密,就是電腦編程!
在這份學習筆記中,我們將會探索如何運用演算法和電腦程式來控制現實世界中的實體物件,以及在電腦螢幕裡模擬物理系統。如果一開始覺得有點深奧,千萬不用擔心——我們會一步一步為你拆解!
1. 控制與模擬:兩者有甚麼分別?
電腦主要可以透過兩種方式與實體世界互動:控制實體物件,或者模擬它們。
甲、 控制實體系統
控制實體系統是指編寫電腦程式,來操控、點亮或指揮現實世界中的真實硬件組件。
• 運作原理: 電腦或微控制器(microcontroller)透過感應器收集現實世界的資訊,然後向實體部件(例如馬達或燈光)發出指令,告訴它們該做甚麼。
• 日常生活例子: 天黑時自動亮起的街燈、遇到牆壁會自動轉向的掃地機械人,或是按下按鈕後會轉換訊號的行人過路燈。
• 你可能會用到的硬件: BBC micro:bit、Crumble 控制板、LEGO Education / SPIKE,或者可編程地面機械人(例如 Roamer 或 Sphero)。
乙、 模擬物理系統
模擬物理系統是指利用軟件在螢幕上建立數碼模型,用來模仿現實世界中事物的運作模式。
• 運作原理: 電腦運用規則和數學運算,在虛擬世界中複製現實世界的力量、運動和事件。
• 日常生活例子: 皮球因地心吸力而掉落的電腦遊戲、模擬交通燈運作的 Scratch 項目,或是太空飛行模擬器。
• 你可能會用到的軟件: Scratch、MakeCode,或是海龜繪圖(turtle graphics)/ 基礎 Logo 環境。
重點速記: 控制是在真實的實體世界中發生,並配合硬件運作;模擬則是在電腦螢幕內發生,作為一個數碼模型!
2. 必備的解難工具箱
在開始控制或模擬任何事物之前,我們需要先掌握基本的計算思維工具:
• 演算法(Algorithm): 為了解決問題或達成目標而制定的一套清晰、循序漸進的規則或指示。(可以把它想像成烘焙蛋糕的食譜!)
• 程式(Program): 將演算法轉換成代碼,讓數碼裝置或電腦可以讀取並執行。
• 問題分解(Decomposition): 將一個龐大而複雜的問題拆解成較小、較容易處理的部分。例如,我們不需要一次過編寫整部機械車的所有程式,而是拆解為:(1) 轉動左輪、(2) 轉動右輪、(3) 讀取距離感應器的數據。
• 除錯(Debugging): 在演算法或程式碼中找出、診斷並修正錯誤(bugs)的逐步過程。
除錯小貼士: 千萬不要胡亂猜測!每次只測試程式的一小部分,這樣就能準確找出問題出在哪裡。
3. 輸入與輸出:與世界溝通的橋樑
每個控制系統和模擬都依賴輸入(接收資訊)和輸出(執行動作)。
實體輸入(感應器)與實體輸出(致動器)
• 實體輸入(感應器 Sensors): 用來偵測物理環境的變化,並將數據傳送給電腦。
例子: 按鈕、傾斜感應器、光線感應器、溫度感應器、動態感應器和超聲波距離感應器。
• 實體輸出(致動器 Actuators 與顯示器): 接收到電腦的指令後會執行動作的實體部件。
例子: 發光二極管(LED)、馬達、蜂鳴器、揚聲器、顯示螢幕和機械輪。
虛擬輸入與虛擬輸出(模擬系統中)
• 虛擬輸入: 按下鍵盤上的按鍵、點擊滑鼠,或是角色碰觸到螢幕上的特定座標觸發點。
• 虛擬輸出: 角色在螢幕上移動、更換造型、透過揚聲器播放音效,或是播放圖像動畫。
記憶口訣:
• 輸入(Input) = 資訊進入電腦大腦。
• 輸出(Output) = 動作從電腦大腦輸出執行。
4. 編程結構(程式積木)
為了精確地控制或模擬系統,我們會在程式中使用四個核心構件:
1. 順序(Sequence)
由上而下、一步一步按照清晰的直線順序執行指令。如果次序錯了,系統就無法正常運作!(就像穿鞋之前必須先穿襪子一樣——次序非常重要!)
2. 條件選擇(Selection)
使用「如果... 那麼... 否則...」(IF... THEN... ELSE)積木,根據條件作出判斷。
• 例子: 如果光線感應器偵測到黑暗,那麼點亮 LED,否則關閉 LED。
3. 重複(迴圈 Loops)
重複執行一組程式碼,這樣我們就不用一遍又一遍地寫下相同的指令:
• 無限重複(無限迴圈): 持續不斷地檢查感應器或重複執行動作。
• 重複 \(n\) 次(計數迴圈): 將一個動作重複指定的次數,例如讓燈光閃爍 \(5\) 次。
• 重複直到(條件迴圈): 持續執行動作,直到特定條件達成(例如:一直向前行駛,直到距離感應器偵測到障礙物)。
4. 變數(Variables)
電腦記憶體中一個已命名的數碼儲存盒,用來存放程式運行時可以改變的數值。
• 例子: speed(速度)、timer(計時器)、score(分數)或 distance_value(距離數值)。
5. 小心陷阱!常見的編程盲點
陷阱一:「只檢查一次」的錯誤
常見錯誤: 你寫了一個「如果... 那麼...」積木來檢查按鈕是否被按下,但沒有將它放入迴圈中。當你啟動程式時,它在開機時的千分之一秒內就檢查了按鈕,發現沒有被按下,程式便立即結束了!
解決方法: 將「如果... 那麼...」檢查放入一個無限重複迴圈內,這樣微控制器整天都會持續監測感應器的狀態。
陷阱二:以為電腦「懂得」自己思考
常見錯誤: 以為機械車在撞牆前會自動停下來,而不需要特別給予指令。
解決方法: 記住電腦是完全沒有人類直覺的。它們只會完全按照字面指示執行。你必須給予精確、逐步的指令去讀取距離感應器並停止馬達。
陷阱三:混淆感應器與致動器
常見錯誤: 以為蜂鳴器是輸入裝置(因為你能聽到聲音),或者以為按鈕是輸出裝置(因為你要按下它)。
解決方法: 常常問自己:「資訊是正在傳入電腦,還是動作正在由電腦傳出?」 按鈕是將訊號傳入(輸入/感應器),而蜂鳴器則是將聲音傳出(輸出/致動器)。
6. 溫習清單
完成學習前,請檢查自己是否已經掌握以下核心概念:
• 控制是利用軟件驅動現實世界中的硬件(馬達、LED、蜂鳴器)。
• 模擬是利用軟件在螢幕上模仿現實世界的運作(在 Scratch 或 MakeCode 中)。
• 輸入負責收集數據(感應器/按鍵);輸出負責執行動作(致動器/角色)。
• 問題分解能將大項目拆解成小步驟,幫助你解決複雜問題。
• 條件選擇和重複讓你的程式能夠作出聰明的決定,並持續監測感應器。