昨天晚上在Startup News上看到了腾讯前端团队搞了个挑战游戏前端特工,挺有意思的,今天通关了,现在把攻略整理一下。

第一关:消失的时间

这一关比较简单,写入用户名和邮箱之后点击“打开”后,它会提示你抓包,打开Chrome的Network,发现发送的请求表单中有一个timestamp为空,在Console中随便输入new Date().getTime(),在Elements中找到那个元素编辑,把时间值value写进去就搞定了。

第二关:企鹅的老脸

这一关麻烦一点,左边的圆角相对好一点,右边的基础知识点是用CSS画三角形,本来我的旋转和边框颜色都没问题,就是旋转原点没用过是Google出来的,但是值一直都不对,然后发现Console里面提示“CSS3企鹅”,呵呵,Google一下轻松搞定!

左边:

-webkit-border-radius: 20px 30px;

右边:

-webkit-transform: rotate(-60deg);
-webkit-transform-origin: top right;
border-color: transparent #000;

第三关:坦克大战

唉,我只能说世界太奇妙,看到这一关的时候我感动得都快哭了!去年公司内部组织了一次的黑客竞赛,主题就是腾讯前端团队的坦克大战,我心爱的坦克Tony Stark莫名其妙地倒在了初赛的赛场上,让我好生郁闷。之后我都差不多忘了他了,没想到在这里焕发第二春,废话不多说,祭出我的撒手锏,我的Tony毫发无伤,谈笑间对手灰飞烟灭,过关!钢铁侠内部构造如下:

/**    * CODETANK * Copyright (c) 2012, Tencent AlloyTeam, All rights reserved.* http://CodeTank.AlloyTeam.com/** @version     1.0* @author      TAT.Csonlai**  .d8888b.                888      88888888888               888   TM   * d88P  Y88b               888      ````888````               888      * 888    888               888          888                   888      * 888         .d88b.   .d88888  .d88b.  888  8888b.  88888b.  888  888 * 888        d88""88b d88" 888 d8P  Y8b 888     "88b 888 "88b 888 .88P * 888    888 888  888 888  888 88888888 888 .d888888 888  888 888888K  * Y88b  d88P Y88..88P Y88b 888 Y8b.     888 888  888 888  888 888 "88b *  "Y8888P"   "Y88P"   "Y88888  "Y8888  888 "Y888888 888  888 888  888 * */Jx().$package(function(J){var seeyou = 0;var space = 19 + 88;var keepscan = false;var crossing = false;var fighting = false;var smartTurn=function(angle){angle = angle % 360;if(angle>180){angle=angle-360;}else if(angle<-180){angle=angle+360;}return angle;};var notSmartTurn = function(angle, flag) {angle = angle % 360;if (flag * angle < 0) {if (Math.abs(angle) == 180) angle = -angle;else angle = smartTurn(angle);}if (Math.abs(angle) < 8 || Math.abs(smartTurn(angle)) < 8) angle = 0;return angle;};var getGunAngleToTurn=function(angleGunToTurn){return (angleGunToTurn+this.getHeading()-this.getGunHeading())%360;};var getEnemyCoordinates = function(bearing, distance){var x = this.getX() + distance * Math.cos((this.getHeading() + bearing) * 2 * Math.PI / 360);var y = this.getY() - distance * Math.sin((this.getHeading() + bearing) * 2 * Math.PI / 360);return x.toFixed(0) + "," + y.toFixed(0);};var getDirection = function(){var heading = this.getHeading();if (Math.abs(heading) < 1 || Math.abs(heading - 360) < 1) {long = this.getX() - space;direction = 1;} else if (Math.abs(heading - 90) < 1) {long = this.getBattleFieldHeight() - this.getY() - space;direction = 4;} else if (Math.abs(heading - 180) < 1) {long = this.getBattleFieldWidth() - this.getX() - space;direction = 3;} else if (Math.abs(heading - 270) < 1) {long = this.getY() - space;direction = 2;}var array = new Array();array[0] = long;array[1] = direction;return array;};var getAngleToTurn = function(ex, ey) {var bearing;if (ex == 0) bearing = ey > 0 ? -180 : 180;else {bearing = Math.atan((ey - this.getY()) / (ex - this.getX()))* 180 / Math.PI;if ((ex - this.getX()) > 0) bearing = - bearing;else bearing = 180 - bearing;}return bearing - this.getGunHeading();
//        return bearing;};Robot = new J.Class({extend : tank.Robot},{/***robot主函数**/  run:function(){this.setUI(tank.ui["purple"]);var direction;var bh = this.getBattleFieldHeight();var bw = this.getBattleFieldWidth();var x = this.getX();var y = this.getY();var angle = 0;var hh = y < (bh - y) ? y : (bh - y);var ww = x < (bw - x) ? x : (bw - x);var oo = hh < ww ? hh : ww;if (oo == x) {direction = 3;angle = 180;} else if (oo == (bw - x)) {direction = 1;angle = 0;} else if (oo == y) {direction = 4;angle = 90;} else if (oo == (bh - y)) {direction = 2;angle = 270;}
//            this.setAdjustRadarForGunTurn(true);this.setAdjustGunForRobotTurn(true);this.setTurnLeft(smartTurn(angle - this.getHeading()));this.setGunTurnLeft(smartTurn(angle - this.getGunHeading() - 180));this.execute();this.ahead(oo - space + 80);this.turnRight(90);this.loop(function(){var heading = this.getHeading();if (Math.abs(heading) < 1 || Math.abs(heading - 360) < 1) {long = this.getBattleFieldWidth() - this.getX() - space;direction = 1;} else if (Math.abs(heading - 90) < 1) {long = this.getY() - space;direction = 4;} else if (Math.abs(heading - 180) < 1) {long = this.getX() - space;direction = 3;} else if (Math.abs(heading - 270) < 1) {long = this.getBattleFieldHeight() - this.getY() - space;direction = 2;}var angle = long * 90 / 115;if (angle <= 90) {a1 = angle;a2 = 0;a3 = 0;a4 = 0;} else if (angle > 90 && angle <= 270) {a1 = 90;a2 = angle - a1;a3 = 0;a4 = 0;} else if (angle > 270 && angle <= 450) {a1 = 90;a2 = 180;a3 = angle - a1 - a2;a4 = 0;} else if (angle > 450 && angle <= 630) {a1 = 90;a2 = 180;a3 = 180;a4 = angle - a1 - a2 - a3;} else {a1 = 90;a2 = 180;a3 = 180;a4 = 180;}
//                this.log(a1 + ":" + a2 + ":" + a3 + ":" + a4);crossing = false;this.setAhead(long, function(){keepscan = false;crossing = true;this.setGunTurnLeft(smartTurn(this.getHeading() - this.getGunHeading() - 180));this.setTurnRight(90);this.setAhead(120);this.execute();});
//this.log("1:" + (this.getHeading() - this.getGunHeading() - 90 + a1));
this.setGunTurnLeft(notSmartTurn(this.getHeading() - this.getGunHeading() - 90 + a1, 1),function(){
//    this.log("2:" + (this.getHeading() - this.getGunHeading() - 90 + a1 - a2));this.setGunTurnLeft(notSmartTurn(this.getHeading() - this.getGunHeading() - 90 + a1 - a2, -1),function(){
//        this.log("3:" + (this.getHeading() - this.getGunHeading() - 90 + a1 - a2 + a3));this.setGunTurnLeft(notSmartTurn(this.getHeading() - this.getGunHeading() - 90 + a1 - a2 + a3, 1),function(){
//            this.log("4:" + (this.getHeading() - this.getGunHeading() - 90 + a1 - a2 + a3 - a4));this.setGunTurnLeft(notSmartTurn(this.getHeading() - this.getGunHeading() - 90 + a1 - a2 + a3 - a4, -1),function(){
//                    keepscan = false;
//                    crossing = true;
//                    this.setGunTurnLeft(smartTurn(this.getHeading() - this.getGunHeading() - 180));
//                    this.setTurnRight(90);
//                    this.setAhead(120);
//                    this.execute();});this.execute();});this.execute();});this.execute();
});
this.execute();});},onHitWall:function(e){this.turnLeft(e.getBearing() - 90);},onHitRobot:function(e){
//            this.stopMove();
//            this.log("HitRobot");if (this.isTeammate(e.getName())) {this.say("你挡着我了,亲~!");} else {this.say("Good dogs don't block the way!");var angleToRobot=e.getBearing();var angleGunToTurn=getGunAngleToTurn.call(this,angleToRobot);var angleToTurn=smartTurn(angleGunToTurn);this.turnGunLeft(angleToTurn);this.fire(3);this.scan();//            var array = getDirection.call(this);//            if (!crossing) {//                keepscan = true;//                this.ahead(-10);//                this.fire(3);//                this.log(array[0]);//            }}},onScannedRobot:function(e){
//            this.log(getEnemyCoordinates.call(this, e.getBearing(), e.getDistance()));
//            this.log("ScannedRobot");
//            this.say(e.getName() + " " + (++seeyou));
//            this.stopMove();if (this.isTeammate(e.getName())) {this.say("加油啊,亲~!");} else {this.say(e.getName() + ",只是因为在人群中多看了你一眼……");this.broadcastMessage(getEnemyCoordinates.call(this, e.getBearing(), e.getDistance()));var angleToRobot=e.getBearing();var angleGunToTurn=getGunAngleToTurn.call(this,angleToRobot);var angleToTurn=smartTurn(angleGunToTurn);this.turnGunLeft(angleToTurn);if (e.getDistance() <= 100) this.fire(3);else if (e.getDistance() <= 200) this.fire(2);else this.fire(1);//          this.scan();}},onHitByBullet:function(e){if (this.isTeammate(e.getName())) {this.say("Hold your fire!");} else {this.say("别打我啊,亲!");var angleGunToTurn=e.getHeading() - this.getGunHeading() + 180;var angleToTurn=smartTurn(angleGunToTurn);this.turnGunLeft(angleToTurn);this.fire(e.getPower());}},onBulletHit:function(e){this.say(e.getName() + ",你还有导弹拦截系统?");},onMessageReceived:function(e){var message = e.getMessage().split(",");this.turnGunLeft(smartTurn(getAngleToTurn.call(this, message[0], message[1])));},onRobotDeath:function(e){this.say(e.getName() + ",你死的好~~~~~~~~~~~~~惨哪!")},onWin:function(e){
//            var x = this.getBattleFieldWidth()/2 - this.getX();
//            var y = this.getBattleFieldHeight()/2 - this.getY();
//            var angle = Math.atan(y/x);
//            this.turnRight(this.getHeading() + angle);
//            this.ahead(Math.sqrt(x * x + y * y));this.say("Welcome to Iron Man's world!");},onDeath:function(e){this.say("我还会再回来的~~!");}});
});

