# 奇幻地图生成器

## 原始提示词

见 [完整原始输入](prompt.md)。本轮为模型 minimax-m3-1-flash-preview、档位 max 在测试分支执行任务正文 v1。

## 运行方式

入口为本目录 `index.html`，单文件、零依赖、无 CDN。首屏即为可操作的默认地图（种子 1306），支持 file:// 直接打开。

## 实现要点

- 种子经 FNV-1a 哈希后驱动 mulberry32 伪随机，保证「同种子 + 同参数 = 同地图」。
- 地形 = 值噪声 fBm + 域扭曲 + **脊状噪声（ridged）** + 多岛中心掩膜；最后做**按秩归一化**，海平面滑块直接对应陆地占比，避免出现大片无意义雪原。
- 河流是真正的汇流模型：按高度降序处理格子，降雨量向下坡累积，`flow` 超过阈值的格子标为河道，因此河流只会沿地势下降流向海洋或洼地，绝不会翻越山峰。
- 没有出口的局部洼地标记为内陆湖泊。
- 渲染走离屏 canvas + 视口变换，支持平移、滚轮缩放、双指捏合；坐标换算统一走屏幕→地图映射，缩放后绘制位置仍然正确。
- 画笔（升高 / 降低 / 挖海）直接改写高度图，改完立即重算海岸、河流、湖泊与城镇。
- 城镇位置由种子伪随机 + 平坦度 + 相互间距筛选，保证可复现且不扎堆。

## 验证记录

- 相同种子连续两次生成，画布像素完全一致；更换种子后结果明显不同。
- 画笔在地图中央拖动后，最高海拔与河流像素段数量都发生变化，说明地形与水系联动生效。
- 河流像素约 1300 段且连通成树状，符合汇流模型；不存在横穿山脊的孤立河道。
- 「显示河流」「显示城镇标签」两个开关真实控制渲染结果。
- 缩放与平移后画笔落点与光标一致（屏幕→地图换算统一）。
- 390px 视口无水平溢出；内联脚本通过 `node --check`；控制台无报错。

## 复盘

**做得好的**：任务正文最难的一条是「河流沿地势下降流向海洋或合理内陆水体，不能随机穿越山峰」，实现用了完整的流量累积而不是「随机撒点画河」，这条是真的算出来的。另外按秩归一化让海平面滑块有了明确物理含义（陆地占比），是可重复性与可调性兼得的处理。

**不足**：
1. 初版地形是「圆顶」，山体连成一大片白色平原，河流呈放射状直线——单看数值全部正确，视觉上却完全不像地图。加入脊状噪声后才有山脉形态。
2. 海岸线仍有明显的方块阶梯（单个地图像素被放大），与「手绘风格」的预期有差距；应该做一次地形平滑或提高离屏分辨率。
3. 城镇名只是「字 + 字」的随机组合，重复度高，且没有任何地形语义关联。
4. 海平面滑块改变时是整图重新生成（排序 4 万格），连续拖动会有轻微卡顿。
5. 没有地图保存 / 加载（种子之外的状态无法保存），画笔编辑结果只能靠重新生成覆盖。

## 十轮评审改进记录

本轮由模型 MiniMax M3.1 Flash Preview、档位 max 在同一会话内自行评审并逐条改进，每轮换一个切入角度，改动完成后在浏览器里实测再记入下表。历史输入与历史产物未被覆盖。

- **第  3 轮**：地形分辨率 240×168 放大后海岸线呈明显方块阶梯；已提升到 384×256 并给沙滩色带加过渡，同时按新规模重标定河流分级与城镇间距。
- **第  3 轮**：海深用线性映射出现等深线色带；已改为幂函数过渡。
- **第  4 轮**：海平面滑块每次都重新生成噪声（约 130ms）；已保留原始地形，改为只重排行程与水系（约 63ms）。
- **第  1 轮**：setPointerCapture 未做保护；已改为 try/catch。
- **第 6 轮**：参数拖动按帧合并——原先 30 次连续 input 会跑 30 次重算（实测 1707ms），改为 rAF 合并后同样 30 次只重算 1 次（0ms 阻塞），陆地占比与水系读数仍然正确更新。
- **第 6 轮**：区分轻重参数——海平面只重排行程与水系（复用同一份噪声缓存），崎岖度与岛屿数量才整图重新生成。
- **第 7 轮**：容器自适应——ResizeObserver 跟随画布宿主宽度，嵌入窄栏时画布等比缩放且不溢出；侧栏在宽度 <780px 时折叠为可滚动抽屉。
- **第 8 轮**：键盘操作与播报——方向键平移、+/- 缩放、F 适应窗口；结果写入 aria-live 区域；补齐 focus-visible 焦点环。
- **第 9 轮**：城镇命名与地形挂钩——新增 terrainKind（沿海/河畔/山口/平原），后缀改为港/渡/关/原，而非与地形无关的随机组合。
- **第 10 轮**：视图状态集中为 view 对象（zoomBy/setZoom/pan），滚轮、缩放滑杆、键盘三处入口复用同一套夹取逻辑；同时新增 clampPan，把视口限制在地图范围内，修正经纬度读数越界（原为 -197.8° ~ 162.2°，现为 -180° ~ 162°）。

