javascript实现数字配对游戏的实例讲解


Posted in Javascript onDecember 14, 2017

游戏效果如下图所示:

javascript实现数字配对游戏的实例讲解

规则:

在4X5的格子中,有随机的互不相等的10个数,每个数据有两份(也就是20个数,有两两相等的十对),随机分布在20个格子中。游戏开始,弹出二十个数的序列。每次点击格子会显示当前格子中的数据并暂时保留显示,直到下一次点击,如果下一次点击显示的数据与保留的数据不同,则之前点击保留的数据会消失(仍然存在于该格子但不显示)。如果连续点击显示的两个数据一样,则两个数据都会显示并且不会再消失。

直到所有数据都通过连续点击相同数据的方式显示出来,就算游戏结束,报出游戏用时。此时可以点击开始游戏或刷新来继续。

分析:

1:二十个格子对应二十个数据,产生两组相等的十个随机数并放入数组,数组下标决定显示位置。

2:每个格子的状态的三种:数据隐藏,暂时保留数据和永久显示。数据隐藏的格子通过点击的下一次状态是暂时保留。暂时保留数据的格子通过点击下一次状态是永久显示或数据隐藏,这里要根据连续两次获取的数据是否相等来判断。永久显示之后状态已经不可变,只能永久显示出来,此时对点击是无效的。

3 :计时从点击开始按钮之后,点击第一个格子时开始。直到游戏完成或点击刷新重开,期间计时器不能停止。

4 :得出,这里需要一个布尔值,记录游戏是否已经开始,已经开始的游戏对开始按钮应该拒绝,计时器运行直到游戏完成。游戏完成时,改变布尔值,计时器停止工作,显示游戏用时,开始按钮可用。

实现:

表格通过script创建,其中的元素先默认显示为“”空字符串。通过对应的点击来显示。CSS样式可自行设定。

<table border:1>
  <script>
   var rowlength = 4;
   var collength = 5;
   var str = '';
   for (var i = 0; i < rowlength; i++) {
    str += '<tr>'
    for (var j = 0; j < collength; j++) {
     //这里将每个td的id拼接为imgxx xx为元素索引
     var index = i * collength + j;
     var id = "img" + index;
     //注意这里字符串 每个''是一个字符串进行输出
      str += '<td id="' + id + '" onclick="showImg(' + index + ')">';
     str += '</td>';
    }
    str += '</tr>'
   }
   document.write(str);
  </script>
 </table>

NEW_START记录是否可以开始游戏的变量

times记录已用时间

trans记录每个格子的翻转状态 ,数组每个格子有三种状态 0:隐藏-1:显示(仍可翻转)-2:显示(不可翻转)。也就是数组的每个元素只有三个可能的值0,1,2)

numArr三十个数的随机序列数组

var NEW_START = true;
  var times = 0;
  var trans = [];
  var numArr = [];

通过ID获取到元素的方法:

function $(id) {
  return document.getElementById(id);
   }

下面通过函数获取到二十个随机数,两两相等的十组(可参见:生成指定范围随机数)

function getNum() {
    var index = 0;
    var arrLength = rowlength * collength / 2;
    var arr = new Array();
    while (index < arrLength) {
     var flag = true;
     var num = parseInt(Math.random() * 100);
     for (var i in arr) {
      if (arr[i] == num || arr[i] < 1) {
       flag = false;
      }
     }
     if (flag == true) {
      arr[index] = num;
      index++;
     }
    }
    //alert(arr.length);
    //arr是十个互不相等的随机数 
    // newArr数组就是每个随机数都有两个的数组
    var newArr = new Array();
    for (var i = 0; i < arrLength; i++) {
     newArr[i] = arr[i];
     newArr[arrLength + i] = arr[i];
    }
    return newArr;
   }

创建表格,生成随机数数组这些都是准备工作。

下面是具体的逻辑:

开始游戏的点击函数

<input type="button"
 id="startButton" 
value="开始游戏" 
onclick="init()">

点击开始游戏,需要初始化游戏相关的参数,注意如果已经开始,就需要拒绝处理。将数组元素用排序函数打乱做到随机性。

function init() {
    //如果已经开始 拒绝点击
    if (NEW_START == false) {
     return;
    }
    //结束时用于显示时间的h4标签
    $('end').innerHTML = '';
    var count = rowlength * collength;
    //将每个格子的数据隐藏 初始化每个格子的翻转状态
    for (var i = 0; i < count; i++) {
     $('img' + i).innerHTML = '';
     trans[i] = 0;
    }
    //将游戏用时置为0
    times = 0;
    $('gametime').innerHTML = times + '秒';
    //获取随机的三十个数的随机序列数组 注意排序函数的使用
    numArr = getNum().sort(function () {
     return Math.random() - 0.5;
    });
    alert("已生成随机数,按表格顺序排列:" + numArr);
   }

计时函数

在点击第一个格子时,就需要开始计时。NEW_START=false表示已经开始,需要确保只在游戏进行中时才计时。每秒调用自身一次,并通过innerHTML把所用时间实时显示出来。

