首页 文章 精选 留言 我的

精选列表

搜索[javascript库],共10000篇文章
优秀的个人博客,低调大师

JavaScript小游戏,键盘英雄!

该游戏仅供探讨交流。 该游戏可随意传播,请保留声明与出处。 几年前的一个夜晚孤枕难眠,突然来了灵感。创作游戏的初衷是巩固js基础,有朋友问我,为什么取这个名字呢? 可以想象你是电影的主角,打字的速度已达到独孤求败的境界,狂风呼啸电闪雷鸣,键盘声响起,键盘在你指尖灵动肆意纷飞,眨眼的功夫一部20万字撰写完毕。 生活不止眼前的苟且,还有诗和代码!当然这也是需要有想象力的。 欢迎有更多想象力的朋友分享思维,在这款游戏上面继续扩展。 html部分可以用js来生成,其中加入了H5中的audio元素,按键音效,后续还可以增加背景音乐,或者再来一个升级音效,一直没有增加的原因是,没有找到满意的音乐,看来想做一个全能大神还是有难度的,哈哈!css建议用BEM或OOCSS设计模式便于维护和模块化功能扩展。js注释的很明白,还可以添加很多功能,得分也可以更加复杂,可以生成随机数0~99,或增加生成黄色按键几率10%得分10,或增加生成蓝色按键几率5%得分30,增加趣味性,只需要调整升级机制。越来越有趣了,有时候开发要保持童心不是么? 完整项目地址:https://github.com/af66666/typing_hero.git 上菜: html↓ <div id="pg"> <div> <div id="esc">Esc</div> </div> <div id="key"> <div class="white">q</div> <div class="white">w</div> <div class="white">e</div> <div class="white">r</div> <div class="white">t</div> <div class="white">y</div> <div class="white">u</div> <div class="white">i</div> <div class="white">o</div> <div class="white">p</div> <div class="white">[</div> <div class="white">]</div> <div class="white">a</div> <div class="white">s</div> <div class="white">d</div> <div class="white">f</div> <div class="white">g</div> <div class="white">h</div> <div class="white">j</div> <div class="white">k</div> <div class="white">l</div> <div class="white">;</div> <div class="white">'</div> <div class="white">z</div> <div class="white">x</div> <div class="white">c</div> <div class="white">v</div> <div class="white">b</div> <div class="white">n</div> <div class="white">m</div> <div class="white">,</div> <div class="white">.</div> <div class="white">/</div> </div> <p id="score">-</p> <p id="level">-</p> <i id="go"></i> </div> <!--<audio id="music" src="18839369087.mp3"></audio>--> css↓ #pg { width: 800px; height: 600px; margin: 0 auto; position: relative; background-image:linear-gradient(60deg,#62C292 0%,#F8CBAD 25%,#62C292 50%,#F8CBAD 75%,#62C292 100%); } #pg:before { content: ""; display: table; } #pg>div { margin: 20px; overflow: hidden; } #pg>div+div { margin: 80px 0; padding: 20px 0; } #pg div div { float: left; width: 40px; height: 40px; border: 5px solid #000; border-radius: 5px; text-align: center; line-height: 40px; font-size: 22px; font-family: helvetica; font-weight: bold; margin-right: 2px; margin-bottom: 2px; cursor: pointer; } #key div:first-child { margin-left: 88px; } #key div:nth-child(13) { margin-left: 108px; } #key div:nth-child(24) { margin-left: 128px; } #pg p { position: absolute; top: 390px; left: 280px; font-family: helvetica; font-size: 36px; font-weight: bold; color: #fff; opacity: 0.5; cursor: pointer; } #pg p+p { top: 430px; } .red { background: #f00; opacity: 0.5; color: #fff; } #go { display: none; width: 800px; height: 600px; position: absolute; top: 0; left: 0; text-align: center; line-height: 600px; font-size: 160px; font-weight: bold; font-family: helvetica; color: red; cursor: pointer; transition: font-size 0.5s ease-out; } #go:hover { font-size: 200px; } js↓ var destroy = { state: 0, //游戏状态 timer: null, //游戏引擎,主定时器 level: 1, //等级 sc: 0, //积分 many: 0, //消除的个数 MANYS: 20, //升级需要消除的个数 interval: 500, //红色生成的速度 LINTERVAL: 50, //红色生成速度加快 MIN: 100, //生成红色的最快速度 READY: 0, //就绪状态 RUNNING: 1, //正在游戏中 PAUSE: 2, //暂停状态 GAMEOVER: 3, //游戏结束 //就绪状态 ready: function() { this.state = this.READY; //就绪状态 this.sc = 0; //游戏初始化 this.many = 0; //游戏初始化 this.level = 1; //游戏初始化 this.interval = 500; //游戏初始化 esc.style.color = '#00ffff'; go.innerHTML = 'ready'; go.style.background = '#f7f7f7'; go.style.display = 'block'; go.onclick = function() { go.innerHTML = ' '; go.style.display = 'none'; destroy.start(); //destroy.playAudio(); } score.innerHTML = 'SCORE:' + this.sc; level.innerHTML = 'LEVEL:' + this.level; }, //游戏进行中 start: function() { this.state = this.RUNNING; var ds = key.querySelectorAll('div'); this.timer = setInterval(function() { var white = key.querySelectorAll('div.white'); var tmp = white.length; var n = parseInt(Math.random() * tmp); if(tmp > 0){ white[n].className = "red"; }else{ destroy.gameOver(); } for(var r = 0; r < ds.length; r++) { ds[r].style.transform = ''; } }, this.interval); esc.onclick = function() { destroy.pause(); //destroy.playAudio(); } document.onkeydown = function(e) { switch(e.keyCode) { case 27: esc.style.color = '#f00'; destroy.pause(); //destroy.playAudio(); break; case 219: if(ds[10].className == 'red') { ds[10].className = 'white'; ds[10].style.transform = 'rotate(30deg)'; destroy.createLevel(); //destroy.playAudio(); } break; case 221: if(ds[11].className == 'red') { ds[11].className = 'white'; ds[11].style.transform = 'rotate(30deg)'; destroy.createLevel(); //destroy.playAudio(); } break; case 186: if(ds[21].className == 'red') { ds[21].className = 'white'; ds[21].style.transform = 'rotate(30deg)'; destroy.createLevel(); //destroy.playAudio(); } break; case 222: if(ds[22].className == 'red') { ds[22].className = 'white'; ds[22].style.transform = 'rotate(30deg)'; destroy.createLevel(); //destroy.playAudio(); } break; case 188: if(ds[30].className == 'red') { ds[30].className = 'white'; ds[30].style.transform = 'rotate(30deg)'; destroy.createLevel(); //destroy.playAudio(); } break; case 190: if(ds[31].className == 'red') { ds[31].className = 'white'; ds[31].style.transform = 'rotate(30deg)'; destroy.createLevel(); //destroy.playAudio(); } break; case 191: if(ds[32].className == 'red') { ds[32].className = 'white'; ds[32].style.transform = 'rotate(30deg)'; destroy.createLevel(); //destroy.playAudio(); } break; } for(var i = 0; i < ds.length; i++) { if(String.fromCharCode(e.which).toLowerCase() == ds[i].innerHTML) { if(ds[i].className == 'red') { ds[i].className = 'white'; ds[i].style.transform = 'scale(1.8)'; destroy.createLevel(); //destroy.playAudio(); } } } var num = e.keyCode; //检测 var en = String.fromCharCode(e.which); //检测 console.log(num); //检测 console.log(String(en)); //检测 } }, //暂停状态 pause: function() { this.state = this.PAUSE; //暂停状态 go.innerHTML = 'pause'; go.style.opacity = 0.5; go.style.display = 'block'; go.style.background = '#fff'; clearInterval(this.timer); document.onkeydown = function(e) { switch(e.keyCode) { case 27: esc.style.color = '#00ffff'; go.style.display = 'none'; destroy.start(); //destroy.playAudio(); } } }, //游戏结束 gameOver: function() { this.state = this.GAMEOVER; clearInterval(this.timer); go.style.opacity = 1; go.innerHTML = 'OVER'; go.style.display = 'block'; go.style.background = '#000'; this.sc = 0; //游戏初始化 this.level = 1; //游戏初始化 this.interval = 500; //游戏初始化 this.many = 0; //游戏初始化 document.onkeydown = function(e) { switch(e.keyCode) { case 83: go.style.display = 'none'; var ds = key.querySelectorAll('div'); for(var i = 0; i < ds.length; i++) { ds[i].className = 'white'; } score.innerHTML = 'SCORE:' + 0; level.innerHTML = 'LEVEL:' + 1; destroy.start(); //destroy.playAudio(); } }; go.onclick = function(){ go.style.display = 'none'; var ds = key.querySelectorAll('div'); for(var i = 0; i < ds.length; i++) { ds[i].className = 'white'; } score.innerHTML = 'SCORE:' + 0; level.innerHTML = 'LEVEL:' + 1; destroy.start(); //destroy.playAudio(); }; }, //等级得分机制 createLevel: function() { this.sc += 5; this.many++; if(this.many == this.MANYS) { this.many = 0; this.level++; if(this.interval >= this.MIN) { this.interval -= this.LINTERVAL; clearInterval(this.timer); //清除定时器 destroy.start(); //重新启动定时器 } } score.innerHTML = 'SCORE:' + this.sc; level.innerHTML = 'LEVEL:' + this.level; if(this.level >= 10) { level.innerHTML = '您已打破世界纪录'; } }, //音频 playAudio: function() { music.pause(); music.load(); music.play(); }, } //运行 window.onload = function() { destroy.ready(); } html部分可以用js来生成,其中加入了H5中的audio元素,按键音效,后续还可以增加背景音乐,或者再来一个升级音效,一直没有增加的原因是,没有找到满意的音乐,看来想做一个全能大神还是有难度的,哈哈!css建议用BEM或OOCSS设计模式便于维护和模块化扩展。js注释的很明白,还可以添加很多功能,得分也可以更加复杂,可以生成随机数0~99,或增加生成黄色按键几率10%得分10,或增加生成蓝色按键几率5%得分30,增加趣味性,只需要调整升级机制。越来越有趣了,有时候开发要保持童心不是么? 后续将继续改进扩展,欢迎指导交流!

