徐特尔图表是一个小游戏,在5*5的格子上,无序的写着1~25这25个数子,然后再找出来。其实在JS中也就是将25个数进行随机产生然后放到一个表格中。主要分为两部分,一是随机数的产生,还有一部分就是表格的创建。

创建表格

     //拿到页面上用于放表格的容器DIV
var div = document.getElementById('box');
//创建一个表格
var tb = document.createElement('table');
tb.width="150";
tb.border = '1';
tb.style.textAlign = 'center';
tb.style.cssFloat = 'left';
//调用外部的随机数产生函数,返回一个存放无序的1~25的随机数组
var nums = getRandomNum();
for(var i=0; i<5; i++){
var tr = document.createElement('tr');
//将每一行的td用字符串给拼接起来
var td = nums.slice(i*5,i*5+4).join('</td><td>');
//设置行的innerHTML,也就是添加列
tr.innerHTML = '<td>' + td +'</td>';
tb.appendChild(tr);
};
div.appendChild(tb);

创建表格

表格的创建相对比较简单,主要还是在随机数的创建上,下面提供我想到的几种创建随机数的方式

产生随机数

方式一:while + for

外层一个while循环,判断数组的长度是否是25,里面没产生一个随机数就用for遍历一次当前的数组中是否有这个数,如果没有就添加,有就不添加。比较容易理解

    function getRandomNum(){
var nums = [];
var flag=true;//标识位
//参数25个随机数
while(nums.length<25){
flag=true;
var num = Math.floor(Math.random()*25)+1;
for(var i=0;i<nums.length;i++){
if(num == nums[i]){
flag=false;
break;
}
};
if(flag){
nums.push(num);
};
}

方式一代码

方式二:while + for + for

这种方式其实和上面的方式一差不多,不过while循环的时候减半,而且在随机数的参数上也减半。

随机数1~25首位相加,得到的都是数字26,所以我们可以只是产生1~13的随机数,然后再通过26去减去产生的随机数就可以得到剩下的数字

     function getRandomNum(){
var nums2=[];
var flag=true;
while(nums2.length<13){
flag=true;
var num = Math.floor(Math.random()*13) + 1;
for(var i=0;i<nums2.length;i++){
if(nums2[i] == num){
flag = false;
break;
}
}
if(flag){
nums2.push(num);
}
}
//遍历数组中的数,随机添加后半部分
for(var j=0;j<13;j++){
if(nums2[j] == 13){
continue;
}
// nums2.push(26-nums2[j]); //这种方式的不好的就是知道前面的13个数子就能够找出对应的后面的数子
nums2.splice(Math.floor(Math.random()*(nums2.length-13))+13,0,26-nums2[j]);
};

方式二

这种方式在while循环中参数随机数的次数是少了,但是问题就是前半部分都是1~13后半部分是14~25,当然可以该进一下,再用一个数组,然后循环已经存放数据的数组,把数据都随机插入到另外一个空数组中

方式三:for + for

已经知道数组里面存放的是1~25的随机数,内容已经知道,只是需要改变顺序,那就可以先顺序初始化这个数组,然后再改变它的每一项的索引

     function getRandomNum(){
var nums = [];
for(var i=1;i<26;i++){
nums.push(i);
};
for(var i=0;i<nums.length;i++){  //可以只是循环13次就差不多了。
//先把数组中最后一个数给拿出来,然后随机插入到之前的位置
nums.splice(Math.floor(Math.random()* nums.length),0,nums.pop());
}
return nums;
};

方式四:for

从方式三知道,反正每一个数据都需要重新的排序,那就没有比较的去初始化之前的数据了,直接在插入的时候,顺序的插入循环变量i就可以了

     function getRandomNum(){
var nums = [];
for(var i=0; i<26; i++){
//将循环变量i随机的插入到某个位置
nums.splice(Math.floor(Math.random() * (nums.length+1)), 0, i);
}
return nums;
};

第四中方式,可以看出是第三种方式的一个升级而已。还有一种思路就是,在方式三的基础上不改变每一个数据的索引,而是在创建表格的时候,通过循环创建每一个单元格,再随机的从其中抽取一个数据将它填充到单元格中,然后再把这个数从数组中移除掉。这种思路就是在创建表格的时候要循环25次,从循环的次数上来讲都差不多

JS产生徐特尔图表的更多相关文章

  1. JS组件系列——开源免费图表组件:Chart.js

    前言:最近被开源免费得有点上火了,各种组件首先想到的就是是开源否.是否免费.是否和bootstrap风格一致.想着以后做报表肯定要用到图表组件的,于是在Bootstrap中文网上面找到了Chart.j ...

  2. Three.js 火焰效果实现艾尔登法环动态logo 🔥

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 <艾尔登法环>是最近比较火的一款游戏,观察可以发现它的 Log ...

  3. D3.js 做一个简单的图表(条形图)

    柱形图是一种最简单的可视化图标,主要有矩形.文字标签.坐标轴组成. 本文为简单起见,只绘制矩形的部分,用以讲解如何使用 D3 在 SVG 画布中绘图. 一. 画布是什么 前几章的处理对象都是 HTML ...

  4. 可能是史上最强大的js图表库——ECharts带你入门

    PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 StanZhai 两位仁兄让我试试 ECharts ,去主页看到<Why ECharts ?&g ...

  5. 史上最强大的js图表库——ECharts带你入门(转)

    出处:http://www.cnblogs.com/zrtqsk/p/4019412.html PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 Sta ...

  6. Vis.js图表插件

    Vis.js是一款基于JavaScript的可视化图表库,Vis.js不像其他的图表库那样仅仅支持几种常用的数据图表,比如线形图.柱状图.饼图等,Vis.js支持上百种不同类型的可视化图表类型,比如时 ...

  7. 转-——推荐几个web中常用的一些js图表插件 - zccst

    http://www.tuicool.com/articles/bqq2Qn 作者:zccst 我自己用过fusioncharts和highchart. jQuery插件有: TufteGraph f ...

  8. 推荐几个web中常用js图表插件

    作者:zccst 我自己用过fusioncharts和highchart. jQuery插件有: TufteGraph flot js charts jqchart elycharts jquery ...

  9. 图表插件使用汇总(echarts,highchairts)

    1.echarts之饼图显示数字 option={ title: { text: '某站点用户访问来源', subtext: '纯属虚构', x: 'center' }, tooltip: { tri ...

随机推荐

  1. NServiceBus消息重播

    https://docs.particular.net/tutorials/message-replay/ 链接:https://pan.baidu.com/s/1KdWvpfZYZ2wUivkt3B ...

  2. ExportGrid Aspose.Cells.dll

    using Aspose.Cells; using Aspose.Words; using System; using System.Collections; using System.Collect ...

  3. 使用 IntelliTrace 调试应用程序

    IntelliTrace 如何能够大幅改善您的日常开发活动,并提升您快速轻松诊断问题的能力,而不必重新启动应用程序和使用传统的“中断-单步执行-检查”技术进行调试.介绍了组织如何能够通过在测试过程中收 ...

  4. NOIP水题测试(2017082501)

    日常水题测试又来了! 以后答案都以单题形式公布. 下面看今天的水题: 时间限制:5小时 题目一:无法形容的水 题目二:比上一题还水 题目三:一元三次方程求解 题目四:单词接龙 题目五:统计单词个数 题 ...

  5. kbmmw ORM 对象定义语法简析

    使用kbmmw 的ORM 一定先要了解ORM 的对象定义语法. 下面简单说一下 // kbmMW_Table - Define a table. 定义一个表 // Must be used on cl ...

  6. 43.Charles抓包(iOS的http/https请求)

    Charles安装 HTTP抓包 HTTPS抓包     1. Charles安装 官网下载安装Charles: https://www.charlesproxy.com/download/ 2. H ...

  7. 2019.01.19 codeforces896C.Willem, Chtholly and Seniorious(ODT)

    传送门 ODTODTODT出处(万恶之源) 题目简述: 区间赋值 区间加 区间所有数k次方和 区间第k小 思路:直接上ODTODTODT. 不会的点这里 代码: #include<bits/st ...

  8. 定时调度系列之Quartz.Net详解(转)

    出处:https://www.cnblogs.com/yaopengfei/p/9216229.html 一. 背景 我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提 ...

  9. hashchange事件

    h5新增了hashchange事件,以便在URL参数列表(及URL中‘#’号后面的所有字符串),发生变化时通知开发人员. 之所以要添加这个事件,是因为在Ajax应用中,开发人员经常要利用URL参数列表 ...

  10. SQL编写-谁和谁是好朋友

    problem: 用户表 姓名 张三 李四 王五       好友表   姓名 好友姓名 张三 李四 张三 王五 李四 张三 用户表里面姓名必须在好友表里面互加为好友,请问如何找出还没有加为好友的姓名 ...