兩個人一起玩的乒乓球:左邊的人用 W / S、右邊的人用 ↑ / ↓ 控制自己的球拍,把球打回對面。球從誰那邊出界,就是對方得 1 分,先得 5 分的人贏。這款是打磚塊的改編:一樣是反彈,但要學會兩組按鍵同時控制、用兩個分數變數,還有得分後重新發球

今天要做出來的作品

執行結果:發球、兩人對打、漏接得分重新發球、先得 5 分贏

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

學習目標

  • 兩組按鍵同時控制:用「重複無限次」+「如果〈○ 鍵被按下?〉」,兩個人同時按也不會互相卡住
  • 兩個分數變數:左邊分數、右邊分數各記各的
  • 得分後重新發球:球出界 → 廣播「出界」→ 記分 → 廣播「得分」→ 舞台判斷有沒有人到 5 分 → 沒有就廣播「發球」
  • 碰到直立的球拍反彈:面朝(0 − 方向)

遊戲規則

  • 按綠旗:兩邊分數歸零,球從中間發出,隨機往左或往右。
  • 左球拍:按住 W 往上、S 往下;右球拍:按住 ↑ 往上、↓ 往下。兩個人可以同時按。
  • 球碰到上下邊會反彈,碰到球拍會被打回去。
  • 球從右邊出界 → 左邊得 1 分;從左邊出界 → 右邊得 1 分。每得 1 分,球回到中間重新發。
  • 先得 5 分的人贏,跳出「左邊贏了!」或「右邊贏了!」,不再發球。
廣播誰喊誰收到、做什麼
發球舞台(綠旗、還沒人贏)球回到中間發球
出界球(跑出左右邊界)球自己看在哪一邊,幫對方加分,再喊「得分」
得分舞台判斷有沒有人到 5 分
遊戲結束舞台(有人到 5 分)字卡顯示誰贏

步驟 1:畫球桌、球拍和球

角色區:左球拍、右球拍、球、字卡
  1. 開新專案,刪掉小貓。舞台畫一張綠色球桌(名字「球桌」),中間畫一條白色虛線。
  2. 畫一支直立的球拍(寬約 12、高約 80),名字「左球拍」。
  3. 在角色區對左球拍按右鍵 →「複製」,改名「右球拍」,換個顏色。
  4. 畫一顆小圓當「」。
  5. 畫「字卡」,兩個造型「左邊贏了!」「右邊贏了!」,造型名字取「左邊贏」「右邊贏」。
  6. 變數類建兩個變數:左邊分數右邊分數,把右邊分數的顯示框拖到舞台右上角。

💡 為什麼右球拍用複製的?兩支球拍的程式幾乎一樣,只差位置和按鍵。先做好左球拍再複製,只要改三個地方,不會漏寫。

💡 為什麼分數要兩個變數?兩個人各有各的分數。只用一個「分數」的話,左邊得分和右邊得分會加在一起,不知道誰贏。

步驟 2:球拍——兩組按鍵同時控制

偵測類的〈○ 鍵被按下?〉
左球拍的程式:定位到左邊,重複無限次檢查 W 和 S

左球拍:當綠旗被點擊 → 定位到 x:-210、y:0 → 重複無限次〔如果〈w 鍵被按下?〉那麼 y 改變 8;如果〈s 鍵被按下?〉那麼 y 改變 -8〕。

右球拍的程式:定位到右邊,重複無限次檢查上和下方向鍵

右球拍一樣,只改成 x:210,按鍵改成向上向下(就是方向鍵 ↑ ↓)。

事件類的「當 ○ 鍵被按下」——這款不用它

💡 為什麼不用事件類的「當 ○ 鍵被按下」?那個積木靠的是鍵盤的「連發」:按住一個鍵,電腦會一直重複送出那個鍵。可是兩個人同時按住兩個鍵時,電腦只會連發最後按下的那一個,另一個人的球拍就不動了。

💡 為什麼「重複無限次+如果〈鍵被按下?〉」就可以?它不靠連發,而是每一格畫面都去問:「W 現在有沒有被按著?」「↑ 現在有沒有被按著?」兩個問題各問各的,兩個人同時按住都會回答「有」,兩支球拍一起動。

💡 為什麼 W 和 S 用兩個「如果」,不用「如果…否則」?「否則」的意思是「沒按 W 就往下」,那麼什麼都不按球拍也會一直往下掉。兩個獨立的「如果」:按 W 才往上、按 S 才往下,都不按就停著。

✅ 檢查點:兩個人同時按住 W 和 ↑,兩支球拍一起往上;放開就停住。

步驟 3:球——發球、反彈、出界

動作類:面朝 ○ 度、方向
球的程式:收到發球回中間、隨機方向、一直移動直到出界;碰到球拍面朝 0 − 方向;收到出界就幫對方加分
  1. 當綠旗被點擊 → 隱藏。
  2. 當收到訊息「發球」→ 定位到 x:0、y:0 → 面朝(隨機取數 60 到 120)度 → 如果〈(隨機取數 1 到 2)= 1〉那麼 右轉 180 度 → 顯示 → 等待 1 秒 → 重複直到〈x 座標 > 200〉或〈x 座標 < -200〉〔移動 7 點 → 碰到邊緣就反彈 → 如果〈碰到 左球拍?〉或〈碰到 右球拍?〉那麼 面朝(0 − 方向)度 → 移動 10 點 → 播放音效 Boing〕→ 隱藏 → 廣播「出界」。
  3. 當收到訊息「出界」→ 如果〈x 座標 > 0〉那麼 左邊分數 改變 1,否則 右邊分數 改變 1 → 廣播「得分」。

