发表于: 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);
}
}
评论