經典的打磚塊:用滑鼠控制下面的球拍把球彈上去,打掉上面兩排共 12 塊磚。全部打掉就過關;球掉到底下會少一條命,3 條命用完遊戲結束。這堂要學三件新本事:反彈角度(球打在球拍哪裡,就往哪邊飛)、生命值,還有用廣播管整個遊戲的狀態:開始畫面 → 開始 → 過關/遊戲結束。

今天要做出來的作品

執行結果:開始畫面、球拍接球、打到磚塊、過關、漏接少一條命、遊戲結束

老師上課會先打開 08_打磚塊.sb3 按一次綠旗,大家一起看成品長什麼樣子。 📥 下載本堂講義 PDF

學習目標

  • 反彈角度:碰到球拍時「面朝(球的 x − 球拍的 x)× 1.2 度」;碰到磚塊時「面朝 180 − 方向」
  • 生命值:用變數「生命」記還剩幾次機會,用「重複直到〈生命 = 0〉」一顆一顆重新發球
  • 遊戲狀態:用四則廣播「開始畫面、開始、過關、遊戲結束」決定現在該做什麼
  • 複習:分身(排磚塊)、滑鼠(球拍跟著鼠標的 x)

遊戲規則

  • 按綠旗:分數 0、生命 3,出現「打磚塊 按空白鍵開始」的開始畫面。
  • 按空白鍵:開始畫面消失,上面排出兩排共 12 塊磚,球從球拍上方發出去。
  • 球碰到上、左、右的邊會反彈;碰到球拍會彈回去,打在球拍左邊往左飛、打在右邊往右飛、打在正中間直直往上
  • 球碰到磚塊:磚塊消失、分數加 1,球反彈回來。
  • 球掉到底下的紅線:生命少 1,1 秒後重新發球。
  • 過關:12 塊都打掉 → 「過關!」。遊戲結束:生命變 0 → 「遊戲結束」。
廣播誰喊誰收到、做什麼
開始畫面舞台(綠旗)字卡顯示標題,等空白鍵
開始字卡(按下空白鍵)磚塊排出分身、球開始發球、舞台開始等 12 分
打到磚塊磚塊分身球反彈回來
過關舞台(分數 = 12)字卡顯示「過關!」、球藏起來停下
遊戲結束球(生命 = 0)字卡顯示「遊戲結束」

步驟 1:畫角色和背景

角色區:字卡、磚塊、球拍、球
  1. 開新專案,刪掉小貓。舞台畫一張深色背景(名字「夜空」),最下面畫一條紅線,提醒玩家「掉到這裡就少一條命」。
  2. 用「繪畫」畫四個角色:

球拍:一條長方形(寬約 100、高約 15)。 – :一個小圓(約 20)。 – 磚塊:一塊長方形(寬約 60、高約 20)。 – 字卡:三個造型,分別打上「打磚塊/按空白鍵開始」「過關!」「遊戲結束」,造型名字取「標題」「過關」「遊戲結束」。

  1. 變數類建兩個變數:分數生命

💡 為什麼這些都自己畫?打磚塊的東西都是簡單的長方形和圓,自己畫最快,而且大小剛好。角色庫的圖形狀不規則,碰撞會很奇怪(看起來沒碰到卻算碰到)。

💡 為什麼磚塊只畫一塊?等一下用分身排出 12 塊。只畫一塊,改顏色、改大小都只要改一次。

步驟 2:舞台和字卡——用廣播管遊戲狀態

事件類:當收到訊息、廣播訊息

先點舞台:

舞台的程式:綠旗歸零、廣播開始畫面;收到開始就等分數 12 喊過關
  1. 當綠旗被點擊 → 背景換成 夜空 → 分數設為 0 → 生命設為 3 → 廣播「開始畫面」
  2. 當收到訊息「開始」→ 等待直到〈分數 = 12〉→ 廣播「過關」。

再點字卡:

字卡的程式:開始畫面等空白鍵、過關和遊戲結束各換一個造型
  1. 當收到訊息「開始畫面」→ 造型換成 標題 → 圖層移到 最上 層 → 顯示 → 等待直到〈空白 鍵被按下?〉→ 隱藏 → 廣播「開始」
  2. 當收到訊息「過關」→ 造型換成 過關 → 圖層移到 最上 層 → 顯示;「遊戲結束」也一樣做一段。

💡 為什麼不要一按綠旗就開打,要先有開始畫面?玩家按了綠旗,可能手還沒放到滑鼠上球就掉了。開始畫面等玩家準備好按空白鍵才喊「開始」,而且每一局都從同一個狀態出發。

