奇幻地图生成器
原始提示词
见 完整原始输入。本轮为模型 minimax-m3-1-flash-preview、档位 max 在测试分支执行任务正文 v1。
运行方式
入口为本目录 index.html,单文件、零依赖、无 CDN。首屏即为可操作的默认地图(种子 1306),支持 file:// 直接打开。
实现要点
- 种子经 FNV-1a 哈希后驱动 mulberry32 伪随机,保证「同种子 + 同参数 = 同地图」。
- 地形 = 值噪声 fBm + 域扭曲 + 脊状噪声(ridged) + 多岛中心掩膜;最后做按秩归一化,海平面滑块直接对应陆地占比,避免出现大片无意义雪原。
- 河流是真正的汇流模型:按高度降序处理格子,降雨量向下坡累积,
flow超过阈值的格子标为河道,因此河流只会沿地势下降流向海洋或洼地,绝不会翻越山峰。 - 没有出口的局部洼地标记为内陆湖泊。
- 渲染走离屏 canvas + 视口变换,支持平移、滚轮缩放、双指捏合;坐标换算统一走屏幕→地图映射,缩放后绘制位置仍然正确。
- 画笔(升高 / 降低 / 挖海)直接改写高度图,改完立即重算海岸、河流、湖泊与城镇。
- 城镇位置由种子伪随机 + 平坦度 + 相互间距筛选,保证可复现且不扎堆。
验证记录
- 相同种子连续两次生成,画布像素完全一致;更换种子后结果明显不同。
- 画笔在地图中央拖动后,最高海拔与河流像素段数量都发生变化,说明地形与水系联动生效。
- 河流像素约 1300 段且连通成树状,符合汇流模型;不存在横穿山脊的孤立河道。
- 「显示河流」「显示城镇标签」两个开关真实控制渲染结果。
- 缩放与平移后画笔落点与光标一致(屏幕→地图换算统一)。
- 390px 视口无水平溢出;内联脚本通过
node --check;控制台无报错。
复盘
做得好的:任务正文最难的一条是「河流沿地势下降流向海洋或合理内陆水体,不能随机穿越山峰」,实现用了完整的流量累积而不是「随机撒点画河」,这条是真的算出来的。另外按秩归一化让海平面滑块有了明确物理含义(陆地占比),是可重复性与可调性兼得的处理。
不足:
- 初版地形是「圆顶」,山体连成一大片白色平原,河流呈放射状直线——单看数值全部正确,视觉上却完全不像地图。加入脊状噪声后才有山脉形态。
- 海岸线仍有明显的方块阶梯(单个地图像素被放大),与「手绘风格」的预期有差距;应该做一次地形平滑或提高离屏分辨率。
- 城镇名只是「字 + 字」的随机组合,重复度高,且没有任何地形语义关联。
- 海平面滑块改变时是整图重新生成(排序 4 万格),连续拖动会有轻微卡顿。
- 没有地图保存 / 加载(种子之外的状态无法保存),画笔编辑结果只能靠重新生成覆盖。
十轮评审改进记录
本轮由模型 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 为批次口径,不拆分到单案例。
当前归档信息(自动生成)
- 实验 ID:
fantasy-map-generator--minimax-m3-1-flash-preview-max-r03 - 模型:MiniMax M3.1 Flash Preview;推理档位:max
- 执行模式:按原任务执行;备注:自我审查十轮
- 类型:single-html;预览:static;网络:offline
- 完整原始输入快照 · 主题与其他版本
- 输入记录:完整原始输入,等同于主题任务正文 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;未记录单案例费用)
- 生成器入口
部署适配记录
- 第 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。未重跑模型或改写实验源码,截图不证明完整功能、算法、手势或性能。