Skip to content

Repository files navigation

导弹指挥官 (Missile Command)

经典雅达利街机游戏的现代重制版!保护你的城市免受敌方导弹的攻击。

🎮 游戏特色

  • 经典玩法:忠实还原1980年雅达利原版游戏机制
  • 世界城市主题:17个世界知名城市,每个城市都有独特的建筑特色和视觉效果
  • 现代视觉:使用HTML5 Canvas技术,带有粒子效果和爆炸动画
  • 完整音效系统:基于Web Audio API的经典游戏音效
  • 背景音乐:沉浸式的复古电子音乐BGM
  • 关卡递进:随着关卡增加,敌方导弹速度和数量会增加,城市主题会循环切换
  • 计分系统:击毁敌方导弹获得分数,保护城市获得奖励
  • 视觉效果:炫酷的轨迹、爆炸和粒子效果
  • 响应式设计:支持不同屏幕尺寸,移动设备也可正常游玩

🚀 快速开始

方法一:使用启动脚本(推荐)

# Windows
.\start_game.bat

# macOS/Linux
./start_game.sh

方法二:手动启动

# 启动本地服务器
python -m http.server 8000

# 然后在浏览器中打开
# http://localhost:8000

⚠️ 重要提示:由于背景音乐使用了Web Audio API,必须通过HTTP服务器运行游戏才能正常播放音效。直接双击HTML文件会导致音效无法播放。

🎵 音效系统

🔊 游戏音效

  • 🚀 发射音效:锯齿波频率下降模拟导弹发射
  • 💥 爆炸音效:三层合成的真实爆炸声(冲击声+隆隆声+质感噪声)
  • ⚡ 链式爆炸:短促的二级爆炸音效
  • 🏚️ 城市被摧毁:低沉的哀鸣声
  • 💀 游戏结束:下降音阶的悲伤旋律
  • 🎉 关卡完成:上升音阶的胜利旋律

🎶 背景音乐

  • 复古电子风格:80年代街机游戏风格的BGM
  • 循环播放:无缝循环的背景音乐
  • 智能控制:游戏暂停时自动暂停,恢复时自动恢复
  • 音量平衡:低音量设计,不会掩盖游戏音效

🎛️ 音频控制

  • 🔊/🔇 音效开关:控制所有游戏音效的开关
  • 🎶/🎵 音乐开关:独立控制背景音乐的开关

🕹️ 游戏控制

  • 鼠标点击:在屏幕任意位置点击发射拦截导弹
  • 空格键:暂停/继续游戏
  • R键:重新开始游戏
  • 按钮控制:使用界面上的按钮进行游戏控制

🎯 游戏规则

目标

保护底部的6座城市不被敌方导弹摧毁

玩法

  1. 发射导弹:点击屏幕任意位置,拦截导弹会飞向该点并爆炸
  2. 击毁敌弹:用爆炸范围摧毁飞向城市的敌方导弹
  3. 关卡递进:清空所有敌方导弹后进入下一关
  4. 游戏结束:所有城市被摧毁时游戏结束

计分方式

  • 击毁敌方导弹:25分
  • 关卡结束城市奖励:每座存活城市100分

🎨 游戏元素

元素 描述
主题建筑 你需要保护的城市,每关会展示不同世界城市的特色建筑
白色发射台 位于屏幕底部中央,你的导弹发射基地
青色轨迹 你发射的拦截导弹轨迹
红色轨迹 敌方攻击导弹轨迹
黄色爆炸 你的导弹爆炸,可以摧毁敌方导弹
红色爆炸 敌方导弹爆炸,会摧毁城市

🏙️ 世界城市主题

游戏包含17个精心设计的世界城市主题,每个城市都有独特的建筑特色和视觉效果:

