JS实现打字游戏


Posted in Javascript onDecember 17, 2019

本文实例为大家分享了JS实现打字游戏的具体代码,供大家参考,具体内容如下

第一步:页面的排版和布局

1.1实现开始游戏的界面

1.1.1开始游戏

1.1.2游戏说明

<!--游戏开始的界面-->
 <div id="gameStart">
  <div id="start">开始</div>
  <div id="describe">说明</div>
  <div id="des">打字游戏介绍:点击开始,进入游戏开始界面,
  通过点击下落的字母可以获得得分和正确率
  <span id="cl1">关闭</span>
  </div>
</div>

1.2进入游戏的界面

1.2.1开始按钮-->游戏的暂停

1.2.2结束游戏-->清除掉所有字母元素的定时器,删除字母元素

1.2.3退出游戏-->退出到游戏开始的界面

1.2.4设置-->设置当前游戏的难度

1.2.5打字得分-->每打对一字,得一分

1.2.6打字正确率

operate.onclick = function (evt) {
  var e = evt || window.event;
  var target = e.srcElement || e.target;
  // target:当前事件的目标dom节点
  // if(target.className == "t"){
  //  gameStart.style.display = "block";
  //  game.style.display = "none";
  // }
  if(target.className =="set"){
   sel.style.display = "block";
  }
  // 进入游戏界面之后的开始游戏
  // 目标元素的className == 
  if(target.className =="s"){
   target.innerHTML = target.innerHTML == "开始"?"暂停":"开始";
   if(target.innerHTML == "开始"){
    operate.lastElementChild.style.cursor = "pointer";
    clearInterval(c);
    c = undefined;
    clearAllLetters();
   }else{
    //游戏的开始
    operate.lastElementChild.style.cursor = "not-allowed";
    //控制单位时间内字母的多少的定时器
   c = setInterval(function () {
    createLetter();
    letterEles = document.getElementsByClassName("active");
   },level*1000);//控制显示页面字母的多少
    //暂停之后的开始游戏
    gameStar();
   }
  }
 // 处理结束游戏
  if(target.className == "f"){
   finished();
  }
 // 处理退出游戏
  if(target.className == "t"){
 
  // 首先处理结束游戏要做的事情
   finished();
  // 显示游戏开始界面,隐藏进入游戏界面
   game.style.display = "none";
   gameStart.style.display = "block";
  }
 }

在对四个span即开始,设置,结束,退出加事件时用到了事件委托,事件委托有哪些好处呢?

事件委托一般用在对很多dom添加事件处理的情况中,比如:有100个li,每个li都有相同的onclick事件,我们一般会用for循环来遍历所有的li,然后给它们添加事件.但这种方法要不断与dom节点进行交互,访问dom的次数越多,浏览器重绘和重排的次数也越多,就会延长整个页面的交互就绪时间,事件委托的原理就是事件冒泡原理,即从最深的节点开始,一步一步向上传播事件,比如,有一个dom树,div>ul>li,要给li添加点击事件,那么这个点击事件会一层一层往外执行,执行到div上.使用事件委托的话,就可以对它的父级元素进行操作,与dom的操作只需交互一次,大大提高了性能,举个例子吧:

<ul id="cn">
 <li>qwe</li>
 <li>q2w</li>
 <li>wee</li>
 <li>eer</li>
 <li>ewe</li>
</ul>
window.onload() = function () {
 var ul = document.getElementById("cn");
 var li = ul.getElementsByTagName('li');
 for(int i = 0;i < li.length;i++){
 alert(1212);
 }
}

首先找到ul,然后遍历li,点击li的时候,又要找到目标li的位置,才能执行最后的操作,每次点击都要找一次li.性能很低.

采用事件委托优化的代码:

window.onload() = function () {
 var ul = document.getElementById("cn");
 ul.onclick = function () { 
 alert('1220');
 }
}

此上代码在点击ul时也会触发onclick事件,所以不是最终优化的代码.

最终优化的代码:

