# 模拟游戏:应用设计模式 ## 作业概述 运用你新学的设计模式知识,创建一个简单的游戏原型!本作业将帮助你练习架构模式(继承或组合)以及本课中介绍的发布/订阅通信系统。 ## 说明 创建一个简单的游戏表示,展示本课的设计模式。你的游戏应当是可运行的,但不需要复杂的图形——重点放在底层架构和通信模式上。 ### 要求 **选择你的架构模式:** - **选项 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 正确支持多消息类型和事件流 | 基础发布/订阅系统可用,但事件处理有限 | 实现了事件系统但不可靠 | | **游戏功能** | 有三种及以上通过事件通信的交互元素 | 两种交互元素并实现基本事件通信 | 单一元素响应事件或基础交互 | | **代码质量** | 代码整洁、有注释、组织合理,使用现代 JS | 代码一般组织良好,有足够注释 | 代码可用但缺乏组织或注释 | **加分项:** - **有创造性的游戏机制**,展示设计模式的有趣用法 - **多种输入方式**(键盘及鼠标事件) - **可扩展架构**,便于未来增加新功能 --- **免责声明**: 本文件由AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)翻译而成。尽管我们力求准确,但请注意自动翻译可能包含错误或不准确之处。原始文件的原文版本应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或错误解释承担责任。