城市 特色建筑 视觉特点
🏮 北京 天安门风格门楼、传统飞檐屋顶 古都新貌,传统中国建筑风格
🗼 上海 东方明珠塔、现代玻璃幕墙 现代化都市,发光球体装饰
🌆 深圳 LED屏幕建筑、信号塔波纹 科技新城,动态LED像素效果
🏢 纽约 帝国大厦阶梯建筑、美式窗户网格 不夜之城,摩天大楼群
🎌 东京 东京塔、霓虹灯效果 科技之都,红白相间塔身结构
🕰️ 伦敦 大本钟、维多利亚式窗户 雾都风情,动态时钟指针
🗼 巴黎 埃菲尔铁塔、法式阳台 浪漫之都,钢架结构和浪漫灯光
🎭 悉尼 悉尼歌剧院、海港灯塔 海港明珠,帆状屋顶和港口灯光
🏯 京都 清水寺、传统日式纸窗 古都风韵,多层屋顶和寺庙灯笼
🕌 新德里 印度门、莫卧儿圆顶 印度风情,拱形建筑和永恒之火
⛪ 莫斯科 圣瓦西里大教堂、洋葱头圆顶 红场风情,多彩圆顶和雪花效果
👑 马德里 皇宫、红瓦屋顶 西班牙风情,弗拉门戈色彩光效
⚓ 里斯本 贝伦塔、葡式瓷砖 航海之都,蓝白瓷砖和船舱窗户
🏗️ 柏林 勃兰登堡门、现代德式建筑 现代之都,胜利女神四马战车和德国色彩
🦁 开普敦 桌山、非洲传统图案 非洲之星,平顶桌山和传统几何装饰
🥝 惠灵顿 议会"蜂巢"、毛利螺旋图案 新西兰之心,独特建筑和自然元素
🏙️ 新加坡 滨海湾金沙、现代摩天楼 狮城明珠,无边泳池和热带装饰

城市主题切换

  • 每关显示一个城市主题,共17关为一个循环
  • 关卡18重新从北京开始,关卡35再次从北京开始,如此循环
  • 每个城市都有独特的色彩搭配、建筑风格和动画效果

🎮 游戏策略

  1. 预判轨迹:提前预测敌方导弹的落点
  2. 合理爆炸:利用爆炸范围一次摧毁多个敌方导弹
  3. 节约导弹:同时最多只能发射3枚导弹,合理分配
  4. 保护重点:优先保护剩余较少的城市

🔧 技术实现

  • HTML5 Canvas:游戏渲染引擎
  • JavaScript ES6+:游戏逻辑和类结构
  • Web Audio API:实时生成的经典游戏音效
  • HTML5 Audio:背景音乐播放
  • CSS3:界面样式和动画效果
  • 模块化架构:代码拆分成多个逻辑清晰的文件
  • 原生Web技术:无需额外依赖,直接在浏览器中运行

🗂️ 项目结构

