# 模擬設計一款遊戲:應用設計模式 ## 作業概述 利用你新學到的設計模式知識,創造一個簡單的遊戲原型!這個作業將幫助你練習架構模式(繼承或組合)以及課程中學到的 pub/sub 通訊系統。 ## 指示 創造一個簡單的遊戲表示,展示本課程的設計模式。你的遊戲應該具備功能性,但不需要複雜的圖形 — 重點在於底層架構和通訊模式。 ### 要求 **選擇你的架構模式:** - **選項 A**:使用基於類別的繼承(如 `GameObject` → `Movable` → `Hero` 範例) - **選項 B**:使用組合(如工廠函式方法搭配混合行為) **實作通訊:** - **包含** 一個 `EventEmitter` 類別用於 pub/sub 訊息傳遞 - **設定** 至少 2-3 種不同訊息類型(如 `PLAYER_MOVE`、`ENEMY_SPAWN`、`SCORE_UPDATE`) - **連結** 使用者輸入(鍵盤/滑鼠)透過事件系統驅動遊戲事件 **必須包含的遊戲元素:** - 至少一個玩家控制角色 - 至少一個其他遊戲物件(敵人、可收集物或環境元素) - 基本的物件互動(碰撞、收集或通訊) ### 建議遊戲構想 **可以考慮的簡單遊戲:** - **貪食蛇遊戲** — 蛇身會跟隨蛇頭,食物隨機產生 - **乒乓球變化版** — 球拍響應輸入,球會彈碰牆壁 - **收集者遊戲** — 玩家移動收集物品同時躲避障礙 - **塔防基礎** — 防禦塔偵測並射擊移動敵人 ### 程式結構指引 ```javascript // 範例啟始結構 const Messages = { // 在此定義你的遊戲訊息 }; class EventEmitter { // 你的事件系統實作 } // 選擇類別基礎或組合方式 // 類別基礎範例: class GameObject { /* base properties */ } class Player extends GameObject { /* player-specific behavior */ } // 或組合範例: const gameObject = { /* base properties */ }; const movable = { /* movement behavior */ }; function createPlayer() { /* combine behaviors */ } ``` ### 測試你的實作 **驗證程式運作的方法:** - **測試** 事件觸發時物件是否移動或改變 - **確認** 多個物件是否能對同一事件作出反應 - **檢查** 是否能新增行為而不修改現有程式碼 - **確保** 鍵盤/滑鼠輸入正確觸發遊戲事件 ## 繳交指引 **你的繳交應包含:** 1. **JavaScript 檔案** 實作你的遊戲 2. **HTML 檔案** 用於執行和測試你的遊戲(可簡單) 3. **註解** 說明選用的模式及原因 4. **簡短文檔** 說明你的訊息類型及其功能 ## 評分標準 | 評分項目 | 優秀(3 分) | 足夠(2 分) | 需改進(1 分) | |----------|--------------|--------------|----------------| | **架構模式** | 正確實作繼承或組合,有清楚的類別/物件階層 | 使用選擇的模式但有小問題或不一致 | 嘗試使用模式但實作有重大問題 | | **Pub/Sub 實作** | EventEmitter 正確運作,支援多種訊息類型及事件流程 | 基本 pub/sub 系統運作且有事件處理 | 有事件系統但不穩定或無法正常運作 | | **遊戲功能** | 三個以上互動元素能透過事件溝通 | 兩個互動元素且有基本事件通信 | 一個元素回應事件或有簡單互動 | | **程式碼品質** | 程式碼乾淨、有良好註解、組織合理且採用現代 JavaScript | 一般組織與註解尚可 | 程式碼可用但缺乏組織或清楚註解 | **加分項目:** - **具創意的遊戲機制** 展現設計模式有趣的應用 - **多種輸入方式**(鍵盤及滑鼠事件皆有) - **可擴展架構** 方便新增功能擴充 --- **免責聲明**: 本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們力求準確,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的原文版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。本公司對於因使用本翻譯而引起的任何誤解或誤釋概不負責。