第四关:三重门

这一关就像在考试一样,不过还是一些基础知识,直接贴答案吧。

第一题:

 第二题:


 第三题:

第五关:金字塔迷宫

这一关的意思其实就是哪一条路径的数组加在一起和最大,求解!昨天晚上我就这道题没玩过,到十点多太困就睡了,今天上班把手头上的事情处理完之后继续看这个问题,它的解决思路首先要明确就是分治法,每一个元素到达底层的最大值就是它自身的值加上左右子节点到达底层最大值中的较大者。

方便起见,首先引入jQuery,打开Chrome的Console,输入:

var s = document.createElement("script");s.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js";s.onload = function() {console.info("loaded")};document.body.appendChild(s);

然后执行:

for (var i = 0; i < 12; i++) {var ele = $("#row_12").children(":eq(" + i + ")");ele.data("v", Number(ele.text()));}for (var i = 11; i >= 1; i--) {var row = $("#row_" + i), next_row = $("#row_" + (i + 1));for (var j = 0; j < i; j++) {var left = Number(next_row.children(":eq(" + j + ")").data("v")), right = Number(next_row.children(":eq(" + (j + 1) + ")").data("v"));var max = Math.max(left, right), target = row.children(":eq(" + j + ")");target.data("v", Number(target.text()) + max);if (max === left) target.css("background-color", "red");else target.css("background-color", "blue");}}

上面的代码会给11层往上的每一个元素添加背景颜色,红色代表该元素想左边走到底层的值最大,蓝色代表向右边走值最大,所以最后的效果如下:

 代码不太好看,有点quick-and-dirty,不过效果已经达到了,而且貌似每次的数字都会变化哦。

至此腾讯闯关第一季结束!收工!

