piapia123
zh

迷宫图片生成

生成器

所有处理都在浏览器本地完成,数据不上传服务器

预览改上面的参数,这里立刻重画
SVG 源码

生成一张迷宫图片,可以导出 SVG 拿去打印或做素材。 生成的迷宫一定有解,而且解只有一条。 用的是递归回溯算法(深度优先 + 随机打通邻居),它有两条数学性质:任意两点之间恰好有一条通路、没有环。这一点值得说明 —— 另一种常见的写法是先砌满墙再随机拆掉一些,那会拆出孤岛(迷宫无解)或拆出环路(有多条解),而两者在屏幕上看起来都「像个迷宫」。 随机数是有种子的。 迷宫的每一处选择都要掷骰子;用 `Math.random` 的话「同样的参数再来一张」会得到另一个迷宫,想打印同一张出来对比就不行了。这里用的是带种子的伪随机数发生器:同样的尺寸 + 同样的种子 = 一模一样的迷宫。它不需要密码学强度,只是个图案。 入口在左上角、出口在右下角,两侧的墙是拆掉的 —— 不打通的话迷宫看起来是封闭的,会被当成生成失败。勾上「画出解法路径」可以顺便得到答案。

功能

  • 递归回溯算法:生成的迷宫一定有解,且解唯一(无环、无孤岛)
  • 列数、行数、格宽可调(4×4 到 80×80)
  • 带种子的随机:同样的参数永远得到同一张迷宫,可复现
  • 入口在左上、出口在右下,两侧墙壁已打通
  • 可选画出解法路径,颜色可调
  • 墙色与底色可调(深色底配浅色墙也行)
  • 导出 SVG:矢量,放大打印不糊,也能当素材贴进设计稿
  • 相通的墙只画一次 —— 每条线不会因为被画两遍而变粗

使用方法

  1. 调列数、行数、格宽,看着右边的预览
  2. 换一个种子就是另一个迷宫;想复现就记下种子
  3. 需要答案时勾上「画出解法路径」
  4. 点「下载 .svg」拿走矢量文件

常见问题

生成的迷宫一定有解吗?
一定有,而且解法唯一。递归回溯生成的是生成树:每打通一面墙就等于连上一条边,最终所有格子恰好被 n−1 条边连起来(n 是格子数)。这个结构在数学上保证了两件事 —— 任意两点之间都有通路(所以从入口一定走得到出口),且没有环(所以通路只有一条)。另一种「先砌满再随机拆」的写法做不到这一点,它可能留下走不到的区域,而那种迷宫在屏幕上看起来完全正常。
「种子」是干什么的?
用来复现。迷宫生成过程要掷很多次骰子,用真随机的话「同样的参数再生成一次」会得到另一张图。带种子的发生器把「第几次掷出什么」固定下来,所以同样的尺寸 + 同样的种子 = 完全一样的迷宫。这在实际使用中很有用:你打印了一张给孩子的迷宫,孩子要再要一张同样的,或者你想把难度调高一点但保持风格接近,记下种子就行。它不需要密码学强度 —— 这只是个图案,不是密钥。
能直接打印吗?
能。下载的 SVG 是矢量图,打印时放大也不会糊 —— 这正是用 SVG 而不是 PNG 的原因:同样一张 20×14 的迷宫,PNG 在放大到 A4 时会看到锯齿,而矢量线始终干净。如果打印出来觉得线太细,把格宽调大(每格的像素数)比调线宽更有效,因为线宽是按格宽比例算的。

相关工具