网页版第一人称射击地牢 Roguelike —— 单个 HTML 文件 + 本地 Three.js,无需构建、双击即玩、断网可玩。
想在浏览器里随手开一局爽快的地牢射击?《末日地牢》以「元气骑士」为蓝本,采用房间制闯关:3 大关 ×(4 战斗房 + 补给房 + Boss 房),清空房间解锁出口、收集金币、挑战层层 Boss。
游戏全部代码封装在单个 fps.html 中,本地 Three.js 库兜底,无需安装任何东西——下载仓库、双击文件、拿起枪,30 秒内进入战斗。波间还会用波次号做随机种子重新生成地形,同一波可复现、每一局又有新变化。
本项目由 studyguy 通过 Vibe Coding 方式独立开发完成,仅供学习参考和娱乐。
- 爽快手感:Pointer Lock 鼠标视角、WASD 移动、轻点小跳/长按高跳、Shift 加速跑(消耗耐力)、C 蹲伏、防穿墙碰撞、脱战回血、受击方向指示、低血量警示、死亡慢镜头
- 4 把武器(除手枪外需拾取武器箱解锁,数字键 1~4 / 滚轮切换):
- 🔫 手枪:开局自带、无限弹药的应急兜底
- 🔫 步枪:全能主武器(34 伤 / 9 发每秒 / 30 弹匣)
- 💥 霰弹枪:8 弹丸锥形散射 + 命中击退,近距爆发
- 🎯 狙击枪:右键开镜、爆头 220,远射手对点
- 马里奥赛车式道具:发光道具箱(? 标记)拾取后 F 键使用——回血 / 弹药 / 加速 / 炸弹 / 直线火箭 / 追踪弹 / 闪电 / 星星无敌 / 幽灵隐身;武器增强道具(伤害 +20%、射速 +15%、扩容 +50%、精准 ×0.7)拾取即生效、本局永久、3 级封顶
- 4 类敌人融合 L4D2 机制:突击兵 / 疾行者 / 重装兵 / 射手,攻击带前摇红光预警;疾行者飞扑压制(蹲伏可躲)、射手舌头拉拽(可射断)、突击兵死亡爆炸、重装兵冲锋撞墙自晕,每 8 波触发坦克 Boss 事件
- 程序化地形 × 战术动作:每波以波次号为种子重建地图(低台/跳台/矮墙/桥洞/能量高台渐进解锁),跳跃与蹲伏直接决定战术位置——矮墙蹲姿隐蔽、桥洞躲弹道、高台高风险高回报,无无敌点
- 场景表现:实时阴影、渐变天空、Web Audio 合成 20+ 音效与背景音乐
| 按键 | 功能 |
|---|---|
| WASD / 鼠标 | 移动 / 视角(点击画面锁定,灵敏度可调) |
| 左键 / 右键 | 射击(按住连发)/ 瞄准(狙击枪开镜) |
| 空格 | 跳跃(轻点小跳、长按高跳) |
| Shift / C | 加速跑(耗耐力)/ 蹲伏(可躲射手弹道) |
| R / F | 换弹 / 使用道具 |
| 1~4 / 滚轮 | 切换武器 |
| M / Esc | 声音开关 / 暂停 |
耐力:冲刺 30/s、跳跃 5/次;停止消耗 0.8s 后以 40/s 回复,耐力 <15 无法冲刺。指针锁定不可用时可用方向键转视角。
| 类型 | 解锁 | HP | 攻击 | 伤害 | 击杀分 |
|---|---|---|---|---|---|
| 🔴 突击兵 | 第 1 波 | 100 | 挥击+突进,死亡爆炸 | 10 | 100 |
| 🟠 疾行者 | 第 3 波 | 60 | 飞扑压制(蹲伏可躲) | 6 | 130 |
| ⚫ 重装兵 | 第 5 波 | 300 | 重击+击退,冲锋撞墙自晕 | 22 | 250 |
| 🟣 射手 | 第 7 波 | 80 | 远程光球 + 舌头拉拽(可射断) | 8 | 160 |
- 攻击流程:追击 → 前摇红光预警(可躲)→ 命中判定 → 突进 → 硬直 → 冷却
- 数值成长:HP ×(1+0.12(波−1)) 上限 ×3;伤害 ×(1+0.06(波−1)) 上限 ×1.8;移速 +0.05/波 上限 ×1.5
- 玩家:HP 100,受击无敌帧 0.4s(防围攻瞬秒),脱战 6s 后回血 6/s
- 受击反馈:红晕 + 白闪 + 震动 + 音效
| 地形 | 战术含义 |
|---|---|
| 低台 / 跳台(0.6m) | 跳跃可上;近战仍可命中 → 是机动位不是安全屋 |
| 中央能量高台(1.2m) | 第 7 波解锁的制高点,可俯射但会被射手命中、被围只能跳下 |
| 矮墙(1.35m) | 蹲姿完全隐蔽、站姿露头挨打、可翻越、墙顶不可站立 |
| 桥洞(顶高 1.3m) | 蹲姿通行,可躲射手弹道与视线 |
地形生成硬约束:无重叠、无死路(网格 BFS 可达性校验)、坏图自动回退上一波;波间补给当前武器 + 其他已解锁武器 +30% 弹药。
| 方式 | 操作 |
|---|---|
| 🌐 在线游玩 | studyguy.github.io/doom-dungeon(GitHub Pages 自动部署 main 分支) |
| 💻 直接游玩 | 克隆仓库后双击 fps.html(three.min.js 为本地兜底,离线可用) |
| 🖥️ 本地服务器 | python -m http.server 8123 后访问 http://127.0.0.1:8123/fps.html |
- Three.js r152:本地
three.min.js优先,加载失败自动回退 jsdelivr / cdnjs / bootcdn / unpkg - 对象池:子弹 60、敌人 26、粒子 240、敌人弹幕 40,避免高频 GC
- 主循环:
requestAnimationFrame+ 防崩溃安全网(单帧异常不中断循环) - 确定性地形:以波次号为随机种子重建地图,同波可复现
- 调试工具(F12 控制台):
__game.debug.spawnWave(7) // 直接跳到第 7 波
__game.debug.teleportEnemyNear('brute', 3) // 传送重装兵到面前
__game.debug.toggleGod() // 无敌模式
__game.debug.regenerateMap() // 重抽当前地形
__game.debug.spawnSpecial('tank') // 生成特殊敌人doom-dungeon/
├── fps.html # 游戏全部代码(HTML + CSS + JS 单文件)
├── three.min.js # Three.js r152 本地兜底
├── index.html # GitHub Pages 根路径入口(跳转 fps.html)
├── CHANGELOG.md # 版本变更记录
├── docs/maintenance.md # 多机协作维护手册
└── .github/workflows/ # Pages 自动部署
- 提交规范:Conventional Commits(
feat/fix/docs/chore/refactor/test+ 中文描述) - 开工前
git pull --rebase;大改动开feature/xxx分支,详见 docs/maintenance.md
- 本项目由本人(studyguy)通过 Vibe Coding 方式独立开发完成,仅供学习参考和娱乐,若和别的项目有相似之处,纯属巧合。