Missile_Command/
├── index.html          # 主页面
├── style.css           # 样式文件
├── README.md           # 说明文档
├── start_game.bat      # Windows启动脚本
├── start_game.sh       # macOS/Linux启动脚本
├── music/              # 背景音乐资源
│   └── Untitled.mp3    # 游戏背景音乐
└── js/                 # JavaScript模块
    ├── AudioManager.js # 音效和音乐管理系统
    ├── GameConfig.js   # 游戏配置和常量
    ├── GameObject.js   # 游戏对象类定义
    ├── render/         # 模块化渲染系统
    │   ├── BackgroundRenderer.js  # 背景和星空渲染
    │   ├── ObjectRenderer.js      # 城市和发射台渲染(使用城市渲染器工厂)
    │   ├── cities/                # 城市渲染器模块
    │   │   ├── BaseCityRenderer.js    # 城市渲染器基类
    │   │   ├── BeijingRenderer.js     # 北京城市渲染器
    │   │   ├── ShanghaiRenderer.js    # 上海城市渲染器
    │   │   ├── ShenzhenRenderer.js    # 深圳城市渲染器
    │   │   ├── NewYorkRenderer.js     # 纽约城市渲染器
    │   │   ├── TokyoRenderer.js       # 东京城市渲染器
    │   │   ├── LondonRenderer.js      # 伦敦城市渲染器
    │   │   ├── ParisRenderer.js       # 巴黎城市渲染器
    │   │   ├── SydneyRenderer.js      # 悉尼城市渲染器
    │   │   └── CityRendererFactory.js # 城市渲染器工厂
    │   ├── MissileRenderer.js     # 导弹渲染
    │   ├── EffectRenderer.js      # 爆炸和粒子特效
    │   ├── UIRenderer.js          # 用户界面渲染
    │   └── GameRenderer.js        # 主渲染协调器
    ├── game/           # 模块化游戏逻辑系统
    │   ├── GameCore.js     # 游戏核心基础类
    │   ├── GameEvents.js   # 事件处理模块
    │   ├── GameMissiles.js # 导弹管理模块
    │   ├── GameLogic.js    # 游戏逻辑和碰撞检测
    │   └── GameLevel.js    # 关卡和状态管理
    ├── MissileCommand.js # 主要游戏协调器
    └── main.js         # 游戏初始化

📋 模块说明

  • AudioManager.js: 完整的音效系统,包括音效生成和背景音乐播放
  • GameConfig.js: 包含所有游戏参数、颜色、字体等配置,以及17个城市主题的完整配置
  • GameObject.js: 定义导弹、爆炸、粒子、城市等游戏对象类
  • 渲染模块: 模块化的渲染系统,提供高质量的视觉效果
    • BackgroundRenderer.js: 多层背景主题和星空效果
    • ObjectRenderer.js: 城市和发射台渲染,使用城市渲染器工厂模式
    • 城市渲染器模块: 基于工厂模式和继承模式的城市渲染系统
      • BaseCityRenderer.js: 城市渲染器基类,提供通用方法和色彩处理
      • BeijingRenderer.js: 北京渲染器(天安门、传统飞檐)
      • ShanghaiRenderer.js: 上海渲染器(东方明珠塔、现代玻璃幕墙)
      • ShenzhenRenderer.js: 深圳渲染器(LED屏幕、信号塔波纹)
      • NewYorkRenderer.js: 纽约渲染器(帝国大厦、美式窗户网格)
      • TokyoRenderer.js: 东京渲染器(东京塔、霓虹灯效果)
      • LondonRenderer.js: 伦敦渲染器(大本钟、维多利亚式窗户)
      • ParisRenderer.js: 巴黎渲染器(埃菲尔铁塔、法式阳台)
      • SydneyRenderer.js: 悉尼渲染器(歌剧院、海港灯塔)
      • KyotoRenderer.js: 京都渲染器(清水寺、传统纸窗)
      • NewDelhiRenderer.js: 新德里渲染器(印度门、莫卧儿圆顶)
      • MoscowRenderer.js: 莫斯科渲染器(圣瓦西里大教堂、洋葱头圆顶)
      • MadridRenderer.js: 马德里渲染器(皇宫、弗拉门戈色彩)
      • LisbonRenderer.js: 里斯本渲染器(贝伦塔、葡式瓷砖)
      • BerlinRenderer.js: 柏林渲染器(勃兰登堡门、现代德式建筑)
      • CapeTownRenderer.js: 开普敦渲染器(桌山、非洲传统图案)
      • WellingtonRenderer.js: 惠灵顿渲染器(议会蜂巢、毛利文化)
      • SingaporeRenderer.js: 新加坡渲染器(滨海湾金沙、热带装饰)
      • CityRendererFactory.js: 城市渲染器工厂,管理渲染器实例
    • MissileRenderer.js: 发光轨迹和火箭造型导弹
    • EffectRenderer.js: 层次丰富的爆炸和粒子特效
    • UIRenderer.js: 发光文字和界面元素
    • GameRenderer.js: 统一的渲染协调器
  • 游戏逻辑模块: 模块化的游戏系统,代码结构清晰易维护
    • GameCore.js: 游戏核心基础类,包含初始化和渲染
    • GameEvents.js: 事件处理模块,管理鼠标键盘和按钮交互
    • GameMissiles.js: 导弹管理模块,处理玩家和敌方导弹逻辑
    • GameLogic.js: 游戏逻辑模块,处理更新、碰撞检测和爆炸效果
    • GameLevel.js: 关卡管理模块,处理游戏状态、关卡切换和音频
  • MissileCommand.js: 主要游戏协调器,组合所有功能模块
  • main.js: 游戏初始化入口和UI控制

