Chrome 的小恐龙游戏,被我破解了

Fine,那就等 wifi 自己重连吧,等待的这段时间刚好回味一下 Chrome 自带的这款小恐龙游戏。

科普:Chrome 浏览器是 Google 家的官方浏览器,使用体验全世界南波万。当用户在无网络时访问某一网址,浏览器会提示“无网络链接”(也就是上面这张图),按下空格键,就会唤醒一个小恐龙跑步刷分的游戏。

如果在有网络连接时也想玩的话,可以直接在地址栏输入:chrome://dino

出于职业本身的敏感和好奇,我突然心生疑问:这应该是用 JS 做的吧?

我顺势打开控制台,不如先看一下所有的全局变量?

239 个…太多了,我可没这个耐心

我停止了操作,开始思考这一切的可行性:

  1. **我在干什么?**尝试自定义这个游戏

  2. **为什么要看全局变量?**因为假设关于游戏的对象被暴露在了全局

  3. **如果没暴露在全局?**行,那我就放弃了(周末的早晨我可不想在 sources 里面扒源码)

也就是说,如果没有在全局变量里找到那个对象,我就可以选择性放弃了。

再看一下上面这张图,不难发现,这 239 个全局变量,有很多都是老朋友了,name、history、location、onclick、onerror… 这些变量明显和这只小恐龙没啥关系,打印出来纯粹是来充个数,还浪费了我找目标的时间,所以我遇到了第一个问题:如何快速找到由开发者自定义的全局变量?

假如我有一个正常的 window…不对,不用假如,新开一个空窗口不就得了 在新打开窗口的控制台,我得到了这样的结果:

也就是说,在这个恐龙快跑的小游戏里,Google 的前端工程师向 window 注入了 43 个全局变量(239-196)…

怎么把这 196 个原生的全局变量拿过来呢?复制粘贴就太 low 了,让我想想…

在原有窗口的基础上,再搞一个新窗口…这不就是 iframe 吗!iframe 虽然没有  window ,但是它有  contentWindow ,原则上来说,属性差别应该不大。所以现在只需要创建一个 iframe,拿它里面  contentWindow  的全局变量去过滤当前  window  的全局变量,就可以筛选出那多余的 43 个嫌疑人了。

于是我在控制台敲出了下面这些代码

回车!

诶,怎么是 45 个?比预期的多了 2 个,难道  window  里面还包含哪些  contentWindow  里面没有的变量吗?于是我把相同的代码拿去 url 为 about:blank 的窗口下执行了一遍,发现了罪魁祸首:

哦…原来是我给 Chrome 安装的 React 开发者工具干的好事…忽略!

我打开了先前检索到的 45(43+2) 个多余全局变量,大致扫了一眼,很快就发现了一个很可疑的选手:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取

前端面试题宝典

前端校招面试题详解

t/topics/618191877)**

[外链图片转存中…(img-rgSJG1Q8-1712399706200)]

[外链图片转存中…(img-JN4DLfJi-1712399706200)]

[外链图片转存中…(img-ljMZLsqz-1712399706200)]

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Chrome恐龙游戏的 C 语言实现,可以在控制台中运行: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #define WIDTH 50 #define HEIGHT 10 int score = 0; int speed = 100; void clrscr() { system("cls"); } void gotoxy(int x, int y) { COORD pos = {x, y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void draw(int x, int y) { gotoxy(x, y); printf("*"); } void erase(int x, int y) { gotoxy(x, y); printf(" "); } void print_score() { gotoxy(WIDTH + 5, 1); printf("Score: %d", score); } void print_speed() { gotoxy(WIDTH + 5, 2); printf("Speed: %d", speed); } int main() { int dino_x = 10; int dino_y = HEIGHT - 2; int obs_x = WIDTH; int obs_y = dino_y; int jump = 0; clrscr(); while (1) { // draw dino draw(dino_x, dino_y); // draw obstacle erase(obs_x, obs_y); if (obs_x == 1) { obs_x = WIDTH; score += 10; if (score % 50 == 0 && speed > 10) { speed -= 10; } } else { draw(obs_x, obs_y); obs_x--; } // print score and speed print_score(); print_speed(); // check collision if (dino_x == obs_x && dino_y == obs_y) { break; } // jump if (_kbhit()) { char c = _getch(); if (c == ' ') { jump = 1; } } if (jump == 1) { dino_y--; } else { if (dino_y < HEIGHT - 2) { dino_y++; } } if (jump == 1 && dino_y == HEIGHT - 5) { jump = 0; } // delay Sleep(speed); } clrscr(); printf("Game Over! Score: %d", score); return 0; } ``` 该代码实现了一个简单的控制台小游戏,玩家需要控制小恐龙躲避障碍物,直到碰到障碍物游戏结束。玩家可以通过空格键使小恐龙跳跃,得分会随着时间的推移而增加,游戏难度也会随之增加。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值