用时:<span id="gametime">0秒</span>
 function countTime() {
    if (NEW_START == false) {
     setTimeout('countTime()', 1000);
     $('gametime').innerHTML = times + "秒";
     times++;
    }
   }

每个格子的点击函数(超重点)

在未开始时拒绝点击格子的(没有效果)。进入游戏点击第一个格子,游戏开始,状态改变,NEW_START=false表示已经开始不可创建新游戏。计时开始。

后面的点击事件就需要判断点击的格子来处理不同的逻辑:

点击已永久显示的元素,不处理return。

点击刚显示但不是永久显示的元素,也不处理return。

(注意这里判断是不是同一元素是直接通过状态值在trans中将索引index查找出来后对比)

点击未显示元素,获取值,与前一个显示的元素对比:

相等,都将trans中对应索引的状态值改为2,表示永久显示

不等,新点击元素在trans中对应索引状态值改为1(暂时保留),前一个点击的元素索引值为0(需要隐藏)。

设置完状态值,就立马需要更新显示(refreshUI函数)。更新显示时根据记录状态值的数组trans来操作的。

function showImg(index) {
    //未点击开始,还未初始化,退出
    if (numArr[0] == undefined) {
     return;
    }
    //初次点击进入,开启计时
    if (NEW_START) {
     NEW_START = false;
     countTime();
    }
    //1-点击已经彻底显示的元素 退出
    if (trans[index] == 2) {
     return;
    }
    //将点击的格子的元素显示出来,并改变翻转状态
    //alert(index);
    //alert(numArr)
    var clickEle = $('img' + index);
    clickEle.innerHTML = numArr[index];
    //已点击元素的index
    var transIndex;
    for (var i in trans) {
     if (trans[i] == 1) {
      transIndex = i;
     }
    }
    //2-如果点击的是刚刚已显示元素
    if (transIndex == index) {
     trans[index] = 1;
     return;
    }
    //3-点击新元素 与先前显示元素对比 两种情况-相等 不等
    else {
     if (numArr[transIndex] == numArr[index]) {
      trans[transIndex] = 2;
      trans[index] = 2;
     } else {
      trans[transIndex] = 0;
      trans[index] = 1;
     }
    }
    refreshUI();
   }

根据状态值设置显示的函数refreshUI

根据trans中每个元素的值,改变对应索引的格子的值。注意,如果格子的数据永久显示,需要记录已经永久显示的格子的数量,当等于所有格子数量时,表示已经全部显示。需要判定游戏结束,显示出游戏用时。

function refreshUI() {
    //此处用fore循环会最后存在一个undefined
    //count记录已经被彻底显示的个数
    var count = 0;
    for (var i = 0; i < trans.length; i++) {
     if (trans[i] == 0) {
      $('img' + i).innerHTML = '';
     }
     if (trans[i] == 1) {
      $('img' + i).innerHTML = numArr[i];
     }
     if (trans[i] == 2) {
      $('img' + i).innerHTML = numArr[i]
      count++;
     }
    }
    if (count == collength * rowlength) {
     NEW_START = true;
     var endTime = times;
     $('end').innerHTML = '用时' + endTime + '秒!!游戏结束,点击开始游戏继续';
     $('gametime').innerHTML = endTime + "秒";
    }
   }

通过数组和表格的配合,实现配对游戏,加深对表格创建和数组的运用。处理逻辑和数据显示分离,根据状态值做到不同显示的状态。

以上这篇javascript实现数字配对游戏的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 以对象为索引的关联数组
May 19 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
IE下写xml文件的两种方式(fso/saveAs)
Aug 05 Javascript
jquery 页面滚动到指定DIV实现代码
Sep 25 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
May 21 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
Oct 29 Javascript
4种JavaScript实现简单tab选项卡切换的方法
Jan 06 Javascript
vue绑定class与行间样式style详解
Aug 16 Javascript
微信小程序picker组件下拉框选择input输入框的实例
Sep 20 Javascript
JS中的JSON对象的定义和取值实现代码
May 09 Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 Javascript
通过实例学习React中事件节流防抖
Jun 17 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 #Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
Dec 14 #Javascript
vue项目中的webpack-dev-sever配置方法
Dec 14 #Javascript
利用JQUERY实现多个AJAX请求等待的实例
Dec 14 #jQuery
原生js实现简单的焦点图效果实例
Dec 14 #Javascript
微信小程序实现图片懒加载的示例代码
Dec 13 #Javascript
详解vue-cli 接口代理配置
Dec 13 #Javascript
You might like
PHP小技巧之函数重载
2014/06/02 PHP
PHP strripos函数用法总结
2019/02/11 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
Python 转义字符详细介绍
2017/03/21 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
卫校中专生的自我评价
2014/01/15 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
投资意向协议书
2015/01/29 职场文书
意外事故赔偿协议书
2016/03/22 职场文书
教你用python控制安卓手机
2021/05/13 Python