一个基于 HTML5 Canvas 的塔防游戏
"诺曼底登陆"是一款二战题材的塔防游戏。玩家需要通过在战场上放置不同类型的防御塔,抵御不断来袭的敌军士兵和登陆艇。
- 两种游戏模式: 经典模式(10波)和无尽模式(无限挑战)
- 六种防御塔: 机枪塔、加农炮、狙击塔、激光塔、电磁塔、火箭塔(渐进解锁)
- 全局升级系统: 塔类型全局升级,最高5级,同步提升所有同类型塔
- 四种敌人: 士兵、登陆艇、坦克、自杀兵(不同波次出现)
- Combo连击系统: 2秒内连续击杀获得额外金币奖励倍率
- 交战系统: 敌人可攻击并摧毁防御塔
- 波次结算机制: 每波结束后随机清除50%的防御塔,返还50%投入成本
- 完整游戏流程: 主菜单 → 模式选择 → 游戏 → 结算
- 独立控制: 暂停按钮⏸ + 速度切换(1x/2x)
双击运行启动脚本即可:
Windows 用户:
双击 start.bat
Linux/Mac 用户:
./start.sh
# 或
bash start.sh启动后会自动:
- ✅ 检查 Python 环境
- ✅ 切换到项目目录
- ✅ 启动 HTTP 服务器
- ✅ 显示访问地址
在浏览器打开显示的地址即可开始游戏!
首次进入游戏:会自动显示"📖 游戏指南"教学页,帮助你快速上手。勾选"不再显示"后,下次进入将直接显示主菜单。随时可以通过主菜单的"📖 游戏指南"按钮重新查看。
环境要求:
- Python 3.x
- 现代浏览器(Chrome、Firefox、Edge)
启动步骤:
# 在项目目录启动 HTTP 服务器
python -m http.server 8001然后在浏览器访问: http://localhost:8001
注意: 由于使用了 ES6 模块,必须通过 HTTP 服务器运行,不能直接双击 HTML 文件。
在终端按 Ctrl + C 停止服务器。
- 选择模式: 点击"经典模式"或"无尽模式"开始游戏
- 放置防御塔:
- 点击底部面板的防御塔图标选择类型
- 点击战场上的位置放置
- 升级塔类型: 在升级面板中点击塔类型按钮,全局升级所有该类型塔
- 控制游戏: 点击暂停按钮⏸暂停,点击速度按钮切换1x/2x
- 音效开关: 暂停菜单中可切换音效开关,状态自动保存
- 游戏目标: 防止敌人突破防线,尽可能存活更多波次
游戏内置音效系统,包含以下反馈音效:
- 🔊 按钮点击音效
- 🔊 防御塔放置音效(每种塔有独特音效)
- 🔊 游戏胜利/失败音效
控制方式: 暂停菜单中的"🔊 音效: 开/关"按钮切换,偏好自动保存到浏览器。
准备期(10秒) → 第1波开始 → 敌人刷新 → 波次完成 → 2秒结算 + 3秒准备 → 第2波 → ...
说明:
- 首波准备时间:10秒
- 后续波次:波次完成后等待2秒,然后3秒准备时间
- 每波结算:随机清除约50%已建防御塔,返还比例随波次递减
| 阶段 | 波次 | 返还比例 | 设计意图 |
|---|---|---|---|
| 前期 | 1-3波 | 40% | 新手保护期,允许试错调整布局 |
| 中期 | 4-7波 | 25% | 常规期,清除操作需要谨慎决策 |
| 后期 | 8-10波 | 10% | 紧张期,大规模清除是重大战略代价 |
示例:清除累计投入1000金币的防御塔
- 第2波返还:400金币
- 第5波返还:250金币
- 第9波返还:100金币
击杀敌人获得的金币随波次递减(极限紧缩):
| 阶段 | 波次 | 击杀奖励 | 设计意图 |
|---|---|---|---|
| 前期 | 1-2波 | 100% | 短暂的启动资金窗口 |
| 前期末 | 3波 | 70% | 开始收紧 |
| 中期 | 4-6波 | 40% | 明显紧缩 |
| 后期 | 7-9波 | 25% | 严重紧缩 |
| 大后期 | 10波+ | 20% | 极限紧缩 |
示例:击杀一个士兵(基础奖励18金币)
- 第2波获得:18金币
- 第3波获得:13金币(18×70%)
- 第5波获得:7金币(18×40%)
- 第8波获得:5金币(18×25%)
- 第10波获得:4金币(18×20%)
每波开始时,每座已建防御塔扣除 等级 × 10金币 维护费用。
示例:
- 10座Lv.1塔:每波扣除100金币
- 5座Lv.3塔:每波扣除150金币
这增加了持续运营压力,高等级塔的维护成本更高。
连续击杀敌人获得额外金币奖励:
| 连杀数 | 倍率 | 时间窗口 |
|---|---|---|
| 3杀 | 1.3x | 1.5秒内 |
| 5杀 | 1.6x | 1.5秒内 |
| 8杀 | 2.0x | 1.5秒内(上限) |
清除返还 + 击杀奖励 + 塔维护费用 + 高升级成本,确保经济压力贯穿始终:
- 前期(1-3波):金币紧张,必须精打细算
- 中期(4-7波):金币紧缩,每次升级都是重大决策
- 后期(8-10波):金币极限紧张,依靠前期积累的布局和技巧
敌人拥有护甲,防御塔拥有破甲能力:
实际伤害 = 塔伤害 × (1 - 敌人护甲 + 塔破甲)
| 敌人类型 | 护甲 | 说明 |
|---|---|---|
| 士兵 | 0% | 无甲,机枪塔高效 |
| 登陆艇 | 30% | 轻甲,机枪刮痧,加农炮有效 |
| 坦克 | 60% | 重甲,必须狙击/加农炮 |
| 自杀兵 | 0% | 无甲但快,必须激光拦截 |
| 防御塔 | 破甲 | 特效 |
|---|---|---|
| 机枪塔 | 0% | 无 |
| 加农炮 | 50% | 溅射30px |
| 狙击塔 | 100% | 无 |
| 激光塔 | 30% | 减速30% |
| 电磁塔 | 40% | 20%概率眩晕1秒 |
| 火箭塔 | 50% | 溅射80px |
每种塔有不可替代的场景,不能只用机枪塔通关:
| 防御塔 | 角色定位 | 最佳场景 | 对什么无效 |
|---|---|---|---|
| 机枪塔 | 清杂专用 | 士兵、自杀兵 | 登陆艇、坦克(刮痧) |
| 加农炮 | 破甲群伤 | 登陆艇集群、坦克 | 快速单位 |
| 狙击塔 | 点杀高威胁 | 坦克、远距离单位 | 集群 |
| 激光塔 | 拦截+减速 | 自杀兵、快速单位 | 重甲 |
| 电磁塔 | 控制 | 让所有敌人停顿 | 伤害低 |
| 火箭塔 | 终极清场 | 后期大规模集群 | 射速慢 |
战术示例:
- 第3波(登陆艇出现):必须加农炮,机枪打不动
- 第5波(坦克出现):必须狙击塔或升级加农炮
- 第7波(自杀兵出现):必须激光塔拦截
敌人现在能真正摧毁你的塔:
| 敌人类型 | HP | 攻击力 | 攻速 | 威胁等级 |
|---|---|---|---|---|
| 士兵 | 80 | 15 | 快 | ★★☆ |
| 登陆艇 | 300 | 40 | 中 | ★★★ |
| 坦克 | 600 | 80 | 慢 | ★★★★ |
| 自杀兵 | 50 | 200 | 极快 | ★★★★★(一击必杀) |
塔HP只有200,任何敌人都可能在几秒内摧毁它!
| 波次 | 敌人数量 | 关键威胁 | 必需塔组合 | 决策压力 |
|---|---|---|---|---|
| 第1-2波 | 40-45 | 士兵 | 机枪塔 | 入门期 |
| 第3-4波 | 50-55 | 士兵+登陆艇 | 机枪+加农炮 | 必须搭配 |
| 第5-6波 | 60-65 | 登陆艇+坦克 | 加农炮+狙击 | 针对性布局 |
| 第7-8波 | 70-75 | 坦克+自杀兵 | 狙击+激光 | 混合防御 |
| 第9-10波 | 80-85 | 全部类型 | 全塔种协同 | 高难度策略 |
- 敌人数量: 每波增加 5 个
- 刷新速度: 波次开始时较慢,随时间逐渐加快至最小间隔
- 敌人类型: 第3波登陆艇(轻甲)、第5波坦克(重甲)、第7波自杀兵(极速)
- 防御塔解锁: 第2波狙击塔、第5波激光塔、第7波电磁塔、第10波火箭塔
- 失败: 生命值降为 0
- 胜利(经典模式): 完成第 10 波
- 全局升级: 升级某个塔类型时,场上所有该类型的塔同步升级
- 最高等级: 5级
- 升级方式: 点击底部升级面板中的塔类型按钮
| 塔类型 | 1→2级 | 2→3级 | 3→4级 | 4→5级 | 总计 |
|---|---|---|---|---|---|
| 机枪塔 | 100 | 160 | 280 | 450 | 990 |
| 加农炮 | 180 | 300 | 500 | 800 | 1780 |
| 狙击塔 | 150 | 240 | 400 | 650 | 1440 |
| 激光塔 | 240 | 400 | 700 | 1100 | 2440 |
| 电磁塔 | 300 | 500 | 850 | 1300 | 2950 |
| 火箭塔 | 360 | 600 | 1000 | 1500 | 3460 |
| 等级 | 伤害倍率 | 范围倍率 | 射速倍率 |
|---|---|---|---|
| Lv.1 | 1.0x | 1.0x | 1.0x |
| Lv.2 | 1.4x | 1.15x | 1.08x |
| Lv.3 | 1.9x | 1.3x | 1.15x |
| Lv.4 | 2.5x | 1.45x | 1.22x |
| Lv.5 | 3.2x | 1.6x | 1.3x |
注:满级(5级)防御塔具有特殊视觉效果:渐变金橙红边框 + 金色等级数字
- 塔的基座大小随等级增大
- 塔主体大小随等级增大
- 边框颜色随等级变化(灰→银灰→蓝→紫→白)
- 满级(5级)特殊效果:渐变金橙红边框 + 金色等级数字
project/
├── index.html # 主页面
├── start.bat # Windows 启动脚本
├── start.sh # Linux/Mac 启动脚本
├── src/
│ ├── main.js # 入口文件
│ ├── styles.css # 样式文件
│ ├── core/
│ │ ├── Game.js # 游戏主控制器
│ │ ├── Renderer.js # 渲染器
│ │ └── Input.js # 输入处理
│ ├── entities/
│ │ ├── Enemy.js # 敌人类
│ │ ├── Tower.js # 防御塔类
│ │ └── Projectile.js # 子弹类
│ ├── systems/
│ │ ├── WaveSystem.js # 波次系统
│ │ ├── CollisionSystem.js # 碰撞检测
│ │ └── UpgradeSystem.js # 升级系统
│ └── utils/
│ └── config.js # 配置文件
└── docs/
├── PRD.md # 产品需求文档
├── spec.md # 技术规范
├── BUILD_LOG.md # 构建日志
├── TEST_PLAN.md # 测试计划
├── TEST_REPORT.md # 测试报告
├── RELEASE_NOTES.md # 发布说明
└── SKILLS_USED.md # Skills 使用记录
| 文档 | 描述 |
|---|---|
| PRD | 产品需求文档 |
| 技术规范 | 技术设计文档 |
| 构建日志 | 开发过程记录 |
| 测试计划 | 自动化测试计划 |
| 测试报告 | 测试执行报告 |
| 发布说明 | 版本发布记录 |
| Skills 使用记录 | webapp-testing 技能应用 |
- 2025-01-25: 项目初始化,完成 MVP 开发
- 2025-01-26: 添加倒计时、暂停/加速功能
- 2026-01-27: 修复波次跳变、画布清理、Canvas 尺寸等 Bug
- 2026-01-27: 完成三轮自动化测试,100% 通过率
| 测试轮次 | 日期 | 通过率 | 主要内容 |
|---|---|---|---|
| 第一轮 | 2025-01-26 | 67% | 事件绑定、数据结构问题 |
| 第二轮 | 2025-01-26 | 100% | 缺少倒计时提示 |
| 第三轮 | 2026-01-27 | 100% | 波次跳变、画布清理问题 |
| 第四轮 | 2026-01-28 | 100% | 三阶段功能验证(交战/结算/解锁) |
| 第五轮 | 2026-01-28 | 100% | 重构验证(全局升级/UI融合) |
详细测试报告请查看 TEST_REPORT.md
GPL 3.0