iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
自我挑戰組

micro:bit 從入門到精通系列 第 27

Day27 ( 遊戲設計 ) 老鼠走迷宮

老鼠走迷宮

教學原文參考:老鼠走迷宮

這篇文章會介紹如何使用「創建角色」、「角色是否碰到其他角色」、「陣列」、「變數」、「邏輯判斷」、「計次迴圈」、「當按鈕按下」等積木,實作一個老鼠走迷宮的 LED 燈小遊戲。

相關文章參考:創建角色角色是否碰到其他角色當按鈕按下陣列變數邏輯判斷

遊戲方式

老鼠走迷宮是一個簡單的小遊戲,遊戲開始後,下方會有一個「老鼠」的 LED 燈亮起,上方會有「牆壁」不斷往下移動 ( 就像老鼠不斷往上爬 ),使用者需要操縱「老鼠」左右移動閃躲牆壁,如果老鼠撞到牆壁就輸了。使用 micro:bit 的遊戲操作步驟如下:

  • AB 按鈕同時按下,開始遊戲。
  • 遊戲開始後,下方出現「老鼠」角色 LED,上方出現「牆壁」往下移動 ( 亮度較暗 )。
  • 按下 A 按鈕,老鼠角色往左移動。
  • 按下 B 按鈕,老鼠角色往右移動。
  • 老鼠從道路穿過牆壁就得分。
  • 牆壁撞到老鼠,遊戲結束,顯示最後得分。

micro:bit - 老鼠走迷宮

積木程式原理

首先設定啟動時的變數:

  • 變數 mouse 為老鼠角色,座標設定為 (2,4)。
  • 變數 list 為一個「二維陣列」,表示不斷降下的「牆壁」
    • 二維陣列裡每個陣列,用數字表示表示哪三顆燈要亮起。
    • 例如 (1,2,3) 表示亮起第二顆、第三顆和第四顆燈
  • 變數 run 作為遊戲開始的判斷,預設 0。

micro:bit - 老鼠走迷宮

設定 A、B 按鈕控制老鼠移動的程式,按下 A 按鈕時角色 x 改變 -1 ( 老鼠往左移 ),按下 B 按鈕時角色 x 改變 1 ( 老鼠往右移 )。

micro:bit - 老鼠走迷宮

設定 AB 按鈕同時按下,遊戲開始的程式:

  • 設定分數的變數 score,預設 0。
  • 將變數 run 改為 1,表示開始遊戲。
  • 新增變數 run2,預設 0,如果後續程式裡變成 1,就會出現第二層牆壁
  • 新增變數 run3,預設 0,如果後續程式裡變成 1,就會出現第三層牆壁
  • 新增變數 time,預設 1000,表示牆壁往下移動的速度 ( 單位毫秒 )。

micro:bit - 老鼠走迷宮

接著設計「第一層」牆壁往下移動的程式:

  • 新增一個「重複無限次」積木。
  • 放入邏輯判斷積木,判斷如果 run 等於 1 就執行程式
  • 新增 wall 變數,從 list 陣列中取出隨機項目,作為點亮牆壁燈號的位置。
  • 新增三個變數 w0、w1、w2,分別代表三個牆壁燈號角色,依據 wall 變數內容設定座標
  • 建立角色後,將亮度調整為 50 ( 比老鼠的亮度暗 )
  • 放入「計次迴圈」:
    • 將牆壁角色的 y 設為 index,每次迴圈執行時會往下移動。
    • 每次迴圈執行暫停 time 毫秒。
    • 如果 index 等於 2 ( 移動到第三次時 ),將 run2 設定為 1,讓第二層牆壁出現
  • 計次迴圈結束後,刪除三個牆壁角色 ( 表示沒有撞到老鼠 )。
  • 得分 score 增加 1。
  • 暫停 time 毫秒後再次重複。

micro:bit - 老鼠走迷宮

接著設計「第二層」牆壁往下移動的程式:

  • 複製第一層的重複無限次積木 ( 不需要從新開始,複製剛剛的積木再去進行修改 )。
  • 將邏輯判斷的 run1 改成 run2
  • 再重複一開始時,將變數 run2 改為 0 ( 避免重複執行 )。
  • 將下方所有 w0、w1、w2 變數改成 w3、w4、w5
  • 將計次迴圈裡的變數 run2 改成 run3,讓第三層牆壁出現

