ABOUT
打字进站
作者
为什么做这个
小学学键盘时,有一款打字游戏一直记得:青蛙要过河,荷叶上是英文单词,打对了才能往前跳,跳到对岸才算过关。练键位本来挺痛苦,被「把青蛙救过去」的成就感盖过去了。
后来看到台湾捷运打字、日本 densyatyping,还是「用真实站名练打字」这条路,就想做一版国内的:中文、拼音,沿着真的地铁线网一站站往前打。
身边同龄人很多都有娃了。小朋友迟早要学键盘、认更多字、坐地铁。若这个游戏能让他们少一点枯燥、多一点过站的快乐(像当年那只青蛙一样),那就够了。
这是什么
每座城市的首页是一张由真实经纬度生成的地铁全网图。选一条线路和方向开一局,逐站打出站名,每过一站,列车就沿着真实轨道往前走一站;打通的线路会在这张图上永久点亮,攒成你自己的线网图鉴。
三种玩法:全线挑战(从首站打到末站的计时玩法,打通即点亮该线)、限时模式(固定时长内尽量多过站,站序循环)、自由练习(不计时不计分,随时退出)。
两种输入,同一块站名牌上任选其一:中文用系统输入法整词上屏;拼音无声调全拼直打,只接受官方读音(「莘庄」只认 xinzhuang,玩会了就是学会了)。
成绩目前写在你自己浏览器的 localStorage 里,所以换设备不同步、清缓存即清空。这是现在的存储方式,不是永久承诺。每局结束的几个数字会另外送去做统计,说明在第 05 节。
数据来源与加工方法
这个游戏能成立,全靠别人已经做好的公开数据。下面逐条说清楚每样东西从哪来、我做了什么加工,以及它因此不能当什么用。
线网主体数据(线路、站序、站名、坐标、轨道几何)派生自 OpenStreetMap,按 ODbL 1.0 提供,署名 © OpenStreetMap contributors。按 ODbL 4.6,你可以获取本站所用的底层数据库(机读副本与文件清单)。
OSM 是志愿者协作编辑的开放数据库,不是任何一家地铁运营方的官方发布物;它记录的是编辑者认为的现状,与运营现状之间存在时间差。因此这里的线网不能当出行依据,也不能当作任何运营方的官方数据来引用。
未开通车站的排除:依靠 OSM 路线 relation 的收录口径(不含未开通站),叠加构建脚本里的人工修正表与官网站数断言。
这是一套「构建时对得上就通过」的启发式,不是运营排班信息。新线开通、车站缓开或更名,这里不会自动跟进,得等我手动重跑数据管线。
各地铁官网的英文站表与线路图数据(如上海地铁官网英文站表、北京地铁官网线路图端点)仅在构建期用于 QA 比对:核对我这边的中英文站名与站数对不对。
这些页面的内容没有被打包进游戏发布物,比对结果也不代表任何运营方审阅过、提供过或认可过本项目的数据。
拼音读音由 pinyin-pro(MIT)生成基础音,再由项目内的人工修正表覆盖官方读音(「莘庄」读 xīn、「闵行」读 háng 之类)。
修正表是我按公开资料整理的,不是官方审定的读音表。判定严格并不等于我一定对,发现读错了请告诉我。
线路色取自 Wikipedia 各城线路色模板与 rmg-palette 开源色板,个别以公开线路图核对,出处逐城注明在构建脚本注释里。
这些是社区整理的近似值,不是运营方的品牌规范色卡;加上屏幕色彩管理的浮动,不保证与官方案内色完全一致。
纸墨底图(陆域轮廓、水系、轨道走向)同样派生自 OSM,经构建脚本投影、简化、抽稀后渲染成 SVG。
它是为了让站名有地理感的示意底图,不是测绘成果;形状与比例都经过大幅简化,不能用于任何需要位置精度的用途。
选城页的中国地图:几何派生自 OSM(同样 ODbL),46 座地铁城市的点位是人工整理的城市中心点常量表。
这是一个选城控件的底纹,几何经过大幅简化,点位是示意坐标而非行政区划,不能作为任何边界、区划或位置的参考。
这份数据搞不定什么
- 不是换乘导航。不做路径规划,不算换乘时间,也不告诉你从哪个口出。
- 不含时刻表、运价、首末班车、出入口编号与无障碍设施信息。这些数据这里一概没有。
- 不保证与官方案内色、官方线网图一致。界面是自绘的,拓扑与配色都为「能打字」服务,不为「照着走」服务。
- 不保证实时准确。线网是某次构建时的快照,线路调整、车站更名与新线开通都要我手动重跑管线后才反映。
- 不适合作为出行依据。出行请以各地铁运营方的官方渠道为准。
什么会离开这台设备
之前这页上写着:无统计分析、不使用 cookie,成绩不会离开你的设备。从 2026 年 7 月起这句话不再成立:我接了 PostHog 做访问统计,确实有一部分东西会离开这台设备。下面逐样写出来。
我加这个的原因很朴素:这是我一个人做的免费东西,除此之外我没有别的办法知道有没有人在玩、在玩哪座城,而下一座城先做谁,我想按这个来定。
我写死的事件一共十二个:选城市、选线路、随机开一条、切玩法、开局、打完一局、连错三次弹提示、破纪录、点亮线路、集齐一城、分享成绩、再来一局。每个事件带的字段都是有限的几项:城市代号、线路号、玩法、方向、站数、得分、准确率、速度、通关用时(一个时长,不是几点几分)、最高连击、过站数、称号(从固定的称号表里取,不是自由填写的文字)、破纪录时上一次的最好分数、分享方式(三选一),以及你系统里「减少动态效果」这一项是否开着。这十二个里只有五个是在一局结束时发的,其余七个在你选城、选线、开局、弹提示的当下就发了。
你打的每一个字都不在里面。按下的键、打错的内容、提示里给出的正确拼音,一个都没有跟着事件走。写「连错三次弹提示」那个事件的时候,你输入的原文就摆在旁边的变量里,我没有捎上它。
打通记录和图鉴进度还是只写在你浏览器的 localStorage 里,我没有整体上传;但每局结束时的得分、准确率、速度这几个数字,是跟着事件走的。所以「成绩不会离开你的设备」那句话我删了。
除了我写的事件,PostHog 自己还会带走一批东西:你打开了哪个页面(完整网址,本站网址里的参数只有城市、线路、区段、方向)、离开页面的时间点与停留时长、从哪个链接过来的、浏览器与操作系统、大致的设备类型、时区,以及页面上的点击,包括被点元素上显示的文字(那些文字是我写死在界面里的按钮和站名牌,不是你输入的内容)。它还会在你浏览器里放一个随机 ID(存在 localStorage 和 cookie 里,所以这站现在是用 cookie 的),把同一个浏览器的多次访问串起来。除了这个 ID 我不知道你是谁,但它确实能把你在不同城市、不同天打的局连成同一串。
程序出错时会自动上报,我用它修 bug。报错消息是一段自由文本,是这套里唯一不由我逐字挑定的东西,所以我在发出去之前把消息整段抹掉了,只留错误类型和出错位置(哪个文件第几行)。代价是我排查起来麻烦一点,换来的是这条通道也说得清。
IP 要单独说。我的代码里没有采集 IP 这一项,浏览器发出去的内容里也没有 IP 字段。但每次上报都是一次真实的网络请求,PostHog 的服务器天然就看得到发起请求的 IP,也能据此推断大致位置。这一点我在浏览器这一端关不掉。所以我不会写「不收集 IP」,那句话字面上成立,实际上会误导你。
有几样我在代码里关死了,没留给后台开关:会话录制(这是个打字游戏,回放会把输入框逐键接收的过程整个录下来)、问卷、产品导览与站内对话(PostHog 本来可以从后台往你的页面里弹它自己的界面,这站上不该出现任何我没写过的东西)、热图、死点击、性能与网络时序采集。另外浏览器的 Do Not Track 我是尊重的,你开了它这里就不上报(只认 navigator.doNotTrack 这一个信号,别的机制它不看)。之所以强调「关死在代码里」:这些开关的默认值是「听 PostHog 后台的」,写进代码才轮不到后台改,这一节的话才作数。
这些事件存在 PostHog 的服务器上,不在我手里,也受他们自己的条款约束。下一节里说的「与本项目使用到的任何技术供应商均无关联」,指的就包括他们。
页面上没有「关闭统计」的开关,这是实情,不是漏写。用广告拦截或浏览器的追踪保护把 PostHog 的请求挡掉就行,我不会绕过去:统计发不出去不影响任何一局。如果你觉得这样不合适,或者希望我去掉其中某一项,写信给我,邮箱在第 08 节。这是现在的做法,改了我会改这一条。
声明
- 打字进站是我个人做的非商业作品,完全免费:无广告、无内购、无捐赠。
- 本站用 PostHog(第三方统计服务)记录使用情况:玩了哪座城哪条线、一局的分数与用时这些数字,以及 PostHog 自带的页面访问、点击和一个存在你浏览器里的随机 ID;你打的每一个字都不在里面。不录屏,尊重 Do Not Track,逐项说明见第 05 节。
- 本项目与各地铁运营方(含京港地铁、港铁(深圳)、杭港地铁这类合资公司,以及各线的项目公司)、OpenStreetMap 基金会及其贡献者、各级政府部门,以及本项目使用到的任何技术供应商,均无任何关联,未获得其授权、赞助、认可或背书。
- 界面是自绘的纸墨风格:不使用任何官方 logo、官方字体、官方线网图或其他官方图形素材;站名牌只借鉴通用的公共导视语法,线路编号色块使用的颜色见上文来源说明。
- 站名、读音、线网如有错漏,或你认为这里的某项内容不该出现,请通过下方邮箱联系我,我会核实并处理。
致谢
- densyatyping.com(日本电车打字)与 tw-metro-typing(台湾捷运打字)证明了「用真实车站名练打字」这个品类值得做。本项目受两者思路启发,实现为全新编写,未复制其代码或素材。
- OpenStreetMap 的贡献者们。没有他们一条条画出来的线路与车站,这个项目根本不存在。
- pinyin-pro(MIT)提供拼音基础能力。
- 题字与分数用的是思源宋体 SC(Adobe,SIL OFL 1.1),自托管子集。
联系
纠错、指认问题,或者只是想聊聊你那座城的地铁,邮箱和 X 都在第 01 节。
