迷你高尔夫攻略:拉杆力度、撞墙代价与两杆路线图(2026)
亲自试试 — 立即玩 迷你高尔夫
浏览器免费直玩,无需下载或注册。
golf.js 里;九个洞的布局与标准杆在 courses.js 里(两者都是 Playnesta 原创,MIT)。51 项无头 harness 先把常数从源码里读回来,再按每秒 60 步复刻物理,然后用 Chromium 驱动真实页面里的 window.__miniGolf 打同一批球:第 1 洞满力直线球在复刻和页面上都停在 x = 510.5 并进洞,半力球两边都停在 x = 401.3。线上站点提供的两个文件与本机测量的副本哈希一致(golf.js bcc65958…、courses.js 192645b5…)。游戏页讲的是怎么拉杆、水塘怎么罚;这一页讲策略——一次拉杆到底能滚多远、撞墙要付多少代价、为什么九个洞里有七个的直线是陷阱、以及洞杯到底接什么样的球。迷你高尔夫/minigolf 只是这个玩法的通称,这里只用于检索。
1. 用数字看球场:九个洞、标准杆 28、一块场地
这个 build 是九张手绘球道,画布固定 640×480。可打区域是 x 24–616、y 24–456,球直径 14 像素(半径 7),洞杯直径 28 像素(半径 14)。没有任何东西是运行时生成的,所以整座球场可以数清楚:
| 洞 | 标准杆 | 发球点到洞杯 | 挡墙 | 沙坑 | 水塘 | 到洞杯的直线 |
|---|---|---|---|---|---|---|
| 1 | 2 | 400.0 px | 0 | 0 | 0 | 通 |
| 2 | 3 | 494.0 px | 1 | 1 | 0 | 被墙挡住 |
| 3 | 3 | 494.0 px | 1 | 0 | 0 | 被墙挡住 |
| 4 | 4 | 494.0 px | 2 | 1 | 0 | 被墙挡住 |
| 5 | 3 | 420.0 px | 0 | 0 | 1 | 被水塘挡住 |
| 6 | 3 | 504.8 px | 2 | 1 | 0 | 被墙挡住 |
| 7 | 3 | 504.8 px | 2 | 1 | 0 | 被墙挡住 |
| 8 | 3 | 429.5 px | 2 | 0 | 0 | 通(穿过 80 px 的口子) |
| 9 | 4 | 420.0 px | 2 | 1 | 1 | 被水塘挡住 |
这张表里有两件事能解释大半个球场。标准杆加起来是 28——页头、HUD 和 courses.js 三处一致,虽然包里的 NOTICE.md 还写着 27,那是文档笔误,不影响玩法。最长的一洞 504.8 px,比一次满力球还短,所以这条球场上距离从来不是问题,位置才是。九个洞里有七个直线被挡,其中两个是被水塘挡的;两个通着直线的洞,恰好就是随便一杆也能进的那两洞。
2. 出杆模型:拉杆长度、初速与滚动距离
控制是弹弓式:在任意位置按下、向后拉、松手。出杆方向由「起点减当前点」的向量决定(不是球的位置),长度决定力度。190 px 是满力,初速 980 px/s;系统接受的最小力度是它的 5%,即 49 px/s。
球一动起来,唯一让它减速的是草地上的指数衰减 1.7/秒,速度低于 5 px/s 就判定停住。于是有闭式解——滚动距离 ≈ 初速 ÷ 1.7,减去几个像素的离散误差——复刻结果与它吻合:
| 拉杆 | 初速 | 草地滚动 | 停住时间 | 沙地滚动 |
|---|---|---|---|---|
| 5% | 49 px/s | 25.6 px | 1.35 秒 | 5.6 px |
| 10% | 98 px/s | 54.0 px | 1.77 秒 | 11.7 px |
| 25% | 245 px/s | 139.2 px | 2.30 秒 | 30.1 px |
| 50% | 490 px/s | 281.3 px | 2.70 秒 | 60.7 px |
| 75% | 735 px/s | 423.4 px | 2.95 秒 | 91.4 px |
| 100% | 980 px/s | 565.5 px | 3.12 秒 | 122.1 px |
把第二、第三列一起看,控制就变得可预测:滚动距离与拉杆长度成正比,半力就是一半距离,整块 592 px 宽的场地大约 85% 力度就能横穿。50% 那一行是最有用的刻度:从第 1 洞发球点半力停在 x = 401,离洞杯还差 119 px——线上页面给出的位置与复刻一模一样,连一个像素都不差。
3. 球减速都在最后,所以短了比长了贵
阻力与速度成正比,所以球在最快的地方(刚出杆)掉的速最多,在慢下来的地方几乎不掉。满力球最后 100 px 要滚 1.2 秒,最前 100 px 只用 0.11 秒。由此有两个实际后果。
一趟滚动的末段对距离很宽容,对方向很苛刻。 60 px/s 的球一帧只走一个像素,方向偏了 5°,到洞杯时还是偏 5°。
打过头没你想的那么糟,打短则整整丢一杆。 因为速度是指数衰减,在高速段多给 6% 的力只多滚约 34 px(75%→100% 是 142 px,但 94%→100% 只有约 30 px)。停在洞前 30 px 是 30 px 的轻推,可这一杆已经用掉了。在没有水塘的洞上犹豫时,多给 5%。
4. 撞一次墙掉四成速度
每面墙都是轴对齐矩形。碰撞保留垂直于墙面那部分速度的 62%,再把两个分量都乘 0.97,所以正撞一面墙只留下 0.62 × 0.97 = 60.1% 的速度。在第 3 洞的挡墙上实测:952.6 px/s 撞上去,572.9 px/s 弹回来,正好 0.601。
这个数字就是「借墙反弹只能是下策」的原因。撞两次只剩初速的 36%,在 1.7 的阻力下,满力也就再滚约 78 px——你花掉一杆,球几乎没往前挪。这里只有一类洞值得用墙:第二杆必须从挡墙背后打的洞,也就是第 6、7 洞在第 6 节里测出来的两杆路线。
缝隙也是同一套算术。球直径 14 px,所以墙与场地边缘之间 16 px 的缝是一条 2 px 的走廊:几何上存在,实战中不存在。第 2、4、6、8、9 洞各有一处这样的 16 px 缝,而这五个洞真正的入口都在别处——第 2 洞墙下 136 px、第 3 洞门两侧各 146 px、第 4 洞第一道墙上 166 px、第 6 洞横梁下 116 px、第 8 洞门 80 px、第 9 洞门 120 px。
5. 每洞「随手一杆」的实际结果
下面这组测量把整座球场重新组织了一遍:从每个发球点对准洞杯、拉满 100%。复刻与线上页面结果一致。
| 洞 | 满力直线球的结果 |
|---|---|
| 1 | 进洞,0.67 秒——洞杯正好在直线上,400 px 外 |
| 2 | 撞墙,2.92 秒后停在 (115, 402)——又回到发球点旁边 |
| 3 | 撞墙,2.92 秒后停在 (85, 79)——远角 |
| 4 | 撞上第一道墙,2.82 秒后停在 (76, 399) |
| 5 | 0.17 秒后 入水(x = 262):花掉两杆,距离零 |
| 6 | 撞墙,2.93 秒后停在 (42, 416) |
| 7 | 撞墙,1.07 秒后停在 (180, 181) |
| 8 | 进洞,0.77 秒,穿过 80 px 的口子 |
| 9 | 0.42 秒后 入水(x = 406)——水塘就在发球点与洞杯之间 |
所以这座球场不是「九洞对着旗子瞄」,而是:两洞直线就是答案(1、8),两洞直线就是水塘(5、9),剩下五洞第一杆必须是绕开挡墙的落位球。
6. 两杆路线图(实测)
为了把「落位球」变成能照抄的东西,harness 对每一洞做了搜索:第一杆扫 21 个方向(±50°,每 5°)× 14 个力度(35%–100%,每 5%),再从落点打第二杆,扫 13 个方向 × 9 个力度。九洞里有八洞在两杆内找到解。下表是搜索最先找到的那条,只是「能行」的例子,不是唯一解。
| 洞 | 找到的方案 | 第一杆停在哪 |
|---|---|---|
| 1 | 一杆:直线,70% 力 | — |
| 2 | 两杆:−25° 75%,再 +20° 满力 | (151, 159):墙上方、沙坑左侧 |
| 3 | 两杆:−50° 35%,再直线 70% | (138, 176):短而高,为第二杆打开线 |
| 4 | 这张网格没找到(标准杆 4) | 第二道墙一直延伸到底边,路线需要借墙 |
| 5 | 两杆:−50° 35%,再 −10° 90% | (236, 90):水塘上方 |
| 6 | 两杆:−15° 70%,再 +20° 满力 | (101, 234):左侧走廊,绕过那道高墙 |
| 7 | 两杆:−50° 75%,再 −30° 满力 | (136, 155):横梁上方的左上口袋 |
| 8 | 一杆:直线,75% 力 | — |
| 9 | 两杆:−50° 60%,再 −20° 满力 | (317, 32):顶部长廊,水塘上方 |
注意这些方案的共同点:七个多杆洞里有六个,第一杆是朝着远离洞杯的方向打的——第 2、3、5、7、9 洞都是往左上打。这跟拉杆控制给人的直觉正好相反:第一杆是落位,第二杆才是推杆。
7. 水塘:两杆换零距离
水塘是这个 build 里最贵的规则。球进水加一杆罚杆,并且被放回这一杆打出去的位置;而这一杆本身已经计过了,所以一个水球等于花两杆、零位移。第 5 洞实测:从发球点直线满力,0.17 秒到 x = 262 入水,罚杆计上,球回到 (110, 240),记杆数已经是 2。
几何上这是你自己选的陷阱,不是不小心踩的。第 5 洞 420 px 长,一块 120×160 的水塘正卡在发球点与洞杯之间;第 9 洞 420 px 长,一块 70×120 的水塘加水上一道墙门。每洞 915 杆的扫描里,第 5 洞有 421 杆(46%)进水,第 9 洞有 146 杆(16%)进水——而这 915 杆全是朝洞杯方向 ±60° 以内打的。水塘不是绕一绕就过去的障碍,它就是这一洞的中间。这两洞的路线要么从上面走(第 5 洞 y ≈ 90、第 9 洞 y ≈ 32),要么从下面绕;第 6 节的两杆方案就是这么打的。
还有一条算术:水球从原位重打,重试的成本和第一次一样。所以第二次没必要「求稳」——求稳的那一杆就是把球送进水的短球。
8. 沙坑:阻力是草地的四倍半
沙坑不是墙,是另一个阻力常数:7.5/秒,而草地是 1.7。同样的初速、同样的拉杆,滚动距离只剩 4.6 分之一——满力在沙里滚 122.1 px,草地上是 565.5 px;停住时间是 0.72 秒而不是 3.12 秒。从 5% 到 100% 每一档测下来比例都一致,所以沙子不是「固定吃掉一杆」,而是把整杆缩到大约五分之一。
这让沙坑变成一种有形状的距离税。球只在滚动的最后 40 px 掠过沙边,只亏几个像素;球一开始就在沙里,一杆立刻亏掉 80%。这套球道里沙坑从来不在发球点与洞杯的正中间,都在侧边(第 2 洞 x 430–540 在洞杯线下方、第 4 洞 x 300–370、第 6 洞 x 380–480、第 7 洞 x 120–230、第 9 洞 x 360–440),所以实战规则很简单:想走的那条线只要擦到沙坑,就换一条——擦一下会把 300 px 的球变成 60 px,留下的第二杆比你原本想避开的还长。
9. 洞杯接什么样的球
洞杯直径 28 px,但球不必打在圆心。这个 build 的判定是:球心距洞杯中心小于 12 px 且 速度低于 520 px/s 才落洞;再快就从洞上滑过去。距离 12–26 px 之间还有磁吸:速度低于 260 px/s 时,洞杯以 260 px/s² 把球往中心拉,这就是慢球会拐进去的原因。
从 60 px 外实测,这条边界很利:进洞的最快一球是 517 px/s,紧接着滑过去的一球是 521 px/s。所以这道门是真的,而且就卡在源码写的那个位置。
两个后果:
在洞杯附近,方向误差比力度误差便宜。 只要以低于 520 px/s 进到 12 px 之内就会落洞,磁吸又把慢球的有效目标扩到 26 px。
但从发球点打,力度窗口的上限是敞开的。 第 1 洞直线球从 67% 到 100% 每一档都进洞——测试的 51 档里有 34 档。没有「打过头进不了」的上界,全部风险在短。这是阻力的性质,不是洞杯的性质:400 px 里球要掉 680 px/s 的速度,到洞边时它永远够慢。
方向才是紧的那一维。 同一套扫描里方向偏 2°,第 1 洞的窗口 83% 就封顶(51 档里 17 档)、第 8 洞 86% 封顶;偏 4° 时两洞任何力度都不进。400 px 外的 12 px 目标只张开 1.7°,所以在长洞上,线比力更重要——这正好和「力度窗口很宽」给人的印象相反。
10. 标准杆、计分与整轮记录
九洞标准杆 28,逐洞是 2、3、3、4、3、3、3、3、4。对照实测的两杆图,这个标准杆是宽松的:九洞里八洞用一张粗网格就能两杆进(除第 4 洞外都不高于标准杆),第 4 洞标准杆 4、搜索没在两杆内找到路线,因为第二道墙一直延伸到底边。所以干净的一轮是 18–20 杆,二十出头是正常的好成绩,不是运气。
HUD 显示洞号、标准杆、本洞杆数和相对标准杆的成绩,超杆时成绩会变红。整轮记录存在 localStorage 的 playnesta:mini-golf:best 下,内容是最少总杆数与相对标准杆,只有总杆更少时才更新。重开(按钮或 R 键)会清掉这一轮、从第 1 洞重新开始,但不会清掉最佳记录。
11. 一分钟检查表
- 先看直线通不通。这座球场上只有两洞是通的。
- 挡墙洞先定落位球,并且明确说出第一杆该停在哪。
- 200 px 以内拉 35–45%;200–300 px 拉 50–60%;300–420 px 拉 65–75%;只有长对角线才需要 85% 以上。
- 只要路线离水塘中心线不到 20°,除非方案就是从上面越过,否则别打。
- 路线擦到沙坑就换线;擦一下要亏掉这一杆约 80% 的距离。
- 没有水塘的洞,力犹豫时多给 5%。
- 撞墙之后重新算:你的速度比你想象的少 40%。
FAQ
迷你高尔夫怎么玩?
在球场上任意位置按下、向后拉、松手。拉的向量就是这一杆:方向是线路、长度是力度,最多 190 px。球带阻力滚动,撞墙按垂直分量保留 62% 反弹,进沙后阻力是草地的四倍半,球停在水里要加一杆罚杆并从原位重打。九洞、标准杆 28,一轮比相对标准杆的成绩。
满力一杆能滚多远?
草地上 565 px,耗时 3.1 秒。场地宽 592 px,所以满力能横穿整块场地,大约 85% 就够。同样的拉杆在沙里只滚 122 px,0.7 秒就停。
为什么我的球老是打短?
因为阻力是指数的:半力正好是一半距离,而一杆的最后三分之一看起来比实际慢。第 2 节的实测表就是修正值——50% 力是 281 px,不是 400 px。如果你总是短,加 10%,不要加 30%。
是瞄重要还是力重要?
都重要,但错法不一样。400 px 上方向偏 5°,到洞边横向差 35 px——已经超出 26 px 的磁吸范围;而高速段力度差 5% 只差约 28 px,那是个轻推。所以这条球场上方向才是贵的误差,这也是落位球比完美力度更值得练的原因。
能一杆进洞吗?
有两个洞可以,而且不是靠运气:第 1 洞从发球点出发,只要线对准,67%–100% 每一档都进;第 8 洞穿过 80 px 的口子,72%–100% 都进。但另一维很窄——第 1 洞方向偏 2° 时力度上限就掉到 83%,偏 4° 则任何力度都不进。另外七洞的网格里根本没有一杆路线,因为挡墙或水塘就在线上。
为什么球停在洞口边就是不进?
洞杯只接球心距中心 12 px 以内、速度低于 520 px/s 的球;更快就从洞上滑过去。12–26 px 之间有磁吸,把慢球往里拉。所以停在洞口的球,多半是过洞时速度超过 520 px/s,或者横着差了 13–26 px、速度又不够慢到被吸住。
球进水会怎样?
加一杆罚杆,球回到你打这一杆的位置;这一杆本身也计过,所以一个水球是两杆换零距离。第 5 洞对准洞杯直线打,出杆后 0.17 秒就会发生。
沙坑会罚杆吗?
不罚杆,罚距离。阻力 7.5/秒 对草地 1.7/秒:满力在沙里滚 122 px,不是 565 px。杆数还是那一杆,但这一杆丢了大约 80% 的距离,接下来的第二杆比你原本想打的那一杆更长。
撞墙是怎么算的?
每面墙保留垂直分量速度的 62%,再把两个分量都乘 0.97,所以正撞保留 60.1%(实测:952.6 px/s 进,572.9 px/s 出)。撞两次只剩 36%,这就是为什么只有在直线被彻底挡死时才考虑借墙。
标准杆是多少?多少杆算好?
九洞标准杆 28,逐洞 2、3、3、4、3、3、3、3、4。实测两杆图在九洞里八洞不高于标准杆,所以干净的一轮大约 18–20 杆;二十出头是正常的好成绩,最佳记录存在浏览器里。
能重打某一洞吗?
没有单洞重开。重开按钮(或 R 键)会从第 1 洞重新开始一整轮,并清掉当前成绩。进洞后会出现「下一洞」按钮,2.2 秒后也会自动进入下一洞。
迷你高尔夫和 putt-putt 是一回事吗?
是的——mini golf、minigolf、putt-putt 指的都是同一种玩法:用挡墙、沙坑和水塘代替球道的短距离推杆场。这个 build 是九洞版,控制是街机式的弹弓拉杆而不是鼠标跟着挥杆,所以能从真实迷你高尔夫迁移过来的是看角度和落位,不是挥杆动作。