优秀的个人博客,低调大师

JavaScript尾递归优化探索

尾调优化 在知道尾递归之前,我们要直到什么是尾调用优化,因为尾调用优化是尾递归的基础。尾调用就是:在函数的最后一步调用另一个函数。 function f() { return g() } ps:最后一步必须是之久调用另一函数,而不能是一个常量或是一个表达式,如 return y 或 return g() + 1 尾调用优化的原理是什么? 按照阮一峰老师在es6的函数扩展中的解释就是:函数调用会在内存形成一个“调用记录”,又称“调用帧”(call frame),保存调用位置和内部变量等信息。如果在函数A的内部调用函数B,那么在A的调用帧上方,还会形成一个B的调用帧。等到B运行结束,将结果返回到A,B的调用帧才会消失。如果函数B内部还调用函数C,那就还有一个C的调用帧,以此类推。所有的调用帧,就形成一个“调用栈”(call stack)。 这里的“调用帧”和“调用栈”,说的应该就是“执行环境”和“作用域链”。因为尾调用时函数的最后一部操作,所以不再需要保留外层的调用帧,而是直接取代外层的调用帧,所以可以起到一个优化的作用。 尾递归优化 我们知道,递归虽然使用起来方便,但是递归是在函数内部调用自身,当递归次数达到一定数量级的时候,他形成的调用栈的深度是很可怕的,很可能会发生“栈溢出”错误。尾递归优化,就是利用尾调用优化的原理,对递归进行优化。举一个很常见的例子: 求斐波那契数值 function fibonacci (n) { return n <= 1 ? 1 : fibonacci(n - 1) + fibonacci(n - 2); } 此函数没有进行任何的优化,当我们在控制台去执行此函数的时候,fibonacci(40)就已经出现了明显的响应慢的问题,fibonacci(50)的时候浏览器卡死。 2. 优化 function fibonacci (n, ac1, ac2) { (ac1 = ac1 || 1), (ac2 = ac2 || 1); return n <= 1 ? ac2 :fibonacci(n - 1, ac2, ac1 + ac2); } 此优化有两个点:首先进行了算法上的优化,减少了很多重复的计算,时间复杂度大大降低;第二进行了尾递归优化,按理说不会发生“栈溢出”。我们可以到控制台中再尝试,发现速度的提升不是一般的快,证明第一个优化生效了,但是当我们允许fibonacci(10000)的时候,报错了:Uncaught RangeError: Maximum call stack size exceeded,这就说明我们的尾递归优化并没有生效。为什么呢? 局限性 上面说到,我们直接再浏览器的控制台中执行fibonacci(10000)的时候,发生了栈溢出,这是为什么呢?关于这一点,我目前查阅资料之后的理解就是,虽然es6已经提出了要实现尾递归优化,但是真正落地实现了尾递归优化的浏览器并不多。所以当我们使用尾递归进行优化的时候,依旧发生了“栈溢出”的错误。 蹦床函数 那怎么办呢?我们还有另一个方法去达到尾递归优化的效果,那就是使用蹦床函数(trampoline)。 function trampoline(f) { while (f && f instanceof Function) { f = f(); } return f; } 代码修改为返回一个新函数。 function fibonacci (n, ac1, ac2) { (ac1 = ac1 || 1), (ac2 = ac2 || 1); return n <= 1 ? ac2 :fibonacci.bind(null, n - 1, ac2, ac1 + ac2); } 两个函数结合就可以将递归状态为循环,栈溢出的问题也就解决了。 trampoline(fibonacci (100000)) // Infinity 原文发布时间为:2018年07月04日 原文作者: 掘金 本文来源: 掘金 如需转载请联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册