Chrome Dino 小恐龙作弊?控制台解决|技术点评

我心飞翔 分类:javascript

Drawable

不知道你是否对 chrome://dino 这个网址有些什么印象?你最多拿了多少分?

Dinosaur Game(也被称为 T-雷克斯 游戏),最初代号为 Program Bolan,由塞巴斯蒂安·加布里埃尔(Sebastien Gabriel)于 2014 年构建的,是 Chrome 浏览器内置的一个小游戏。

Chrome 浏览器在无网络连接的错误页面埋了一个彩蛋:按下空格键,一只小恐龙雷克斯就会倒腾它的两条小短腿在沙漠中跑起来。我们可以用空格键或者 键控制起跳,用 键控制下蹲,帮它跳过大大小小的仙人掌、躲过突然飞来的翼龙。

但 其 实!

游戏把它的 instance 暴露在了全局变量中 —— window.Runner

console.log(window.Runner.instance_);
 

Console 输出

我想,聪明的你,早就已经明白了,我们应该干什么了吧~

云海

Instance 中的一个变量名很是显眼 —— config,再加之其中的变量名也很是显眼,就先让我们来玩一玩配置吧:

image.png

疾跑

window.Runner.instance_.setSpeed(100);
 

不过值得注意的是,跑得太快,脚下的陆地会被雷克斯像在地毯上那样,直接给你掀了~

Chrome Dino 小恐龙作弊?控制台解决|技术点评

高跳

window.Runner.instance_.tRex.setJumpVelocity(100);
 

跳太高,看不见,一摔下来扎屁屁(

Chrome Dino 小恐龙作弊?控制台解决|技术点评

没障碍物

window.Runner.instance_.playingIntro = true;
 

没有障碍物,一览无余~

Chrome Dino 小恐龙作弊?控制台解决|技术点评

无敌

window.Runner.instance_.gameOver = () => {};
 

无敌是多么,多么寂寞~

Chrome Dino 小恐龙作弊?控制台解决|技术点评

自动化

function TrexRunnerBot() {
const makeKeyArgs = (keyCode) => {
const preventDefault = () => void 0;
return {keyCode, preventDefault};
};
const upKeyArgs = makeKeyArgs(38);
const downKeyArgs = makeKeyArgs(40);
const startArgs = makeKeyArgs(32);
if (!Runner().playing) {
Runner().onKeyDown(startArgs);
setTimeout(() => {
Runner().onKeyUp(startArgs);
}, 500);
}
function conquerTheGame() {
if (!Runner || !Runner().horizon.obstacles[0]) return;
const obstacle = Runner().horizon.obstacles[0];
if (obstacle.typeConfig && obstacle.typeConfig.type === 'SNACK') return;
if (needsToTackle(obstacle) && closeEnoughToTackle(obstacle)) tackle(obstacle);
}
function needsToTackle(obstacle) {
return obstacle.yPos !== 50;
}
function closeEnoughToTackle(obstacle) {
return obstacle.xPos <= Runner().currentSpeed * 18;
}
function tackle(obstacle) {
if (isDuckable(obstacle)) {
duck();
} else {
jumpOver(obstacle);
}
}
function isDuckable(obstacle) {
return obstacle.yPos === 50;
}
function duck() {
Runner().onKeyDown(downKeyArgs);
setTimeout(() => {
Runner().onKeyUp(downKeyArgs);
}, 500);
}
function jumpOver(obstacle) {
if (isNextObstacleCloseTo(obstacle))
jumpFast();
else
Runner().onKeyDown(upKeyArgs);
}
function isNextObstacleCloseTo(currentObstacle) {
const nextObstacle = Runner().horizon.obstacles[1];
return nextObstacle && nextObstacle.xPos - currentObstacle.xPos <= Runner().currentSpeed * 42;
}
function jumpFast() {
Runner().onKeyDown(upKeyArgs);
Runner().onKeyUp(upKeyArgs);
}
return {conquerTheGame: conquerTheGame};
}
let bot = TrexRunnerBot();
let botInterval = setInterval(bot.conquerTheGame, 2);

Chrome Dino 小恐龙作弊?控制台解决|技术点评

分数速度

let hackScore = 0;
Object.defineProperty(Runner.instance_, 'distanceRan', {
get: () => hackScore,
set: (value) => hackScore = value + Math.floor(Math.random() * 1000),
configurable: true,
enumerable: true,
});

在不影响雷克斯速度的情况下加快分数的速度

Chrome Dino 小恐龙作弊?控制台解决|技术点评

设置分数

Object.defineProperty(Runner.instance_, 'distanceRan', {
get: () => 99999,
set: (value) => 99999,
configurable: true,
enumerable: true,
});

  • 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情

回复

我来回复
  • 暂无回复内容