【问题标题】:How to Randomly pick a color from an array of colors in Java?如何从Java中的颜色数组中随机选择一种颜色?
【发布时间】:2014-12-26 21:25:38
【问题描述】:

我是第一次学习 Java 和编程。我正在使用BlueJ 环境。

我正在编写一个程序来绘制多边形。我想在画完每条线后改变颜色。为此,我想我会创建一个颜色数组,然后使用伪随机数生成器生成一个值,该值将用作从数组中获取颜色的索引。我已经包含了来自构造函数方法的代码 sn-p,因为有人告诉我,我需要在构造函数中创建数组才能使其工作。

需要注意的是,我已经导入了 java.awt.Color 以及 java.util.Random。我也加入了

private Color[] colors;

作为一个字段。

public PictureMaker()
{
    world = new TurtleWorld(500, 500, "Picture Maker");
    fred = new Turtle();
    //Allocate the size of the array
    colors = new Color[7];

    //Initialize the values of the array
    colors[0] = new Color(Color.red);
    colors[1] = new Color(Color.blue);
    colors[2] = new Color(Color.yellow);
    colors[3] = new Color(Color.green);
    colors[4] = new Color(Color.black);
    colors[5] = new Color(Color.pink);
    colors[6] = new Color(Color.orange);
}

下面是绘制多边形的实际方法的代码。

/**
 * This method takes sides (int) as input and draws a polygon with that number of sides.
 */
public void drawPolygon(int sides)
{
    world.dropIn(fred);
    fred.penDown();
    int angle = 360/sides;
    int linesDrawn = 0;


    while(linesDrawn < sides)
    {
        Random r = new Random();
        int minColor = 0;
        int maxColor = 10;
        int R = r.nextInt(maxColor-minColor) + minColor;
        fred.right(angle);
        fred.forward(60);
        linesDrawn += 1;

    }
}

我还没有包含任何东西来从数组中获取颜色,因为我无法让数组工作。

我收到一条错误消息Incompatible types: java.awt.Color cannot be converted to int

我不知道为什么它不起作用。

我希望这是有道理的。

如果您需要澄清,请告诉我,我是使用此网站的新手。

【问题讨论】:

  • 你有什么问题?
  • 请注意,您正在为 Javascript 创建 sn-ps,这与 Java 非常不同。
  • 我马上看到的一个问题是您正在生成一个介于 1-10 之间的数字,而您的数组只有 7 个元素...
  • 你从哪里得到错误?
  • @brso05 谢谢,我在更改颜色数量后忘记更新了

标签: java bluej


【解决方案1】:

Color 字段已经属于 Color 类型 - 您无需调用 Color 构造函数。编译器抱怨是因为没有 Color 构造函数接受 Color 参数。我建议您也使用更常规命名的大写字母 - 为简单起见,使用数组初始化器初始化数组:

colors = new Color[]
{
    Color.RED, Color.BLUE, Color.YELLOW, Color.GREEN,
    Color.BLACK, Color.PINK, Color.ORANGE
};

【讨论】:

  • 谢谢,这成功了。我仍在为上面一行的数组分配内存。这还有必要吗?或者我可以在你的答案中的方括号之间放一个 7 来分配内存吗?
  • @user2331411:你根本不需要 7 - 我提供的代码是 all 你需要的......它将分配一个正确的数组大括号内元素的大小。
  • 另一个快速的问题。为什么这必须在构造方法中完成,而不是在 drawPolygon() 方法中完成?
  • @user2331411:那么为什么每次调用drawPolygon 时都想这样做?
  • 好的,我想我明白了。当从 PictureMaker 类创建对象时会执行一次,但如果它在 drawPolygon 方法中,则每次都执行一次?
【解决方案2】:

你的数组应该是这样的:

Color[] colors = new Color[7];

    //Initialize the values of the array
    colors[0] = Color.red;
    colors[1] = Color.blue;
    colors[2] = Color.yellow;
    colors[3] = Color.green;
    colors[4] = Color.black;
    colors[5] = Color.pink;
    colors[6] = Color.orange;

个别颜色没有构造函数,所以new Color是未定义的。

至于随机挑选:

Color c = colors[randInt(0, colors.length-1)]; 

randInt 是这个方法:

public static int randInt(int min, int max) {
    Random rand = new Random();
    int randomNum = rand.nextInt((max - min) + 1) + min;

    return randomNum;
}

【讨论】:

  • rand 设为全局变量,并使用Color c = colors[rand.nextInt(colors.length)]; 会更容易吗?
  • 我认为难度没有任何增加。当然,像你说的那样做会更快,但是如果操作需要项目中其他特定范围内的随机数,该方法只允许重用。
  • 所以这基本上是将随机生成器抽象成它自己的方法,然后调用它来为 Color 类型的变量 c 赋值?
  • 是的,同时如果出现这种情况,您还可以选择负数(从不使用数组)。您可以像 Color c = colors[rand.nextInt(colors.length)]; 一样执行此操作,这将完成相同的任务。
  • 谢谢,我不知道如何给你声望,你可以点击两次勾号吗?
【解决方案3】:

我觉得你的数组应该是这样的

//Initialize the values of the array
    colors[0] = Color.red;
    colors[1] = Color.blue;

等等……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 2014-06-12
    • 2017-03-10
    • 2012-08-24
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多