window.onload() = function () {
 var ul = document.getElementById("cn");
 ul.onclick = function (evt) {
 var e = evt || window.event;
 var target = e.target || e.srcElement;
 if(target.nodeName == 'li'){
 alert('1220');
 }
 }
}

event对象提供了一个target属性,返回的是当前事件的目标元素节点,这样的话点击ul就不会触发onclick事件了. 

第二步:实现开始游戏

2.1说明提示

2.2进入游戏界面

2.3游戏退出

2.4设置;>显示选择游戏难度

第三步:进入游戏界面之后的开始游戏

3.1点击进入游戏,实现字母的掉落

3.2游戏开始之后,实现游戏的暂停

第四步:实现游戏的暂停

4.1清除定时器,清除单位时间内掉落多少个字母的定时器

4.2清除字母掉落速度的定时器,每个字母元素都存在定时器

4.3结束游戏,清除4.1的定时器和删除4.2所有字母所在的元素

4.4退出游戏,结束游戏,显示游戏开始界面,影藏进入游戏界面

第五步:实现游戏难度的设置

5.1游戏的默认难度是慢

5.2游戏在进行过程中是不允许设置游戏难度的

5.3在游戏暂停和开始之前是允许设置游戏难度的

5.4游戏难度设置之后,在关闭游戏难度设置之后生效

第六步:实现键盘打字,字母消失

6.1全局变量:把当前游戏界面里所有字符存放在该变量里

6.2根据键盘输入的字符,在全局变量字符串里找到该字符的位置

6.3删除该字符所在的元素

//evt代表的是事件对象
 document.onkeyup = function (evt) {
  var e = evt || window.event;
  var codeVal = e.keyCode;
  // e.keyCode获得键盘码
  if(codeVal >= 65 && codeVal <= 90){
   count++;
  }
  // 根据Unicode编码找到对应字符
  var char = keyVal[codeVal];
  if(char){
   var index = letters.search(eval("/" + char + "/gi"));
   // var index = letters.search(char);
   if(index != -1) {
   game.removeChild(letterEles[index]);
   var exp = eval("/" + char + "/gi");
   letters = letters.replace(exp, "");
   // letters = letters.replace(char,"");
   tit.children[0].firstElementChild.innerHTML = ++score;
   tit.children[1].firstElementChild.innerHTML = (score/count*100).toFixed(2) + "%";
  }
  }
 }

以上实现键盘打字,字母消失的代码的主要过程是:

通过e.keyCode获得键盘码,通过键盘码找到对应字符,然后用正则表达式的eval方法对找到的字符进行计算,用search方法匹配到当前目标元素节点距离字符串开始位置的偏移位置.把它从父节点里删掉,还要将letters里的目标元素节点删掉,即用空格代替.每打对一字得一分,分数/键盘按下次数即为正确率.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 事件查询综合
Jul 13 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
Feb 25 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
Apr 27 Javascript
jQuery.fn和jQuery.prototype区别介绍
Oct 05 Javascript
jQuery中:disabled选择器用法实例
Jan 04 Javascript
JS获得选取checkbox整行数据的方法
Jan 28 Javascript
jquery实现键盘左右翻页特效
Apr 30 Javascript
js脚本分页代码分享(7种样式)
Aug 19 Javascript
JS实现的走迷宫小游戏完整实例
Jul 19 Javascript
20行JS代码实现粘贴板复制功能
Feb 06 Javascript
使用uni-app开发微信小程序的实现
Dec 13 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
Sep 17 Javascript
js实现打字小游戏
Dec 17 #Javascript
微信小程序缓存支持二次开发封装实现解析
Dec 16 #Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
Dec 16 #Javascript
ant-design-vue 实现表格内部字段验证功能
Dec 16 #Javascript
js DOM的事件常见操作实例详解
Dec 16 #Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 #Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
Dec 16 #Javascript
You might like
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
vue中的inject学习教程
2019/04/24 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
python使用chardet判断字符串编码的方法
2015/03/13 Python
深入理解python函数递归和生成器
2016/06/06 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
pandas数据集的端到端处理
2019/02/18 Python
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
写自荐信要注意什么
2013/12/26 职场文书
入党后的感想
2015/08/10 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python