零、体验游戏

http://aring.3vfree.net/game/Chimpanzee-Test/index.html

一、实现效果

二、实现过程

看上图实现效果,大致的思路梳理:

1.设定一个表格,初始隐藏所有单元格

2.随机给单元格赋值以及添加边框

3.根据游戏难度等级循环赋值单元格

4.赋值完毕后为单元格添加点击事件以判断点击结果

5.判定尝试次数以及继续游戏/重新游戏功能

梳理好思路开始写脚本:

第一步

实现让单元格随机显示在表格中,如下图

首先,获取所有<td>标签,然后随机指定需要赋值的td,我这里做了30个单元格所以随机0~29

  const td = document.getElementsByTagName("td")  // 单元格// 随机指定需要赋值的tdfunction randomTd() {const tdIndex = Math.floor(Math.random() * 29)return td[tdIndex]}

然后根据等级循环给td赋值

循环获取上文随机得到的td,然后给td设定文本为i,即第几次循环,td的文本就是几

然后给td加上设定好的边框class

最后,给每个td单独添加一个点击事件,并传参循环次数i 和该td本身,用以判断点击时的结果

  let level = 6  // 等级// 根据等级循环给td赋值function tdAssignment() {for (let i = 1; i < level; i++) {let slTd = randomTd()slTd.innerText = islTd.classList.add("td-border")}}

但是这上文会出现一个问题,假如随机的td重复了怎么办呢?