🏗️ 城市渲染系统架构

🎨 设计模式

城市渲染系统采用了经典的设计模式组合:

  • 工厂模式: CityRendererFactory 负责创建和管理不同城市的渲染器实例
  • 继承模式: 所有城市渲染器都继承自 BaseCityRenderer 基类
  • 单一职责原则: 每个城市渲染器只负责一个城市的特色建筑渲染

🔧 实现机制

  1. 基类 (BaseCityRenderer):

    • 提供通用的建筑基础绘制方法
    • 实现颜色处理辅助函数(变亮、变暗、色彩转换)
    • 定义标准的窗户绘制方法
    • 强制子类实现 render() 方法
  2. 具体城市渲染器:

    • 每个城市都有独立的文件和类
    • 实现独特的地标建筑(东方明珠塔、大本钟等)
    • 自定义窗户样式和建筑风格
    • 添加特色动画效果(如时钟指针转动、LED像素闪烁)
  3. 工厂管理器 (CityRendererFactory):

    • 根据关卡号自动选择对应的城市渲染器
    • 实现8关循环:关卡1→北京,关卡9→北京,关卡17→北京...
    • 提供默认渲染器作为备选方案

🔄 添加新城市指南

要添加新的城市主题,需要以下步骤:

  1. GameConfig.js 中添加城市主题配置:
18: { // 新城市
    name: '城市名',
    nameEn: 'City Name',
    background: '#颜色代码',
    skyGradient: ['#颜色1', '#颜色2'],
    // ... 其他配置
}
  1. 创建新的城市渲染器 (js/render/cities/NewCityRenderer.js):
class NewCityRenderer extends BaseCityRenderer {
    constructor() {
        super();
        this.name = '城市名';
        this.nameEn = 'City Name';
    }
    
    render(city, index, cityTheme, time, ctx) {
        // 实现城市特色建筑渲染
    }
}
  1. 在工厂中注册新渲染器:
// CityRendererFactory.js
this.renderers.set(18, new NewCityRenderer());
  1. 更新循环数量:
// CityRendererFactory.js - getRenderer方法
const themeIndex = ((level - 1) % 18) + 1;
  1. index.html 中引入新的渲染器文件:
<script src="js/render/cities/NewCityRenderer.js"></script>

⚙️ 技术特点

  • 模块化: 每个城市独立管理,易于维护和扩展
  • 可扩展性: 添加新城市无需修改现有代码
  • 性能优化: 工厂模式避免重复创建实例
  • 代码复用: 基类提供通用功能,减少代码重复
  • 视觉一致性: 统一的色彩处理和基础渲染方法

🐛 常见问题

Q: 为什么没有音效?

A: 请确保通过HTTP服务器运行游戏(使用启动脚本),而不是直接双击HTML文件。

Q: 背景音乐无法播放?

A: 这是浏览器的CORS安全策略导致的,必须通过HTTP服务器访问。使用提供的启动脚本即可解决。

Q: 游戏在移动设备上的体验如何?

A: 游戏采用响应式设计,支持触屏操作,在移动设备上也能正常游玩。


重温经典,保卫地球! 🌍💥🚀

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages