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

老師上課會先打開
09_雙人乒乓.sb3按一次綠旗,大家一起看成品長什麼樣子。 📥 下載本堂講義 PDF
學習目標
- 兩組按鍵同時控制:用「重複無限次」+「如果〈○ 鍵被按下?〉」,兩個人同時按也不會互相卡住
- 兩個分數變數:左邊分數、右邊分數各記各的
- 得分後重新發球:球出界 → 廣播「出界」→ 記分 → 廣播「得分」→ 舞台判斷有沒有人到 5 分 → 沒有就廣播「發球」
- 碰到直立的球拍反彈:面朝(0 − 方向)
遊戲規則
- 按綠旗:兩邊分數歸零,球從中間發出,隨機往左或往右。
- 左球拍:按住 W 往上、S 往下;右球拍:按住 ↑ 往上、↓ 往下。兩個人可以同時按。
- 球碰到上下邊會反彈,碰到球拍會被打回去。
- 球從右邊出界 → 左邊得 1 分;從左邊出界 → 右邊得 1 分。每得 1 分,球回到中間重新發。
- 先得 5 分的人贏,跳出「左邊贏了!」或「右邊贏了!」,不再發球。
| 廣播 | 誰喊 | 誰收到、做什麼 |
|---|---|---|
| 發球 | 舞台(綠旗、還沒人贏) | 球回到中間發球 |
| 出界 | 球(跑出左右邊界) | 球自己看在哪一邊,幫對方加分,再喊「得分」 |
| 得分 | 球 | 舞台判斷有沒有人到 5 分 |
| 遊戲結束 | 舞台(有人到 5 分) | 字卡顯示誰贏 |
步驟 1:畫球桌、球拍和球

- 開新專案,刪掉小貓。舞台畫一張綠色球桌(名字「球桌」),中間畫一條白色虛線。
- 畫一支直立的球拍(寬約 12、高約 80),名字「左球拍」。
- 在角色區對左球拍按右鍵 →「複製」,改名「右球拍」,換個顏色。
- 畫一顆小圓當「球」。
- 畫「字卡」,兩個造型「左邊贏了!」「右邊贏了!」,造型名字取「左邊贏」「右邊贏」。
- 變數類建兩個變數:左邊分數、右邊分數,把右邊分數的顯示框拖到舞台右上角。
💡 為什麼右球拍用複製的?兩支球拍的程式幾乎一樣,只差位置和按鍵。先做好左球拍再複製,只要改三個地方,不會漏寫。
💡 為什麼分數要兩個變數?兩個人各有各的分數。只用一個「分數」的話,左邊得分和右邊得分會加在一起,不知道誰贏。
步驟 2:球拍——兩組按鍵同時控制


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

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

💡 為什麼不用事件類的「當 ○ 鍵被按下」?那個積木靠的是鍵盤的「連發」:按住一個鍵,電腦會一直重複送出那個鍵。可是兩個人同時按住兩個鍵時,電腦只會連發最後按下的那一個,另一個人的球拍就不動了。
💡 為什麼「重複無限次+如果〈鍵被按下?〉」就可以?它不靠連發,而是每一格畫面都去問:「W 現在有沒有被按著?」「↑ 現在有沒有被按著?」兩個問題各問各的,兩個人同時按住都會回答「有」,兩支球拍一起動。
💡 為什麼 W 和 S 用兩個「如果」,不用「如果…否則」?「否則」的意思是「沒按 W 就往下」,那麼什麼都不按球拍也會一直往下掉。兩個獨立的「如果」:按 W 才往上、按 S 才往下,都不按就停著。
✅ 檢查點:兩個人同時按住 W 和 ↑,兩支球拍一起往上;放開就停住。
步驟 3:球——發球、反彈、出界


- 當綠旗被點擊 → 隱藏。
- 當收到訊息「發球」→ 定位到 x:0、y:0 → 面朝(隨機取數 60 到 120)度 → 如果〈(隨機取數 1 到 2)= 1〉那麼 右轉 180 度 → 顯示 → 等待 1 秒 → 重複直到〈x 座標 > 200〉或〈x 座標 < -200〉〔移動 7 點 → 碰到邊緣就反彈 → 如果〈碰到 左球拍?〉或〈碰到 右球拍?〉那麼 面朝(0 − 方向)度 → 移動 10 點 → 播放音效 Boing〕→ 隱藏 → 廣播「出界」。
- 當收到訊息「出界」→ 如果〈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:舞台當裁判、字卡宣布贏家

- 舞台:當綠旗被點擊 → 背景換成 球桌 → 左邊分數設為 0 → 右邊分數設為 0 → 廣播「發球」。
- 舞台:當收到訊息「得分」→ 如果〈左邊分數 = 5〉或〈右邊分數 = 5〉那麼 廣播「遊戲結束」,否則 廣播「發球」。

- 字卡:當綠旗被點擊 → 隱藏;當收到訊息「遊戲結束」→ 如果〈左邊分數 = 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 分時,會顯示誰贏、不再發球嗎?
- ☐ 說得出:為什麼「重複無限次+如果〈鍵被按下?〉」可以讓兩個人同時控制?「得分」是誰喊的、誰收到?