为了解决这个问题可以循环判断td 当前文本不为空,即:假设td当前的文本已经被赋值,则再次随机,用循环是为了重复判断

      for (let i = 0; slTd.innerText != ""; i++) {  // 将要赋值的td如果不为空,则再次随机td的indexslTd = randomTd()}

将该判断到tdAssignment()中

  // 根据等级循环给td赋值function tdAssignment() {for (let i = 1; i < level; i++) {let slTd = randomTd()for (let i = 0; slTd.innerText != ""; i++) {  // 将要赋值的td如果不为空,则再次随机td的indexslTd = randomTd()}slTd.innerText = islTd.classList.add("td-border")}}

因此开始游戏按钮中的函数直接执行上文两个函数即可

  // 游戏开始function gameStart() {randomTd()tdAssignment()}

第二步

上文所说已经为td赋值了文本,接下来是定义td的点击事件

开始理思路:

1.给td 赋值的同时,添加点击事件

2.将td 赋的值和自身传给结果判断的函数中

      slTd.onclick = function() {  // 为每个td添加点击事件gameResult(i, this)}

3.定义一个点击次数的变量,初始为1,意为第一次点击

4.开始写判断结果的函数,很简单,得到传过来的参数 i ,将参数 i 和 count对比,如果是相同的,就隐藏对应的 td,并且将点击次数+1

  // 点击后判断结果function gameResult(index, obj) {if (index == count) {  // 判断td的值是否等于点击次数obj.classList.add("hidden")}count++  // 每次点击完,点击次数+1}

5.然后判断是否过关,即点击完所有数字,加一个判断,当参数 i == 等级时,就是正确点击了最后一个数字

顺便加上失败判断,以及切换结果页的函数goResult

  // 点击后判断结果function gameResult(index, obj) {if (index == count) {  // 判断td的值是否等于点击次数obj.classList.add("hidden")if (index == level - 1) {// 胜利isSuc = 1goResult()}} else {// 失败isSuc = 0tryCount++goResult()}count++}

6.开始第一次点击时,隐藏所有td ,采用遍历 td 将选中的td (判断其是否有边框即可) 为其添加一个新的class

加上level限制是为了第一次开始游戏时作为教程关卡不隐藏td

    if (index == 1 && level > 6) {  // 第一次点击时隐藏td(第一次开始游戏时不隐藏td)for (let i of td) {if (i.className == "td-border")i.classList.add("td-shade")}}

第三步

结果页的效果如下图

都是一些简单的写入参数的操作,这里不赘述,结合上文定义一个尝试次数(tryCount),当尝试次数达到3次时改变按钮文本为重新开始即可

第四步

重置游戏/继续游戏(上图“继续”按钮的功能)

最后的功能完善,同时也需要配合完善上文函数中的细节

1.首先遍历每个td,清空其class、文本和点击事件

    for (let i of td) {  // 遍历td以重置td的class、文本和点击事件i.classList.remove("td-border")i.classList.remove("td-shade")i.classList.remove("hidden")i.innerText = ""i.onclick = null  // 清理td的点击事件}

2.转到结果页面时,需要重置点击次数为1

3.判断尝试次数是否达到3次,如是,重置到开始页面;

如不是,根据是否胜利,胜利则加大难度/重置尝试次数 开始游戏,失败则保持当前难度继续 开始游戏

完整代码如下

  // 重置游戏(继续/重新开始)function gameReset(isCheater) {for (let i of td) {  // 遍历td以重置td的class、文本和点击事件i.classList.remove("td-border")i.classList.remove("td-shade")i.classList.remove("hidden")i.innerText = ""i.onclick = null  // 清理td的点击事件}count = 1  // 重置点击次数if (tryCount == 3) {  // 尝试次数达到最高次数result.classList.add("hide")cheater.classList.add("hide")info.classList.remove("hide")level = 6tryCount = 0} else {if (isSuc == 1) {  // 如果胜利level++tryCount = 0gameStart()} else gameStart()}}

原生JS实现黑猩猩测试相关推荐

  1. js map遍历 修改对象里面的值_求职季之你必须要懂的原生JS(上)

    点击上方"IT平头哥联盟",选择"置顶或者星标" 一起进步- 互联网寒冬之际,各大公司都缩减了HC,甚至是采取了"裁员"措施,在这样的大环境 ...

  2. linux脚本石英钟,原生JS实现的简单小钟表功能示例

    本文实例讲述了原生JS实现的简单小钟表功能.分享给大家供大家参考,具体如下: 先来看看运行效果: 完整代码: www.jb51.net 钟表 body { background-color:#00A2 ...

  3. 原生js监听input值发生变化

    原生JS中可以使用oninput,onpropertychange,onchange oninput,onpropertychange,onchange的用法 1) onchange 触发事件必须满足 ...

  4. 分支结构||分支循环结构||使用原生js遍历对象

    分支循环结构 分支结构 v-show的原理:控制元素样式是否显示 display:none <!DOCTYPE html> <html lang="en"> ...

  5. vue如何使用原生js写动画效果_原生js写一个无缝轮播图插件(支持vue)

    轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端.因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使 ...

  6. 原生html小游戏,原生JS实现别踩白块小游戏(一)

    对于前端开发人员来说,闲暇之余自己开发个小游戏打发时间,也是对自己基础技术的一种应用考验.那么别踩白块小游戏,相信大家并不陌生,这个小游戏我们可以通过原生js来实现,即便是前端初学者也可以轻松完成. ...

  7. vue实现实时监听文本框内容的变化(最后一种为原生js)

    一.用watch方法监听这个变量. <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  8. 原生JS实现addClass,removeClass,toggleClass

    jQuery操作class的方式非常强大,但是目前还有一些人不知道如何使用或者由于项目统一性的原因无法使用jquery. 在此写了一个利用原生js来实现对dom元素class的操作方法 1.addCl ...

  9. 原生js来实现对dom元素class的操作方法

    jQuery操作class的方式非常强大 写了一个利用原生js来实现对dom元素class的操作方法 1.addClass:为指定的dom元素添加样式 2.removeClass:删除指定dom元素的 ...

最新文章

  1. python学习 day2 (3月2日)
  2. 第四十四章 微服务CICD(6)- gitlab + jenkins + docker + k8s
  3. mst算法matlab_基于并查集+Kruskal算法的matlab程序及最小生成树绘图
  4. [转]Installing Memcached on Windows
  5. python web py官网_python web.py
  6. 【C++ 学习笔记】 MFC CEdit
  7. OpenCV中cornerSubPixel()亚像素求精原理
  8. lr常用的几个函数(不完整)
  9. [Git问题解决error: The followin]The following untracked working tree files would be overwritten by merge
  10. [转载] Java基础知识面试题(2020最新版)
  11. Docker 的部署方式
  12. 面试题之——多线程详解
  13. 怎么样实现一台电脑上两个mysql自由切换版本
  14. html游戏代码20行,js贪吃蛇源代码 20行js代码实现的贪吃蛇大战?
  15. 我们都只是一朵浮萍罢了
  16. Windows CE 模拟器和远程调试工具
  17. vue img初始化时不显示图片错误图标
  18. c dbhelper类下载mysql_分享一个简单的C#的通用DbHelper类(支持数据连接池)
  19. Fiddler命令笔记
  20. java期末复习题-110道选择题

热门文章

  1. 知识竞赛策划书,这样写就全面了
  2. 业余数学牛人的数学自学心得(转载)
  3. 【算法竞赛学习笔记】状压DP
  4. 中文汉字注音,汉字转拼音,支持图片识别文字,支持结果转图下载,附上小程序核心源码
  5. 移动端键盘弹起底部固定模块会被顶上去
  6. [乡土民间故事_徐苟三传奇]第四二回_见洋广争啃西瓜皮
  7. java实现九宫格解锁_Java计算手机九宫格锁屏图案连接9个点的方案总数
  8. 用python简单入门写糖葫芦!
  9. 王半仙儿的日记-0004
  10. 为什么国家要推行营改增?