micro:bit - 老鼠走迷宮

接著設計「第三層」牆壁往下移動的程式:

  • 複製第二層的重複無限次積木 ( 不需要從新開始,複製剛剛的積木再去進行修改 )。
  • 將邏輯判斷的 run2 改成 run3
  • 將下方所有 w3、w4、w5 變數改成 w6、w7、w8
  • 計次迴圈結束後,讓 time 減少 20 ( 讓牆壁移動的速度變快 )。

micro:bit - 老鼠走迷宮

在來設計「老鼠碰到牆壁」的程式:

  • 新增一個重複無限次積木。
  • 放入邏輯判斷積木,判斷如果 run 等於 1,就開始進行碰撞偵測。
  • 再放入三組邏輯判斷積木:
    • 如果第一層牆壁存在 ( w0 存在 ),老鼠如果碰到 w0 或 w1 或 w2 就暫停遊戲
    • 如果第二層牆壁存在 ( w3 存在 ),老鼠如果碰到 w3 或 w4 或 w5 就暫停遊戲
    • 如果第三層牆壁存在 ( w6 存在 ),老鼠如果碰到 w6 或 w7 或 w8 就暫停遊戲
  • 在判斷 run 等於 1 的邏輯積木之後,新增另外一個邏輯積木
    • 判斷「如果遊戲暫停」( 表示遊戲結束 )。
    • 將變數 run 設為 0 ( 表示遊戲準備重新開始 )。
    • 顯示最後得分。

micro:bit - 老鼠走迷宮

最後,在按下 A+B 按鈕的積木裡,加入邏輯判斷程式:

  • 判斷如果 w0 存在 ( 第一層三個燈還存在 ),就刪除第一層三個燈。
  • 判斷如果 w3 存在 ( 第二層三個燈還存在 ),就刪除第二層三個燈。
  • 判斷如果 w6 存在 ( 第三層三個燈還存在 ),就刪除第三層三個燈。
  • 清空畫面 ( 將顯示分數清除 )。
  • 繼續遊戲。

micro:bit - 老鼠走迷宮

完成後,啟動 micro:Bit,按下 AB 按鈕,就可以開始進行老鼠走迷宮的遊戲。

micro:bit - 老鼠走迷宮

範例修正

在遊戲的過程中,發現遊戲停止後,分數在某些情形下還會繼續累加,原因在於「計次迴圈」並沒有因為遊戲暫停而停止迴圈,這時只要透過簡單的邏輯判斷修正,判斷如果遊戲正在進行,才進行分數的累計

micro:bit - 老鼠走迷宮

範例解答

範例解答:老鼠走迷宮

實作「老鼠走迷宮」的小技巧

  • 為什麼要使用這麼多個「角色」呢?

    其實更好的做法是使用「陣列」判斷,但因為是透過「積木」來操作,使用陣列會造成積木排列的較為複雜,所以透過 MakeCode 內建的遊戲積木,建立角色,判斷角色碰撞,對於入門者來說較容易理解。

  • 為什麼要「判斷角色是否存在」呢?

    因為如果在「角色不存在」的狀況下「刪除角色」,會造成程式發生錯誤,所以在刪除角色之前,必須先判斷角色是否存在,如果角色存在,才能刪除角色。

  • 為什麼要使用「遊戲繼續」和「遊戲暫停」呢?

    因為 MakeCode 遊戲積木裡的「遊戲結束」功能,會讓整塊 micro:bit 功能停止運作,必須重新啟動才能繼續遊戲,且創立角色後,角色會影響 LED 所有的顯示畫面,使用了遊戲暫停就能避免這種情況發生。

關於我

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,如果對我有點興趣(笑,可以與我聯繫,一起來做點有玩又有創意的東西吧!


上一篇
Day26 ( 遊戲設計 ) 猴子接香蕉
下一篇
Day28 ( 遊戲設計 ) 吃角子老虎機
系列文
micro:bit 從入門到精通46

尚未有邦友留言

立即登入留言