💡 為什麼發球是「面朝 60 到 120 度,再一半機會右轉 180」?90 度是正右方,60 到 120 是往右、稍微偏上或偏下。再用「隨機 1 到 2」擲硬幣,一半機會轉 180 度變成往左。這樣每一球不知道往哪邊,兩個人都要準備。

💡 為什麼碰到球拍是「面朝 0 − 方向」?打磚塊的磚塊是橫的,要上下顛倒(180 − 方向)。乒乓的球拍是直的,要左右顛倒:往右上 60 度的球,0 − 60 = -60,變成往左上。上下不變、左右相反,就是撞到直牆的樣子。

💡 為什麼反彈後還要「移動 10 點」?球可能有一小截已經陷進球拍裡。反彈後如果還碰著球拍,下一格又會再反彈一次,球就卡在球拍上抖。先往外多走 10 點離開球拍,就不會重複反彈。

💡 為什麼出界的條件用 x 座標,而不是等「碰到邊緣」?上下邊也是邊緣,碰到上下只是反彈,不算失分。只有往左右跑過頭才是漏接,所以用 x 座標判斷。

💡 為什麼是 200,不是舞台最邊邊的 240?球拍站在 x = ±210。球一越過 200,就已經跑到球拍的後面、不可能再被正面打回去了。如果等到 240 才算出界,球可能卡在球拍後面和舞台邊緣之間,一直「碰到球拍反彈、碰到邊緣反彈」來回抖,永遠不會出界。

💡 為什麼出界後看「x 座標 > 0」?球停在右邊(x 是正的),表示右邊的人沒接到,得分的是左邊;停在左邊就是右邊得分。

步驟 4:舞台當裁判、字卡宣布贏家

舞台的程式:綠旗歸零發球;收到得分就判斷有沒有人 5 分
  1. 舞台:當綠旗被點擊 → 背景換成 球桌 → 左邊分數設為 0 → 右邊分數設為 0 → 廣播「發球」。
  2. 舞台:當收到訊息「得分」→ 如果〈左邊分數 = 5〉或〈右邊分數 = 5〉那麼 廣播「遊戲結束」,否則 廣播「發球」。
字卡的程式:收到遊戲結束,看誰 5 分就換成那張造型
  1. 字卡:當綠旗被點擊 → 隱藏;當收到訊息「遊戲結束」→ 如果〈左邊分數 = 5〉那麼 造型換成 左邊贏,否則 造型換成 右邊贏 → 圖層移到 最上 層 → 顯示。

💡 為什麼得分後要先問舞台,不讓球直接重新發?球只知道「我出界了」,不知道比賽結束了沒。每得一分都交給舞台判斷:還沒人到 5 分才喊「發球」,有人到了就喊「遊戲結束」,球就不會在比賽結束後又發出來。

💡 為什麼用「或」?左邊到 5 分或右邊到 5 分,任何一個人贏了比賽就結束,所以兩個條件用「或」接起來。

✅ 檢查點:兩人對打,球碰球拍會打回去;漏接時對方分數加 1、球回中間 1 秒後重新發;有人到 5 分就跳出贏家,球不再出現。

步驟 5:存檔繳交

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

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

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

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

狀況多半是
兩個人同時按,只有一邊會動用了事件類「當 ○ 鍵被按下」,要改成重複無限次+如果〈○ 鍵被按下?〉
不按鍵球拍也一直往下用了「如果…否則」,要改成兩個獨立的「如果」
右球拍按 W 也會動複製後忘了把按鍵改成向上、向下
球卡在球拍上一直抖反彈後少了「移動 10 點」
球碰到上下邊就算失分出界條件寫成「碰到邊緣」,要改成 x 座標 > 200 或 < -200
球卡在球拍後面抖個不停、一直不算分出界的數字太大(例如 230),球跑到球拍後面出不去;改成 200
得分加錯邊出界那段的「如果 x 座標 > 0」裡,加分的變數放反了
有人 5 分了還在發球舞台收到「得分」時沒有判斷,直接廣播了「發球」

換成你自己的(必做)

  • ☐ 換外觀:球桌、球拍、球換成你自己的主題(足球、冰球、太空…)
  • ☐ 至少改一條規則:勝利分數、球速、球拍移動速度、球拍長度選一個改
  • ☐ 找同學實際對打一局,確認兩個人同時按都能動
  • ☐ 按一次綠旗能打到其中一邊贏

挑戰(做完的人選一題)

  • ★ 球拍不能跑出舞台:y 超過 140 或小於 -140 就不再移動(提示:「如果」裡用「且」多加一個 y 座標的條件)。
  • ★ 得分時舞台閃一下顏色或播放音效。
  • ★★ 越打越快:每被球拍打回去一次,球的速度加快一點(提示:用變數「速度」取代「移動 7 點」的 7,每次發球設回 7)。
  • ★★ 發球往剛剛失分的那一邊,而不是隨機(提示:出界時記下「誰失分」)。
  • ★★★ 做「單人模式」:右球拍由電腦控制,自動跟著球的 y 移動,但速度比球慢一點才打得贏。

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

  • ☐ 兩個人同時按住按鍵,兩支球拍都會動嗎?
  • ☐ 球碰到球拍會被打回去、不會卡住嗎?
  • ☐ 漏接時,分數加在正確的那一邊嗎?
  • ☐ 得分後球會回到中間、等一下再發嗎?
  • ☐ 有人到 5 分時,會顯示誰贏、不再發球嗎?
  • ☐ 說得出:為什麼「重複無限次+如果〈鍵被按下?〉」可以讓兩個人同時控制?「得分」是喊的、收到?