# 模擬一款遊戲:應用設計模式 ## 作業概述 運用你新學到的設計模式知識,製作一個簡單的遊戲原型!此作業將幫助你練習本課程中學到的架構模式(繼承或組合)以及發佈/訂閱通訊系統。 ## 指示 建立一個簡單的遊戲表示,展示本課程中的設計模式。你的遊戲應該是可運作的,但不需要複雜的圖形——重點在底層架構與通訊模式。 ### 要求 **選擇你的架構模式:** - **選項 A**:使用基於類別的繼承(如 `GameObject` → `Movable` → `Hero` 範例) - **選項 B**:使用組合(如工廠函式方法搭配混合行為) **實現通訊:** - **包含** 一個 `EventEmitter` 類別以實現發佈/訂閱訊息功能 - **設定** 至少 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 分) | |------|-------------|-------------|---------------| | **架構模式** | 正確實作繼承或組合,類別 / 物件層級清晰 | 使用所選模式,但有些微問題或不一致 | 嘗試使用模式,但實作有明顯問題 | | **發佈/訂閱實作** | EventEmitter 正確運作,多訊息類型及事件流程妥當 | 基本發佈/訂閱系統運作,有部分事件處理 | 有事件系統,但不穩定或無法運作 | | **遊戲功能性** | 三個以上互動元素,透過事件互通 | 兩個互動元素,有基本事件通訊 | 一個元素回應事件或只有基本互動 | | **程式碼品質** | 簡潔,詳盡註解,組織邏輯清楚,且採用現代 JavaScript | 大致組織良好,註解適中 | 程式碼可運作但缺組織與清楚註解 | **額外加分:** - **具創意的遊戲機制**,展現設計模式有趣的應用 - **多元輸入方式**(鍵盤及滑鼠事件皆有) - **可擴充架構**,便於未來加入新功能 --- **免責聲明**: 本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。文件原文應視為權威資料來源。對於重要資訊,建議採用專業人工翻譯。我們對因使用本翻譯版本而產生的任何誤解或誤譯概不負責。