为数组生成无限颜色

Generate Infinite Colors for Array

我想创建一个充满随机颜色的数组,它永远不会 运行 生成随机颜色的随机球。因此,我希望每个球都有不同的颜色,而不是只有 5 种颜色(蓝色、红色、绿色、黄色、白色)可供选择。

whole code:

我已经试过了:

var randomColor = Math.floor(Math.random()*16777215).toString(16);

这里我只为每个球获得一种随机颜色。我也已经使用了循环,这可能是正确的答案,但我只是错误地实现了它。

JS:

var ballArray = [];
var colorArray = ['blue','red','green','yellow','white'];
var gravity = 0.9;

function drawBall() {
    for (var i = 0; i < ballArray.length; i++) {
        var ball = ballArray[i];
        ctx.fillStyle = ball.color;
        ctx.beginPath();
        ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2);
        ctx.fill();
        ctx.closePath();
        
        ball.x += ball.xd;
        if (ball.x + ball.radius > screenWidth || ball.x - ball.radius < 0) {
            ball.xd *= -1;
        }

我不确定我是否理解正确。你想让每个球有不同的随机颜色而不重复颜色吗?或者只是修复第二个 JSFiddle 代码以生成带有随机数的球而不闪烁?

如果您希望每个球都有一个唯一的颜色,您可以将已经使用过的颜色存储在一个数组中,并检查数组中是否包含新生成的颜色。为此,我将使用此代码:

var ballArray = [];
var usedColors = [];
var gravity = 0.9;

function generateNewColor() {
      var letters = '0123456789ABCDEF';
      var colorIncluded = true;

      while (colorIncluded == true) {
        var color = '#';
        // generate new color
        for (var i = 0; i < 6; i++) {
          color += letters[Math.floor(Math.random() * 16)];
        }
        // check if the color is already used
        var used = false;
        for(var i = 0; i < usedColors.length; i++){
          if(usedColors[i] == color){
            used = true;
            break;
          }
        }
        if(!used){ break; }
      }
      usedColors.push(color);
      return color;
}

不过这种方法对于大量生成的球不是很有效。

要修复代码中的闪烁,只需删除 Ball() 函数中 returns 随机数的函数:

this.color = getRndColor();

并在 drawBall() 函数中使用生成的颜色:

ctx.fillStyle = ball.color;

直接定义你的randomColor,替换

this.color = colorArray[randomNumber(0, colorArray.length - 1)];

this.color = '#' + Math.floor(Math.random()*16777215).toString(16);