发表于: 2019-12-04 14:02:29

1 1075


今日完成:

昨天那个颜色重复没有考虑到,

虽然重复到的可能性很低、

任务一的需求理解错了,三个格子颜色变化,其他格子颜色恢复。

在change方法最开始对上次的设置的style置空;

if (change_box1.length !== 0) {
   list[change_box1[0]].style.backgroundColor = "";
   list[change_box2[0]].style.backgroundColor = "";
   list[change_box3[0]].style.backgroundColor = "";
}


把随机生成的格子list下标、rgb看作一个对象change_box的属性,因为这个对象属性都是数字,所以用数组处理会比较简单。

颜色不能重复就是要求下次执行change方法时,新生成的change_box不能与上次的三个change_box重复。

因为与任何一个重复都会产生格子颜色没有发生变化的原因。

举个例子吧:

上次变化的三个格子【1,r1,g1,b1】 【3,r2,g2,b2】【0,r3,g3,b3】

这次变化的某一个格子:【x,r,g,b】: x代表是第几个格子

【x,r,g,b】与 上面三个数组中任何一个都不能相等,才能保证,两次变化的格子颜色不同。

如果相等,重新随机rgb就可以了。x是可以相等的。

只比较两次颜色值的话,也不行呐,因为格子位置也在变化,需要考虑进去。




将rgb的生成提取成一个方法:

//生成RGB
function mk_RGB() {

   var r = randomNum(0, 254);
   var g = randomNum(0, 254);
   var b = randomNum(1, 255);
   return [r, g, b];
}

因为格子原来的颜色rgb为(255,255,0)

所以取随机数时范围需要调整,使其不会生成和原色相同的RGB

对颜色去重的操作:

var rgb1 = mk_RGB();
console.log(mk_RGB());
var new_cb = [div1, rgb1[0], rgb1[1], rgb1[2]];
// var new_cb = [0,0,0,0];
if (change_box1 != null && change_box1.length !== 0) {
   while (new_cb.toString() === change_box1.toString() ||
   new_cb.toString() === change_box2.toString() ||
   new_cb.toString() === change_box3.toString()) {
       rgb1 = mk_RGB();
       new_cb = [div1, rgb1[0], rgb1[1], rgb1[2]];
       
   }
}
change_box1 = new_cb;

可以debug测试一下:

给new_cb取一固定的值

在while中也取一相同的值:

var rgb1 = mk_RGB();
console.log(mk_RGB());
// var new_cb = [div1, rgb1[0], rgb1[1], rgb1[2]];
var new_cb = [0,0,0,0];
if (change_box1 != null && change_box1.length !== 0) {
   while (new_cb.toString() === change_box1.toString() ||
   new_cb.toString() === change_box2.toString() ||
   new_cb.toString() === change_box3.toString()) {
       rgb1 = mk_RGB();
       // new_cb = [div1, rgb1[0], rgb1[1], rgb1[2]];
       new_cb = [0,0,0,0];

   }
}
change_box1 = new_cb;



这是最极端的情况下了,随机到的值一直都是相同的,他就死循环了。

一般情况下,当随机到的四个数字与上次的三个对象有重复了,进while循环里重新随机一组RGB就好了(能够重复的几率极低 1/4,228,250,624‬)。

再把while循环里的随机恢复,模拟一次重复:


可以看到它随机一次就跳出了循环。

看这个gif图感觉不太对,有时只有两个变色了。有BUG

又把随机格子下标的方法debug了,果然有问题。

问题在下面这段代码

if (third===second){
   while (third===second){
       third = randomNum(0,8);
   }
}

if (third===first){
   while (third===first) {
       third = randomNum(0,8);
   }
}

第二个和第三个判重并修正后,再第二个和第一个判重修正。

这是有问题的,因为给third赋了两次值,最后一次赋值有可能会是的third与second重复,但最后一次赋值并没有third与second的判重。所以修改代码为下:


if (third === second || third === first) {
   while (third === second || third === first) {

       third = randomNum(0, 8);
   }
}



返回列表 返回列表
评论

    分享到