💡 為什麼磚塊、球都聽「開始」,不聽綠旗?遊戲有好幾個階段,每個角色只要聽「現在是哪個階段」就知道該做什麼。以後想加「第二關」,只要再喊一次「開始」,不必按綠旗重來。

💡 為什麼「過關」由舞台判斷,不讓最後一塊磚喊?分數是大家共用的,舞台一個人看分數最清楚。讓磚塊判斷的話,每一塊都要多寫「如果分數=12」,改關卡時要改 12 個地方。

💡 為什麼字卡用「等待直到〈空白鍵被按下?〉」,不用「當空白鍵被按下」?「當空白鍵被按下」任何時候都會觸發,玩到一半按空白鍵就會重新喊「開始」、多排出 12 塊磚。「等待直到」只在開始畫面那一刻等,其他時間按空白鍵不會怎樣。

步驟 3:球拍跟著滑鼠

球拍的程式:定位到下面,重複無限次 x 設為 鼠標的 x

當綠旗被點擊 → 定位到 x:0、y:-140 → 重複無限次〔x 設為 鼠標的 x〕。

💡 為什麼只設 x,不用「定位到 鼠標」?球拍只能左右移動。用「定位到 鼠標」的話,球拍會跟著滑鼠跑到舞台中間,玩家可以直接拿球拍去撞磚塊。

步驟 4:磚塊用分身排成兩排

磚塊的程式:綠旗隱藏;收到開始用兩層重複排出 12 個分身;分身等碰到球就廣播、加分、刪除
  1. 當綠旗被點擊 → 隱藏。
  2. 當收到訊息「開始」→ 定位到 x:-175、y:100 → 圖像效果清除 → 重複 2 次〔重複 6 次〔建立 自己 的分身 → x 改變 70〕→ x 設為 -175 → y 改變 -30 → 圖像效果 顏色 改變 40〕。
  3. 當分身產生 → 顯示 → 等待直到〈碰到 球?〉→ 廣播「打到磚塊」 → 分數改變 1 → 分身刪除。

💡 為什麼是「重複裡面再放一個重複」?裡面那層「重複 6 次」負責排一整排:放一塊、往右移 70,放下一塊。外面那層「重複 2 次」負責換排:排完一排回到最左邊(x 設為 -175)、往下一格(y 改變 -30)再排一排。

💡 為什麼每塊往右移 70,磚塊只有 60 寬?多出來的 10 是縫。沒有縫的話,磚塊黏成一整條,看不出是一塊一塊的。

💡 為什麼每排要「顏色 改變 40」?分身出生時會照抄本尊當下的樣子。本尊換了顏色才生下一排,下一排就是新顏色,一塊磚塊造型就能變出兩種顏色。

💡 為什麼打到磚塊要「廣播」給球?磚塊知道自己被打到,但要轉方向的是球。磚塊喊一聲「打到磚塊」,球聽到就自己反彈。

✅ 檢查點:按綠旗出現開始畫面;按空白鍵,開始畫面消失、上面排出兩排共 12 塊不同顏色的磚;球拍跟著滑鼠左右走。

步驟 5:球——發球、反彈角度、生命值

動作類:面朝 ○ 度、方向
偵測類:鍵被按下?、「舞台 的 背景編號」這塊可以改成「球拍 的 x 座標」

點「球」,拼出這幾段:

球的程式:收到開始後重複直到生命 0,每一顆球發球、移動、碰球拍改方向,掉下去生命減 1;收到打到磚塊就面朝 180 − 方向
  1. 當綠旗被點擊 → 隱藏。
  2. 當收到訊息「開始」→ 重複直到生命 = 0〉〔

定位到 x:0、y:-100 → 面朝(隨機取數 -40 到 40)度 → 顯示 → 等待 1 秒 → 重複直到〈y 座標 < -165〉〔移動 8 點 → 碰到邊緣就反彈 → 如果〈碰到 球拍?〉那麼 面朝((x 座標 −(球拍 的 x 座標))× 1.2)度 → 播放音效 Boing〕→ 隱藏 → 生命 改變 -1〕→ 廣播「遊戲結束」。

  1. 當收到訊息「打到磚塊」→ 面朝(180 − 方向)度
  2. 當收到訊息「過關」→ 隱藏 → 停止 這個物件的其它程式。

「球拍 的 x 座標」在偵測類:拖出「舞台 的 背景編號」,左邊選「球拍」,右邊選「x 座標」。

💡 為什麼碰到球拍用「(球的 x − 球拍的 x)× 1.2」?這個數字就是「球打在球拍中心的哪一邊、偏多遠」。打在正中間是 0,面朝 0 度就是直直往上;打在右邊是正的,往右上飛;打在左邊是負的,往左上飛。玩家就能靠移動球拍控制球的方向,這就是打磚塊好玩的地方。