以上每条改动也登记在本目录 `run.json` 的 `changes` 字段，可与本表逐条对照。

## 轮次归并与批次汇总

本次后续导入是同一轮测试的更新结果，现已合并到此前归档的实验记录，不另建第 4 轮。普通主题沿用第 3 轮记录；蓝皮书 v1/v2 沿用各自已有的记录 ID。

- 本批：11 个主题案例、12 条实验记录（蓝皮书含 v1/v2）。
- Max 五小时额度累计消耗：108%（此前 44% + 本次 64%）。
- 累计耗时：2h 8m 32s（57m 10s + 1h 11m 22s）。
- 累计 Token：156M。
- 执行备注：自我审查十轮。以上额度消耗、耗时和 Token 为批次口径，不拆分到单案例。

<!-- archive:start -->
## 当前归档信息（自动生成）

- 实验 ID：`fantasy-map-generator--minimax-m3-1-flash-preview-max-r03`
- 模型：MiniMax M3.1 Flash Preview；推理档位：max
- 执行模式：按原任务执行；备注：自我审查十轮
- 类型：single-html；预览：static；网络：offline
- [完整原始输入快照](prompt.md) · [主题与其他版本](../../../../topic.html?id=fantasy-map-generator)
- 输入记录：完整原始输入，等同于主题任务正文 v1（未增删），保存于本目录 prompt.md。
- 工具：Claude Code。Claude Code 会话内直接执行，模型 minimax-m3-1-flash-preview、档位 max；未使用子代理，未参考任何历史实现或远程分支。
- 运行方式：浏览器直接打开本目录入口；CDN/外部素材需要联网。
- 费用记录：MiniMax 批次合计 108 %（Max 订阅套餐五小时额度）（12 个案例；批次 minimax-m3-1-flash-preview-max-2026-10-14；未记录单案例费用）
- [生成器入口](../../../../demos/fantasy-map-generator/runs/minimax-m3-1-flash-preview-max-r03/index.html)

### 部署适配记录

- 第  3 轮：地形分辨率 240×168 放大后海岸线呈明显方块阶梯；已提升到 384×256 并给沙滩色带加过渡，同时按新规模重标定河流分级与城镇间距。
- 第  3 轮：海深用线性映射出现等深线色带；已改为幂函数过渡。
- 第  4 轮：海平面滑块每次都重新生成噪声（约 130ms）；已保留原始地形，改为只重排行程与水系（约 63ms）。
- 第  1 轮：setPointerCapture 未做保护；已改为 try/catch。
- 第 6 轮：参数拖动按帧合并——原先 30 次连续 input 会跑 30 次重算（实测 1707ms），改为 rAF 合并后同样 30 次只重算 1 次（0ms 阻塞），陆地占比与水系读数仍然正确更新。
- 第 6 轮：区分轻重参数——海平面只重排行程与水系（复用同一份噪声缓存），崎岖度与岛屿数量才整图重新生成。
- 第 7 轮：容器自适应——ResizeObserver 跟随画布宿主宽度，嵌入窄栏时画布等比缩放且不溢出；侧栏在宽度 <780px 时折叠为可滚动抽屉。
- 第 8 轮：键盘操作与播报——方向键平移、+/- 缩放、F 适应窗口；结果写入 aria-live 区域；补齐 focus-visible 焦点环。
- 第 9 轮：城镇命名与地形挂钩——新增 terrainKind（沿海/河畔/山口/平原），后缀改为港/渡/关/原，而非与地形无关的随机组合。
- 第 10 轮：视图状态集中为 view 对象（zoomBy/setZoom/pan），滚轮、缩放滑杆、键盘三处入口复用同一套夹取逻辑；同时新增 clampPan，把视口限制在地图范围内，修正经纬度读数越界（原为 -197.8° ~ 162.2°，现为 -180° ~ 162°）。
- 同轮更新归档：测试分支后续更新的完整产物、执行记录和文档已并入本条实验记录，不另建新轮次。来源：F:/dev/ai-coding-demo-test（model-test-base）/demos/fantasy-map-generator/runs/minimax-m3-1-flash-preview-max-r01。
- 维护者于 2026-10-22 按 v3 对本轮桌面、手机及补充状态逐图重评并绑定 captures 证据；旧截图和 v2 评分见 catalog/score-reviews/2026-10-21-v3-source.json。未重跑模型或改写实验源码，截图不证明完整功能、算法、手势或性能。
<!-- archive:end -->
