浏览器的地址栏除了输入网址还能干什么?——玩贪吃蛇
当一个十年前的疯狂创意重新走红,它揭示了互联网正在失去的东西
打开Chrome浏览器,在地址栏输入 https://demian.ferrei.ro/snake# ,然后 你就看到一串奇怪的符号。
是的,你没看错。就盯着你的地址栏,在用箭头键或WASD控制方向。
你会看到一条由奇怪符号组成的小蛇(░░░░░░░⠠⠤⠄⡀░░)在地址栏里爬行,吃掉食物,越长越长。整个游戏就在那个你平时只用来输入网址的细长文本框里运行。
没错,这是一个完整的贪吃蛇游戏,运行在浏览器的URL地址栏里。
上周,这个十年前的项目突然在Hacker News上爆红,获得840个点赞和数百条评论。人们的第一反应都是:“这太疯狂了,你们是怎么想出来的?”
但更疯狂的是这个游戏背后的故事——以及它揭示的关于现代互联网的真相。
一次偶然的好奇心,引发了一场技术冒险
创作者Francisco Uzo回忆起项目的起源时说:“我想知道盲文系统是怎么工作的。”
这就是极客精神的起点——不是为了解决问题,而是纯粹的好奇。
当他深入研究盲文时,发现了一个迷人的规律:每个盲文符号由2x4的点阵组成,8个点位,每个点有"凸起"或"平坦"两种状态,正好产生2^8=256种可能的组合。而Unicode系统完整收录了所有这256个盲文字符。
某天的凌晨三点,他突然意识到:“等等,这不就是一个现成的8位像素字符集吗?”
这种顿悟的瞬间,正是每个极客最享受的时刻——当两个看似无关的知识点在脑海中碰撞,迸发出创意的火花。
然后就是典型的极客行为模式:不管有没有用,先做出来再说。
整个实现充满了黑客思维:
- 将游戏世界映射到盲文字符网格——每个字符就是一个2x4像素块
- 蛇的身体用实心点(⣿)表示,空白区域用空盲文(⠀)表示
- 使用JavaScript的
history.replaceState()
API实时更新URL而不污染历史记录 - 每帧刷新,整个游戏画面就在地址栏里流畅运行
Francisco的透明度也很"极客":“源代码没有任何压缩或混淆处理。Ctrl+U就能看到全部代码。“整个实现只用了几百行JavaScript,简洁而巧妙。在真正的极客眼中,代码本身就应该是可读的、可学习的、可启发的。
等等,我的游戏怎么看起来乱七八糟的?
如果你现在打开这个游戏,很可能会看到一堆奇怪的%20
、反斜杠和乱码。游戏勉强能玩,但画面支离破碎。或者根本不能动起来。
这不是你的问题,也不是代码的问题。问题在于:十年过去了,浏览器变了。
Francisco在讨论中坦言:“这个项目是为十年前的浏览器设计的。自那以后,浏览器进行了一些所谓的’安全改进’,严重削弱了基于地址栏的游戏能力。”
最致命的改变是:现代浏览器开始强制转义URL中的所有空格字符。
在游戏的设计中,空盲文字符(⠀)代表空白区域。但现代浏览器把它们转义成%20
或其他字符,导致画面变形。Francisco甚至开发了一套基于Canvas的字体测量系统来检测和替换被转义的字符,但效果仍然有限。
他在浏览器的问题追踪器中提出了申诉。开发者表示理解和同情,但最终的决定是:“安全性照例压倒了趣味性。”
用户报告的游戏体验差异巨大:
- 有人在Chrome上轻松得到2144分
- 有人在Firefox上看到满屏乱码
- 有人在移动Safari上根本看不到游戏
- 有人的浏览历史被每一帧都污染了
同一个代码,在不同浏览器上的表现天差地别。这就是现代Web开发的现实。
那些年,我们在浏览器里玩过的花样
地址栏贪吃蛇不是唯一一个这类创意项目。Hacker News的讨论中,大家开始回忆起一整个"非常规浏览器游戏"的黄金时代。
URL里的2048游戏
有人分享了 https://aquova.net/games/2048/ ——将风靡一时的2048益智游戏移植到地址栏中。同样的盲文字符技巧,同样的实时URL更新。
浏览器标题栏的贪吃蛇
Francisco提到,Reddit上最近有人发布了新版本——把游戏渲染在浏览器标签页的标题里。虽然这是一种"认输方案”(放弃了在地址栏显示的坚持),但它确实避免了URL转义的问题。
TinyJS贪吃蛇
2023年,另一个开发者用不同的技术路径实现了类似的项目。那时浏览器的限制还没有这么严格。
地址栏3D漫游
有人分享了一个更疯狂的项目:用非常规方式在浏览器中实现交互式3D世界
评论者说:“虽然不是Doom,但你可以在3D世界里四处走动。”
这些项目有什么共同点?它们都是程序员纯粹出于好奇心和乐趣的创造。
没有商业价值,没有实际用途,甚至算不上"最佳实践”。但它们代表了早期互联网的一种精神:这是一个可以玩耍、可以实验、可以突破界限的地方。
为什么这些项目现在越来越难做了?
问题不只是空格转义。过去十年,浏览器经历了大量"安全改进":
历史API的限制
Francisco最初使用history.replaceState()
来更新URL而不创建历史记录。但现代浏览器对这个API的调用频率有严格限制。当游戏帧率太高时,系统被迫降级到location.hash
方案——结果是你的浏览历史被每一帧游戏都污染了。
一位用户吐槽:“我最烦的就是这个。访问某些网站后查看历史记录,发现被我输入的每个按键都创建了条目。这一切都是以’用户体验’的名义。”
URL长度限制
不同浏览器对URL长度有不同的限制,从2000字符到几万字符不等。对于需要在URL中编码整个游戏状态的项目来说,这是个硬性天花板。
字符集限制
越来越多的特殊Unicode字符被标记为"不安全",在URL中被自动转义或过滤。这直接打击了所有基于Unicode艺术的创意项目。
移动端兼容性
许多移动浏览器根本不显示完整的URL,或者在用户滚动时隐藏地址栏。这让地址栏游戏变得不可玩。
Francisco总结道:“自那以后,浏览器的许多改变都让这类项目越来越难实现。我在浏览器问题追踪器中得到了一些同情,但安全性总是优先的。”
当安全性扼杀了互联网的乐趣
这里出现了一个根本性的矛盾。
**没人会反对浏览器安全性的提升。**URL注入攻击、跨站脚本漏洞、钓鱼网站——这些是真实存在的威胁,影响着数十亿用户。浏览器开发者有责任保护用户安全。
但与此同时,每一次"安全改进"都关闭了某些创造性实验的大门。
Francisco的游戏十年前完美运行,今天却在大多数浏览器上支离破碎。不是因为代码有问题,而是因为浏览器"进化"了。这种"进化"让用户更安全,但也让互联网变得更加统一、更加受控、更加……无聊。
失去的不仅仅是游戏
在Hacker News的讨论中,有人提出了尖锐的批评:“为什么人们不去做有用的事情?别滥用互联网。”
这个评论遭到了社区的集体反驳:
- “制作这类项目的学习价值是巨大的”
- “创造性休息和技能开发同样重要”
- “这就是我来Hacker News的原因——100%的黑客精神”
- “ChatGPT发明不出这个。我爱这种创造力”
最精辟的回应来自一位用户:“对普通人来说这可能不算什么,但对我来说这太疯狂了。你们是怎么想出这些东西的?”
**这就是问题的核心。**这些项目的价值不在于"有用",而在于它们代表了一种纯粹的创造冲动——因为好奇而探索,因为有趣而创造,因为"为什么不试试"而突破界限。
当我们为了安全而设置越来越多的限制,我们不只是在关闭安全漏洞,我们也在关闭创新的可能性。
权衡是必要的,但我们应该意识到代价
这不是在指责浏览器开发者。他们面对的是极其艰难的权衡决策:
- 允许灵活的URL编码 vs. 防止注入攻击
- 支持高频API调用 vs. 避免性能问题
- 显示任意Unicode字符 vs. 防止钓鱼欺诈
没有完美的答案。 每个决定都有其代价。
但我们至少应该意识到并讨论这些代价。当我们说"安全第一"时,我们应该问:“我们因此失去了什么?“当我们说"用户体验优化"时,我们应该问:“这优化了谁的体验?”
Francisco在浏览器问题追踪器中得到的回复是典型的:“我理解你的困扰,但安全性必须优先。“这个回答在技术层面无可指摘,但它也代表了一种更广泛的趋势:在现代互联网上,控制和安全正在系统性地压倒创造和乐趣。
在AI时代,这种人类创造更加珍贵
当讨论转向AI时,Francisco说了一句发人深省的话:
“这个游戏已经存在十年了,所以很可能在这些AI的训练数据中。机器人也许能复制它,但它们肯定无法享受它!(至少现在还不能)”
这句话触及了当前技术文化的核心焦虑。在ChatGPT可以瞬间生成代码、Copilot可以自动补全函数的时代,什么样的编程项目还值得人类去做?
答案可能就在这个地址栏贪吃蛇里。
AI可以看到盲文字符,可以理解Unicode编码,可以生成JavaScript代码。但AI不能体验:
- 凌晨三点突然意识到"盲文可以当像素"的那一刻顿悟
- 第一次看到蛇在地址栏里动起来时的惊喜
- 花几个小时调试字符转义问题时的执着
- 十年后看到陌生人喜欢你的项目时的满足感
这些纯粹的人类创造体验,在AI可以复制几乎所有代码的时代,反而变得更加珍贵。
Francisco的项目不是为了解决问题而创造,而是为了探索和乐趣而创造。这种动机,这种过程,这种纯粹的创造喜悦——这是AI永远无法真正拥有的。
我们需要更多像这样的项目
这个地址栏贪吃蛇重新走红,不是因为它特别有用或特别赚钱。它走红是因为它提醒了我们一些重要的事情:
互联网不应该只是一个高效、安全、标准化的工具。它也应该是一个充满惊喜、可以玩耍、可以实验的地方。
当Francisco十年前问自己"盲文是怎么工作的"时,他不是在解决商业问题或优化用户体验。他只是好奇,然后他创造了一个让数千人微笑的项目。
在这个越来越同质化、越来越"安全”、越来越被算法优化的互联网上,我们需要更多这样的项目。不是因为它们有用,而是因为它们提醒我们:
技术的意义不仅仅是效率和安全——它也应该是充满惊奇和乐趣的。
在这个游戏上你能得多少分?你的浏览器支持得好吗?
也许更重要的问题是:这个项目让你想起了什么?你有没有做过类似的"无用但有趣"的创造?