【问题标题】:Randomize 3 Colors随机化 3 种颜色
【发布时间】:2018-10-22 16:50:17
【问题描述】:

我正在制作一个突围游戏,我希望砖块获得随机背景色。 现在我的砖块里填满了各种颜色:红色、绿色、蓝色、黄色、粉红色和所有其他颜色。

我想做的只是让随机数只随机化三种颜色:蓝色、黄色和绿色。

这就是我现在拥有的:

private Random rnd = new Random();

Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));

bricks[x, y].BackColor = randomColor;

我已经搜索并尝试了许多不同的东西,但没有任何效果!我觉得这可能很简单,但不知何故无法真正做到。我想过列出 3 种颜色的列表并尝试随机化列表,但没有成功!

【问题讨论】:

    标签: c# winforms random colors


    【解决方案1】:

    免责声明:我是 C# 新手。

    private Random rnd = new Random();
    Color[] colorArr = {Color.FromArgb(0, 0, 255), Color.FromArgb(255, 255, 0), Color.FromArgb(0, 255, 0)};
    bricks[x, y].BackColor = colorArr[rnd.Next(colorArr.Length)];
    

    Corak建议的colorArr.Length编辑)

    使用一个数组来存储将要从中挑选的所有颜色。接下来,从数组中调用一个随机元素。

    【讨论】:

    • 如果使用rnd.Next(colorArr.Length),则在添加或删除颜色时无需考虑。
    【解决方案2】:

    关于cmets:
    Thread.Sleep() 的使用只是一个示例,用于在闭环中测试 Random 类的本地实例的结果。
    您可能会得到一系列相同的结果。或所有相同的值。


    在这里,作为测试,我在返回随机颜色时插入了一个小暂停 (1ms),因此每次(几乎)都会使用不同的种子来选择颜色。测试一下,不要停顿。

    使用 Random 类的单个实例的默认实现可以产生类似的结果。

    private Color[] Colors = { Color.Red, Color.Yellow, Color.Green};
    
    private Color GetColor()
    {
        Random random = new Random(DateTime.Now.Millisecond);
        Thread.Sleep(1);
        return Colors[random.Next(0,3)];
    }
    

    在没有Thread.Sleep() 暂停的情况下进行测试:

    for (int i = 0; i < 100; i++)
    {
        Console.WriteLine(GetColor().Name);
    }
    

    或者,更准确地说,使用静态字段:

    private static Random random = new Random();
    
    private Color GetColor()
    {
        return Colors[random.Next(0,3)];
    }
    

    为每个元素获取不同深浅的RedGreenYellow 的方法略有不同:
    (可能应该稍微调整一下以避免半灰色)。

    private Color GetColor2()
    {
        Color color = Colors[random.Next(0, 3)];
        switch (color.Name)
        {
            case "Yellow":
                color = Color.FromArgb((160 + random.Next(0, 96)), (160 + random.Next(0, 96)), 0);
                break;
            case "Red":
                color = Color.FromArgb((160 + random.Next(0, 96)), 0, 0);
                break;
            case "Green":
                color = Color.FromArgb(0, (160 + random.Next(0, 96)), 0);
                break;
        }
        return color;
    }
    

    这是此方法生成的随机调色板:

    【讨论】:

    • Or 有整个应用程序的 一个 随机源... - 顺便说一句。 new Random(DateTime.Now.Millisecond)(理论上)比不指定种子差一万倍。在没有给定种子的情况下使用 Environment.TickCount。见Recerence Source Random.cs。还有10000 Ticks per Millisecond。 -- 虽然你通常只看到 100 到 200 个刻度之间的“跳跃”。
    • @Corak 正如我所说,这只是一个例子。但是你可以在没有种子的情况下测试 Random,有或没有暂停,看看会发生什么。然后面对我发布的内容。
    • 知道在闭环中创建Random 的新实例是不好的。由于你所说的原因,也是。但是你的结论是,使用毫秒会以某种方式使它变得更好是错误的。 does 在您的示例中使其变得更好的是Thread.Sleep(1);,但是(正如您所说)如果您需要任何大量随机值,这会降低性能。 much 更好的是,例如在任何方法之外使用 one static Random random = new Random(); 并使用 that 您想要的频率和快速连续性.
    • 如果你想要随机数,Random 类非常好。它不是加密安全,但这里不需要这种安全性。同样,“一遍又一遍地获取相同值”的问题只是,因为Random 的许多实例是在一个闭环中创建的。如果您只使用 一个 实例,您不会 遇到这个问题。试试这个:public static class RandomTest { private static Random random = new Random(); public static void Test() { for(i = 1; i &lt; 1000; i++){ Console.WriteLine(random.Next()); } } } 告诉我,你连续得到多少个“相同”的数字。
    • 好吧,如果你的意思是“注意你如何使用 Random()”我同意。我把它作为对Random 类本身是如何实现的批评。 -- 很抱歉忽略了你的“Or ...”部分。
    【解决方案3】:

    编写您自己的方法并调用它。生成一个随机数,例如 0,1,2 并使用开关返回正确的颜色。例如:

    Color randomColor;
    int random = rnd.Next(3)
      switch (random)
      {
          //red
          case 1:
              randomColor = Color.FromArgb(255, 0, 0);
              break;
          //green
          case 2:
              randomColor = Color.FromArgb(0, 255, 0);
              break;
          //blue
          default:
              randomColor = Color.FromArgb(0, 0, 255);
              break;
      }
    

    【讨论】:

      【解决方案4】:

      为什么不将您选择的 3 种颜色映射到数字 {0,1,2},然后做一个简单的 switch 语句?

      int color;
      color = rnd.Next(3);
      switch(color) {
      case 0:
          // do something here for the first color
          break;
      case 1:
          // do something.. you get the idea
          break;
      case 2:
          break;
      }
      

      然后只是希望 C# 中 Random 的随机性对你的游戏来说足够好;)

      编辑:该死,太晚了:D

      【讨论】:

        【解决方案5】:

        你可以把它写成Color的扩展

        public static class ColorExtensions
        {
            private static Color[] rgb = 
                {Color.FromArgb(0, 0, 255), Color.FromArgb(255, 255, 0), Color.FromArgb(0, 255, 0)};
            private static Random random = new Random();
            public static Color GetRandomRgb(this Color color)
            {
                return rgb[random.Next(rgb.Length)];
            }
        }
        

        但是,since you can't yet extend a class by adding static methods,这意味着您必须使用 Color 的实例来调用它,例如

        var colour = new Color().GetRandomRgb();
        

        Color 是一个密封类(意味着我们不能从它继承),你可能想做

        public static Color GetRandomRgb()
        {
            return rgb[random.Next(rgb.Length)];
        }
        

        你可以打电话给谁

        var colour = ColorExtensions.GetRandomRgb();
        

        【讨论】:

          猜你喜欢
          • 2017-09-11
          • 1970-01-01
          • 2014-06-12
          • 2016-07-17
          • 2015-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-31
          相关资源
          最近更新 更多