💡 為什麼要乘 1.2?球拍一半寬大約 50,加上球的半徑差不多是 60。乘 1.2,打在最邊邊時大約 72 度,球斜斜飛出去但還是往上。乘太大(例如 3)會超過 90 度,球直接往下掉,看起來像穿過球拍。

💡 為什麼碰到磚塊是「面朝 180 − 方向」?在 Scratch 裡 0 度朝上、180 度朝下。往右上 30 度飛的球,180 − 30 = 150,變成往右下 150 度:左右不變、上下顛倒,就像撞到天花板彈下來。

💡 為什麼碰到球拍不也用「180 − 方向」?那樣每次反彈角度都一樣,玩家怎麼接都沒差,球會一直在同幾條路線來回,永遠打不到角落的磚塊。

💡 為什麼生命用「重複直到〈生命 = 0〉」包住整個發球?每漏接一次,生命減 1,然後迴圈回到最上面重新發球。生命還沒到 0 就一直發,到 0 迴圈才結束、往下喊「遊戲結束」。不必寫三次發球的程式。

💡 為什麼發球前要「等待 1 秒」?漏接後馬上發球,玩家來不及把球拍移回中間。停 1 秒讓玩家看清楚「我漏了一顆」,再準備接下一顆。

✅ 檢查點:按空白鍵後球會發出去;接球時打在球拍左邊球往左飛、右邊往右飛;打到磚塊磚塊消失、分數加 1;故意漏接,生命會 3 → 2 → 1 → 0 然後出現「遊戲結束」;打掉 12 塊出現「過關!」,球停下來。

步驟 6:存檔繳交

檔案選單的下載到你的電腦

檔案 → 下載到你的電腦,再上傳到 Google Classroom。

💡 為什麼一定要下載?線上版 Scratch 沒登入不會幫你存,關掉分頁就沒了。

收不到、不會動?先查這幾件事

狀況多半是
按綠旗後沒有開始畫面舞台最後沒廣播「開始畫面」,或字卡收的訊息選錯
按空白鍵沒反應字卡的「等待直到」裡要放偵測類的〈空白 鍵被按下?〉,不是事件類的帽子
玩到一半按空白鍵多出一堆磚塊用了「當空白鍵被按下 → 廣播開始」,改用字卡的「等待直到」
左上角有一塊磚打不掉磚塊本尊沒有在綠旗時隱藏
磚塊全部疊在同一個位置裡面那層重複少了「x 改變 70」
球黏在球拍上一直抖反彈角度的乘數太大,或寫成「右轉 180 度」
球打到磚塊直接穿過去磚塊分身沒有「廣播 打到磚塊」,或球沒有「當收到訊息 打到磚塊」
生命變成負的迴圈條件寫成「生命 < 0」,要寫「生命 = 0」
過關了球還在跑球收到「過關」少了「停止 這個物件的其它程式」

換成你自己的(必做)

  • ☐ 換外觀:球、球拍、磚塊、背景換成你自己的主題(太空、海底、糖果…)
  • ☐ 至少改一條規則:磚塊的排數或每排塊數(過關分數要跟著改)、生命數、球的速度選一個改
  • ☐ 開始畫面換成你自己的遊戲名字
  • ☐ 過關和遊戲結束兩種結局都玩得到

挑戰(做完的人選一題)

  • ★ 幫遊戲配背景音樂:收到「開始」時開始播放,收到「過關」或「遊戲結束」時停止。
  • ★ 打到磚塊時播放音效,漏接時球拍說「哎呀!」。
  • ★★ 越打越快:分數每多 3 分,球的移動步數多 1(提示:「移動 8 點」改成「移動(8 + 分數 ÷ 3)點」)。
  • ★★ 過關後出現「第二關」:字卡顯示 2 秒後再喊一次「開始」,排出新的磚塊(過關分數要改成 24)。
  • ★★★ 做一種「硬磚」:要打兩次才會消失(提示:分身用一個造型代表完整、打一次換成裂開的造型,第二次才刪除)。

互看檢查表(兩人互相打勾)

  • ☐ 按綠旗會先出現開始畫面,按空白鍵才開始嗎?
  • ☐ 打在球拍左邊、右邊,球飛的方向不一樣嗎?
  • ☐ 打到磚塊,磚塊會消失、分數加 1 嗎?
  • ☐ 漏接會少一條命、重新發球;命用完會出現「遊戲結束」嗎?
  • ☐ 打掉全部磚塊會出現「過關!」,球會停下來嗎?
  • ☐ 說得出:「開始」是喊的?收到了?為什麼磚塊打到了要用廣播告訴球?