相信大家都玩过一种网页游戏,通俗的可以叫颜色分辨测试游戏(这个名字对不对我也不知道,不要在意这些细节),也就是下面截图这个玩意,一看就明白;细细把玩过一段时间,作为一个一百米开外男女不分的弱视青年,每每过不了几关就挂了,对这个结局我也是异常无语,都怪当初学习太用功了(呵呵),想挑战的点击这里

  这个游戏的流程就是页面上会出现不同颜色的格子,也就是div啦,点击颜色唯一的格子就算过关,然后格子变多(max后不再变多),颜色变的相近,难度也就变大了,直到点错了或者倒计时结束了,很简单的样子,作为前端人员后不犹豫的F12之,如下:

  就是这个结构啦,#box中一串span,其中有个span的style:background是唯一的,点击这个唯一的就OK啦,于是我就顺其自然的想用脚本代替我逐个点击,没办法视力不行啊,还想省力,于是直接码之如下:

//取到所有background
var stylelist = new Array();
$("#box span").each(function() {
for(var i = 0; i < $("#box span").length; i++) {
stylelist[i] = $(this).attr("style");
}
});
//分割数组
var s = stylelist.join(",") + ",",
copy;
for(var i = 0; i < stylelist.length; i++) {
//取出唯一style
if(s.replace(stylelist[i] + ",", "").indexOf(stylelist[i] + ",") > -1) {
copy = stylelist[i];
}
}
//不解释了吧
$("#box span").each(function() {
if($(this).attr("style") != copy)
$(this).click();
return;
});

  然后上面的代码就可以代替手动点击了,很方便有木有,下面是我实测运行的结果:(如果有纯手点的记录超过我这个的,请收下我的膝盖)

  168关,你没有看错,就是168,一分钟时间通过168关,而且中间有浏览器反应的缓慢时间,所以真实的应该比这个还要高(开始有点理解游戏外挂了啊喂),但是这段代码太粗糙了(span少可以秒),效率很低,这个后面会继续说;

  如果有人问,桥豆麻袋~你是怎么运行的,浏览器上运行?这就说明你很少用浏览器调试啊,方法如下:

  简单粗暴直接运行就行了,当然这也不是最优的选择,因为每次到新关卡(新页面)都要手动去运行,也着实累手(回车键一脸委屈),可以考虑封装成浏览器插件,页面进来就自动运行了,省心省力~~

  接着上面所的效率说,来优化这段代码,之所以说这段代码粗糙,是因为它是遍历所有span,这里是不多所以几乎是秒过,如果是span很多或者性能要求极致的大厂,这段代码是通不过的,优化的方案就是遍历所有的span的style的时候,第一次遇到唯一style就操作了,比如有10000个格子,第十个就是不同的格子,所以只要遍历到这里就结束了,而不是遍历10000,不然浏览器君表示扛不住啊。。。话不多说码之如下:

var stylelist = new Array(),
copy;
$("#box span").each(function() {
for(var i = 0; i < $("#box span").length; i++) {
stylelist[i] = $(this).attr("style");
//初始格子数大于2
for(var j=0;j<stylelist.length;j++){
if(stylelist.toString().replace(stylelist[j],"").indexOf(stylelist[j])>-1){
copy = stylelist[j];
}
return;
}
}
});
//这里不知道还能不能优化,先mark一下
$("#box span").each(function() {
if($(this).attr("style") != copy)
$(this).click();
return;
});

  好吧,其实顺起来看很简单,然而实现容易,最优不易,极致的优化要求对于编写者是个十足的考验,毕竟写的都是经验积累啊,今天先码到这里吧,文中如有纰漏或更好的方法欢迎小伙伴们指出。

-------------------------------------脑袋被门夹后的华丽分割线------------------------------------------------

  果然手动操作是个愚蠢至极的方式啊,一直怀疑click那里有问题,没有注意到页面没刷新(以页面刷新的角度思考的,所以才提到浏览器插件 汗),刚刚一位小伙伴从头_再来给出这个思路,使用setTimeout自动循环,解决了这个问题,赞啊,厉害了word哥,受教,下面是跑分,完爆168

  

  代码如下,小伙伴们共同鉴赏:

(function findSpan(){
var spanList=document.getElementById("box").children,
spanLen=spanList.length; if(spanLen==0){
return;
} function getColor(index){
return spanList[index].style.backgroundColor;
} function isDiffSpan(index){
return getColor(index)!=getColor((index+1)%spanLen)
&& getColor(index)!=getColor((index+2)%spanLen);
} for(var i=0;i<spanList.length;i++){
if(isDiffSpan(i)){
spanList[i].click();
break;
}
} setTimeout(findSpan,10);
})();

  

  最后根据小伙伴的提示稍稍改动了下我的代码,可以跑7000左右,暴力了(跑的网页秒表都动不了。。。),不过隐隐感觉click那里还有问题,先放出这一版修改:

  