腾讯前端特工通关攻略相关推荐

  1. 秋招注意事项和面试通关攻略

    首先给大家说声抱歉,最近由于个人工作(突然996)和精力上的原因,导致公众号断更了一段时间,后面会逐渐恢复公众号的更新,在此感谢大家的理解和支持. 国内主流的互联网公司在 8 月份都开放了秋招申请,那 ...

  2. 首届广西网络安全技术大赛初赛通关攻略

    首届广西网络安全技术大赛初赛通关攻略 前言 第一次参加安全类比赛(好吧,其实我这种宅男参加的比赛都很少,很多种比赛都是第一次 - -),同组的组员建议我在比赛完写个通关攻略出来.听起来不错,写个通关攻 ...

  3. Nest 快速通关攻略

    写在开头 每一篇文章都是作者用 心 写出,还需要花费大量时间去校对调整,旨在给您带来最好的阅读体验. 您的 点赞.收藏.转发 是对作者的最大鼓励,也可以让更多人看到本篇文章,万分感谢! 如果觉得本文对 ...

  4. 华容道6×6图解_全民主公华容道6-10关通关攻略 6-10关布阵搭配图解

    腾讯全民主公V1.0.82 安卓版 类型:策略棋牌大小:256.7M语言:中文 评分:9.4 标签: 立即下载 全民主公华容道6-10关通关攻略,6-10关布阵搭配图解,这里小编给大家整合了6-10关 ...

  5. 乖离性暗机器人_乖离性百万亚瑟王超弩暗机器人平民通关攻略 超弩暗机器人怎么打...

    首先介绍一下暗机器人的属性数据: 属性:暗系 接下来介绍一下BOSS的行动顺序: BOSS的行动顺序为5次单点(炮*3次+本体+钳子)和4次单点+本体AOE 本体和炮为魔法伤害,钳子为物理伤害,建议富 ...

  6. Web前端培训面试攻略

    学会web前端技术之后,接下来就是要找到一份合适的工作,今天小编要跟大家分享的文章是关于web前端面试攻略,做好这些可以给面试环节加分,找到合适的工作几率会更高,希望本篇文章能够对大家有所帮助. ​ ...

  7. “掘金”金融AI落地,英特尔趟出一套通关攻略

    有人说,金融业是最大的AI应用场景,但不管怎样,不可否认的事实是金融业已经从数字化走向AI化. 某种程度上,AI与金融业有着天然的契合性:其一,金融业本身就是以数据为基本元素的行业,它为AI的模型训练 ...

  8. CVPR一区审稿人分享:图像分割论文通关攻略

    攻略分两部分: 1.入门   2.创新点及实验优化 配套工具以及学习资源 文末扫码即可免费领取 上个月,一个读者发私信问我,他目前研究方向是图像分割,想弃坑了. 因为实验室就只有他一个人做这个方向,导 ...

  9. 计算机游戏第72关,史上最难的游戏第72关 第72关通关攻略

    史上最难的游戏第72关 第72关通关攻略 2014-04-03 来源: 996手游网 编辑: 帽纸 () 史上最难的游戏是以暴走漫画为游戏剧情及背景,让无数小伙伴们抓狂的游戏.全新的关卡又更新了,为了 ...

最新文章

  1. 张一鸣的微博世界-产品篇一
  2. python 画三维函数图-如何用Matplotlib 画三维图的示例代码
  3. Spring Boot 2.0(三):Spring Boot 开源软件都有哪些?
  4. 计算机自动启动无法开机,为何插上电源 电脑会自动开机 但是又开不起来
  5. 机器学习(part4)--模型评估
  6. bzoj 刷题计划~_~
  7. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))
  8. 终于,我读懂了所有Java集合——map篇
  9. LeetCode 1236. 网络爬虫(BFS/DFS)
  10. 如何在CDH5.16.2中部署海豚调度器Apache Dolphin Scheduler 1.2.0
  11. xpose修改手机imei码,注入广告
  12. js html模板生成图片不显示,网页中图片不显示问题
  13. 网易云音乐数仓建模实践
  14. 【gloomyfish】【原创】数据分析之 – 散点图
  15. 怎么改微信号第二次_微信号怎么改2017 微信号怎么改第二次方法介绍
  16. 利用CodeMirror构建在线IDE随记
  17. html邮件在线制作模板,最全EDM模板美化教程,在电子邮件中使用CSS和HTML
  18. 算法模版:模拟数据结构之绪论【沈七】
  19. JVM虚拟机——初识
  20. TPM-TPM-Profile-PTP协议-2

热门文章

  1. ORACLE 内存管理 之二 PGA v$pgastat
  2. 黄聪:超实用的PHPExcel[导入][导出]实现方法总结
  3. 浮标水质监测站现场水质自动监测仪
  4. Android硬件扩展接口有哪些,一种安卓智能设备USB接口拓展的方法及装置与流程...
  5. 具身智能controller---RT-1(Robotics Transformer)(中---实验介绍)
  6. CSDN的博客积分计算规则及博客排名规则
  7. c语言中阻止程序退出的函数,(转)C语言中Exit函数的使用
  8. Python软件设计基础 第五节-基于图像相似度比较实现视频分镜
  9. 处在一个浮躁的时代如何做自己
  10. JAVA抽象类——abstract