徐特尔图表是一个小游戏,在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. 20180613更新 leetcode刷题

    最近就是忙工作项目 工作间隙就刷了刷LEETCODE 所以没啥更新 // 1111111.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #i ...

  2. cxf 介绍

    CXF 编辑     目录 1Apache CXF 简介 关于Apache CXF 功能特性 项目目标 2Apache CXF特点 灵活部署 支持多种编程语言 代码生成     1Apache CXF ...

  3. 关于 construct object opp

    constructor 定义和用法 constructor 属性返回对创建此对象的数组函数的引用. 语法 object.constructor 实例 例子 1 在本例中,我们将展示如何使用 const ...

  4. 通过flask中的Response返回json数据

    使用flask的过程中,发现有时需要生成一个Response并返回.网上查了查,看了看源码,找到了两种办法: from flask import Response, json Response(jso ...

  5. 可以用WebRTC来做视频直播吗?

    https://www.zhihu.com/question/25497090   作者:韦易笑链接:https://www.zhihu.com/question/25497090/answer/72 ...

  6. 2018.11.17 codechef PRIMEDST(点分治+fft)

    传送门 fftfftfft一眼题(其实最先想到的是nttnttntt,wawawa了几次之后发现模数不够大果断弃疗写fftfftfft) 我们点分治统计答案的个数. 考虑现在已经统计出了到当前点的所有 ...

  7. c#多线程编程实战(原书第二版)文摘

    Thread t = new Thread(PrintNumbersWithDelay); t.Start(); t.Join(); 但我们在主程序中调用了t.Join方法,该方法允许我们等待直到线程 ...

  8. (4)4 larger-than-life lessons from soap operas

    https://www.ted.com/talks/kate_adams_4_larger_than_life_lessons_from_soap_operas/transcript 00:12In ...

  9. Codeforces Round #538 (Div. 2) C 数论 + 求b进制后缀零

    https://codeforces.com/contest/1114/problem/C 题意 给你一个数n(<=1e8),要你求出n!在b进制下的后缀零个数(b<=1e12) 题解 a ...

  10. IntelliJ IDEA 2017版 spring-boot2.0.4的yml配置使用

    一.必须配置字端两个 server: port: 8080 servlet: context-path: /demo 二.两种mvc转换springboot,一种是注解,一种就是.yml或proper ...