(function autoFind() {
var stylelist = new Array(),
copy;
$("#box span").each(function() {
for(var i = 0; i < $("#box span").length; i++) {
stylelist[i] = $(this).attr("style");
for(var j = 0; j < stylelist.length; j++) {
if(stylelist.toString().replace(stylelist[j], "").indexOf(stylelist[j]) > -1) {
copy = stylelist[j];
}
return;
}
}
});
$("#box span").each(function() {
if($(this).attr("style") != copy)
$(this).click();
return;
});
setInterval(autoFind, 10);
})()

  有想继续挑战的小伙伴可以尝试破了这个记录

网页颜色分辨测试小游戏的js化辨别及优化的更多相关文章

  1. 微信小游戏 three.js jsonloader request:fail invalid url

    微信小游戏中,用 THREE.JSONLoader 直接加载本地的 json 文件,报错.估计是跨域访问的问题 解决:把 json 文件放到服务器上,通过 url 来访问. 临时测试的话,在本地起一个 ...

  2. 微信小游戏 Three.js UI 2D text 简单方案

    在微信小游戏中使用 THREE.js 引擎,没有合适的 UI 库可用,只能自己动手.图片啥的都还好,text 不好弄.text 要计算 width 和 height,不然事件响应范围不对. funct ...

  3. 用原生JS写一个网页版的2048小游戏(兼容移动端)

    这个游戏JS部分全都是用原生JS代码写的,加有少量的CSS3动画,并简单的兼容了一下移动端. 先看一下在线的demo:https://yuan-yiming.github.io/2048-online ...

  4. 观摩制作小游戏(js应用)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 微信小游戏 main.js没有被压缩

    发布时,发现main.js没有被压缩. 在config.wxgame.ts里增加如下图.

  6. 玄机网C#论坛测试小游戏

    http://files.cnblogs.com/ro4ters/EasyGame.zip http://www.xuanjics.com/thread-39-1-1.html 具体活动地址

  7. HTML5小游戏源码收藏

    html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js ...

  8. 微信小程序の微信js

    一.Javascript简介 二.nodejs中的jscript nodejs表示谷歌基于v8引擎的一门后端语言, ECMA表示ECMA262标准的基本js,native表示nodejs本身的一些包, ...

  9. 小游戏专场:腾讯云Game-Tech技术沙龙上海站顺利落下帷幕

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 9月14日腾讯云GAME-TECH技术沙龙小游戏专场在上海顺利举办,此次技术沙龙由腾讯云的资深专家,以及 ...

随机推荐

  1. 第三波假期干货——webstrom工具栏图标

    在WS中使用工具栏上的快捷图标来配合工作可以有效提高效率,因为你不用去记住一些快捷键,只要点一下鼠标即可.不过在WS中有很多实用功能却是没有自带个性图标的,导致自定义工具栏后可能就是好几个一模一样的绿 ...

  2. 【腾讯Bugly干货分享】微信Tinker的一切都在这里,包括源码(一)

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ecdf2d98250b4631ae034b 最近半年以来,Android热补 ...

  3. 谈谈final的作用

    前言 一直想写写这个话题.代表公司也面试过一些求职者,每次面试我必问的两个问题之一就是“请你谈一谈对于final关键字的理解”.这是一个简单的小问题,但是不要小看它,通过对这个问题的回答以及一些简单的 ...

  4. Hadoop日记Day12---MapReduce学习

    一.MapReduce简介 1.1MapReduce概述 MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.MR由两个阶段组成:Map和Reduce ...

  5. JavaScript使用DeviceOne开发实战(六)点墨真实案例

    qq群里的yan用户开发的App,基本完工大家可以看看 安装二维码是 QQ群:365443130

  6. 谈谈.net模块依赖关系及程序结构

    技术为解决问题而生. 上面这个命题并非本文重点,我将来有空再谈这个.本文也并非什么了不起的技术创新,只是分享一下我对.net模块依赖关系及程序结构方面的一些看法.先看一个最最简单的hello worl ...

  7. shell脚本常规技巧

    邮件相关 发送邮件: #!/usr/bin/python import sys; import smtplib; from email.MIMEText import MIMEText mail_ho ...

  8. JS之BOM

    ECMAScript 是 JavaScript 的核心,但如果要在 Web 中使用 JavaScript,那么 BOM(浏览器对象模型)则无疑才是真正的核心.BOM 提供了很多对象,用于访问浏览器的功 ...

  9. POI生成WORD文档

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  10. javascript_core_03之数组

    1.数组:连续存储多个数据,一组连续变量的集合: ①创建空数组:var arr=[]:或者var arr=new Array(): ②创建初始化数组:var arr=[值1,值2,……]:或者var ...