zoukankan      html  css  js  c++  java
  • JS产生徐特尔图表

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

    创建表格

     1     //拿到页面上用于放表格的容器DIV
     2     var div = document.getElementById('box');
     3     //创建一个表格
     4     var tb = document.createElement('table');
     5     tb.width="150";
     6     tb.border = '1';
     7     tb.style.textAlign = 'center';
     8     tb.style.cssFloat = 'left';
     9     //调用外部的随机数产生函数,返回一个存放无序的1~25的随机数组
    10     var nums = getRandomNum();
    11     for(var i=0; i<5; i++){
    12         var tr = document.createElement('tr');
    13         //将每一行的td用字符串给拼接起来
    14         var td = nums.slice(i*5,i*5+4).join('</td><td>');
    15         //设置行的innerHTML,也就是添加列
    16         tr.innerHTML = '<td>' + td +'</td>';
    17         tb.appendChild(tr);
    18     };
    19     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去减去产生的随机数就可以得到剩下的数字

     1     function getRandomNum(){
     2         var nums2=[];
     3         var flag=true;
     4         while(nums2.length<13){
     5             flag=true;
     6             var num = Math.floor(Math.random()*13) + 1;
     7             for(var i=0;i<nums2.length;i++){
     8                 if(nums2[i] == num){
     9                         flag = false;
    10                         break;
    11                 }
    12             }
    13             if(flag){
    14                     nums2.push(num);
    15             }
    16         }
    17         //遍历数组中的数,随机添加后半部分
    18         for(var j=0;j<13;j++){
    19             if(nums2[j] == 13){
    20                 continue;
    21             }
    22         //    nums2.push(26-nums2[j]);    //这种方式的不好的就是知道前面的13个数子就能够找出对应的后面的数子
    23             nums2.splice(Math.floor(Math.random()*(nums2.length-13))+13,0,26-nums2[j]);
    24         };
    方式二

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

    方式三:for + for

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

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

    方式四:for

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

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

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

  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/qigang/p/3871135.html
Copyright © 2011-2022 走看看