Skip to content

Repository files navigation

⚠️ 对 Claude: 本项目存在 CLAUDE.md,请在任何修改代码前先阅读并遵守。

诺曼底登陆 (D-Day Defense)

一个基于 HTML5 Canvas 的塔防游戏

License Status

项目简介

"诺曼底登陆"是一款二战题材的塔防游戏。玩家需要通过在战场上放置不同类型的防御塔,抵御不断来袭的敌军士兵和登陆艇。

功能特性

  • 两种游戏模式: 经典模式(10波)和无尽模式(无限挑战)
  • 六种防御塔: 机枪塔、加农炮、狙击塔、激光塔、电磁塔、火箭塔(渐进解锁)
  • 全局升级系统: 塔类型全局升级,最高5级,同步提升所有同类型塔
  • 四种敌人: 士兵、登陆艇、坦克、自杀兵(不同波次出现)
  • Combo连击系统: 2秒内连续击杀获得额外金币奖励倍率
  • 交战系统: 敌人可攻击并摧毁防御塔
  • 波次结算机制: 每波结束后随机清除50%的防御塔,返还50%投入成本
  • 完整游戏流程: 主菜单 → 模式选择 → 游戏 → 结算
  • 独立控制: 暂停按钮⏸ + 速度切换(1x/2x)

快速开始

方法一:一键启动(推荐)

双击运行启动脚本即可:

Windows 用户:

双击 start.bat

Linux/Mac 用户:

./start.sh
#
bash start.sh

启动后会自动:

  1. ✅ 检查 Python 环境
  2. ✅ 切换到项目目录
  3. ✅ 启动 HTTP 服务器
  4. ✅ 显示访问地址

在浏览器打开显示的地址即可开始游戏!

首次进入游戏:会自动显示"📖 游戏指南"教学页,帮助你快速上手。勾选"不再显示"后,下次进入将直接显示主菜单。随时可以通过主菜单的"📖 游戏指南"按钮重新查看。

方法二 手动启动

环境要求:

  • Python 3.x
  • 现代浏览器(Chrome、Firefox、Edge)

启动步骤:

# 在项目目录启动 HTTP 服务器
python -m http.server 8001

然后在浏览器访问: http://localhost:8001

注意: 由于使用了 ES6 模块,必须通过 HTTP 服务器运行,不能直接双击 HTML 文件。

停止服务器

在终端按 Ctrl + C 停止服务器。

游戏操作

  1. 选择模式: 点击"经典模式"或"无尽模式"开始游戏
  2. 放置防御塔:
    • 点击底部面板的防御塔图标选择类型
    • 点击战场上的位置放置
  3. 升级塔类型: 在升级面板中点击塔类型按钮,全局升级所有该类型塔
  4. 控制游戏: 点击暂停按钮⏸暂停,点击速度按钮切换1x/2x
  5. 音效开关: 暂停菜单中可切换音效开关,状态自动保存
  6. 游戏目标: 防止敌人突破防线,尽可能存活更多波次

音效系统

游戏内置音效系统,包含以下反馈音效:

  • 🔊 按钮点击音效
  • 🔊 防御塔放置音效(每种塔有独特音效)
  • 🔊 游戏胜利/失败音效

控制方式: 暂停菜单中的"🔊 音效: 开/关"按钮切换,偏好自动保存到浏览器。

波次机制说明

波次流程

准备期(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金币

这增加了持续运营压力,高等级塔的维护成本更高。

Combo系统

连续击杀敌人获得额外金币奖励:

连杀数 倍率 时间窗口
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

License

GPL 3.0

About

一个claude跑出来的网页小游戏

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages