射擊幽浮
這篇文章會介紹如何使用「建立遊戲角色」、「遊戲角色座標」、「遊戲角色碰撞」、「變數」、「[重複迴圈」、「邏輯判斷」等積木,在 micro:bit 實作一個射擊幽浮的射擊小遊戲。
遊戲方式
射擊幽浮是一款簡單的射擊小遊戲,遊戲開始後,畫面上方會出現一個逐漸往下移動的 UFO,使用者需要操控下方砲塔發射炮彈阻止幽浮往下移動,當砲彈擊中幽浮,幽浮會消失並重新從上方出現,再次向下移動,若幽浮碰到地面,遊戲結束,顯示得分。
如果使用 micro:bit 實作,遊戲操作步驟如下:
- 同時按下 AB 按鈕,開始遊戲 ( 或重新遊戲 )。
- 按下 A 按鈕,控制砲塔向左移動。
- 按下 B 按鈕,控制砲塔向右移動。
- 遊戲開始後按下 AB 按鈕,可以發射炮彈。
- 砲彈擊中幽浮,得分加 1,幽浮再度從最上方隨機位置出現。
- 幽浮抵達地面,遊戲結束,顯示得分。
積木程式原理
當啟動時,先定義遊戲啟動與遊戲角色的變數:
- 變數 run:數值 0,判斷遊戲是否開始 ( 0 表示遊戲尚未開始,1 表示開始 )。
- 變數 player:砲塔遊戲角色,創建於 (2,4) 座標。
- 變數 bullet:砲彈遊戲角色,創建於 (0,4) 座標,亮度 0 ( 不顯示 )。
- 變數 ufo:幽浮遊戲角色,創建於 (2,0) 座標,亮度 0 ( 不顯示 )。
因為按下 AB 按鈕有兩種動作,一種是啟動遊戲,另一種是發射砲彈,所以程式要加入邏輯判斷:
- 判斷 run 等於 0 ( 遊戲尚未開始或遊戲結束 ) 時:
- 設定 run 為 1 ( 遊戲開始 )。
- 設定 score 分數為 0。
- 設定 fire 開火狀態為 0。
- 遊戲繼續 ( 搭配遊戲結束時的遊戲暫停 )。
- 設定 ufo 角色的位置、亮度。
- 判斷 run 不等於 0 時 ( 表示遊戲開始或遊戲正在進行 ):
- 設定 fire 開火狀態為 1 ( 開火 )。
接著設計按下 A 按鈕和 B 按鈕時,移動砲塔的程式:
- 按下 A 按鈕時,fire 開火狀態設定 0 ( 不開火 ),砲塔角色往左移動。
- 按下 B 按鈕時,fire 開火狀態設定 0 ( 不開火 ),砲塔角色往右移動。
新增一個重複無限次積木,製作砲彈移動的程式:
- 判斷如果 run 等於 1 表示遊戲正在進行。
- fire 變更為 0,避免重複開火 ( 不然程式會變得較複雜 )。
- 將砲彈移動到砲塔的位置,改變亮度為 30。
- 使用重複 4 次積木,讓砲彈從下移動到頂端。
- 移動到頂端後,砲彈亮度改為 0 隱藏砲彈,並將砲彈移動到最下方。
新增第二個重複無限次積木,製作砲彈打到幽浮的程式:
- 判斷如果 run 等於 1 表示遊戲正在進行。
- 判斷如果砲彈 bullet 碰到幽浮 ufo。
- 得分 score 增加 1。
- 幽浮角色再度移動到頂端 ( x 為 0~4 隨機數,y 為 0 )。
最後新增第三個重複無限次積木,製作幽浮往下移動的程式:
- 判斷如果 run 等於 1 表示遊戲正在進行。
- 每次重複讓 ufo 的 y 座標改變 1 ( 往下移動 )。
- 如果 ufo 的 y 等於 4,表示撞到地面,run 改為 0 ( 遊戲結束 )。
- 使用遊戲暫停積木,避免遊戲角色影響畫面顯示。
- 遊戲結束後,使用重複迴圈顯示得分 score ( 使用迴圈是為了不斷顯示兩位數得分 )。
- 使用暫停積木,設定 ufo 移動速度。
完成後,啟動 micro:bit,就可以開始進行設計幽浮的遊戲。
範例解答
範例解答:射擊幽浮
實作「射擊幽浮」的小技巧
為什麼要使用「遊戲角色」呢?
因為遊戲角色積木很適合處理「互相碰撞」的狀況,也可以很簡單的讓遊戲角色彼此不會互相干擾,對於同一個畫面裡,具有許多不同方向、不同移動速度的角色說,是相當方便的功能。
為什麼要使用「遊戲暫停」和「遊戲繼續」呢?
因為使用了「遊戲角色」,如果不將遊戲暫停,角色的 LED 燈會影響畫面顯示,進而造成得分無法順利顯示的狀況 ( 只會顯示一次就消失 )。
為什麼不使用內建的「遊戲得分」呢?
如果使用了內建的「遊戲得分」,顯示得分後會造成「遊戲結束」,然而內建的「遊戲結束」必須重新啟動 micro:bit 才能再次遊戲,所以在這個範例就不使用「遊戲得分」。
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~