C# 随机化3种颜色
我正在做一个突破游戏,我想让砖块得到一个随机的背景色。 现在,我的砖块被各种颜色填满:红色、绿色、蓝色、黄色、粉色和其他所有颜色 我想做的只是随机地将三种颜色随机排列:蓝色、黄色和绿色 这就是我现在拥有的:C# 随机化3种颜色,c#,winforms,random,colors,C#,Winforms,Random,Colors,我正在做一个突破游戏,我想让砖块得到一个随机的背景色。 现在,我的砖块被各种颜色填满:红色、绿色、蓝色、黄色、粉色和其他所有颜色 我想做的只是随机地将三种颜色随机排列:蓝色、黄色和绿色 这就是我现在拥有的: private Random rnd = new Random(); Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256)); bricks[x, y].BackColor = ran
private Random rnd = new Random();
Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));
bricks[x, y].BackColor = randomColor;
我已经搜索和尝试了许多不同的东西,但没有任何效果!我觉得这样做可能很简单,但不知何故却无法真正做到。我想把这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;
}
编写自己的方法并调用它。生成一个随机数,例如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;
}
为什么不把你选择的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#中的随机性对你的游戏来说足够好;)
编辑:该死,太晚了:D为什么不把你选择的3种颜色映射到数字{0,1,2},然后做一个简单的切换语句
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#中的随机性对你的游戏来说足够好;)
编辑:该死,太晚了:D免责声明:我是个新手(对C来说)
(建议进行colorArr.Length编辑)
使用数组存储将从中拾取的所有颜色。接下来,从数组中调用一个随机元素。免责声明:我是一个新手(对于C#)
(建议进行colorArr.Length编辑)
使用数组存储将从中拾取的所有颜色。接下来,从数组中调用一个随机元素。关于注释: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)];
}
在不使用线程的情况下测试它。Sleep()
暂停:for (int i = 0; i < 100; i++)
{
Console.WriteLine(GetColor().Name);
}
为每个元素获得不同深浅的红色
、绿色
和黄色
的方法略有不同:(可能应该稍微调整一下以避免半灰色)。
这是此方法生成的随机调色板:
关于评论:
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)];
}
在不使用线程的情况下测试它。Sleep()
暂停:for (int i = 0; i < 100; i++)
{
Console.WriteLine(GetColor().Name);
}
为每个元素获得不同深浅的红色
、绿色
和黄色
的方法略有不同:(可能应该稍微调整一下以避免半灰色)。
这是此方法生成的随机调色板:
您可以将其作为
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)];
}
}
但是,这意味着您必须使用Color
的实例调用它,例如
var colour = new Color().GetRandomRgb();
而Color
是一个密封的类(意味着我们不能从中继承),您可能需要这样做
public static Color GetRandomRgb()
{
return rgb[random.Next(rgb.Length)];
}
你可以用它打电话
var colour = ColorExtensions.GetRandomRgb();
您可以将其作为
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)];
}
}
但是,这意味着您必须使用Color
的实例调用它,例如
var colour = new Color().GetRandomRgb();
而Color
是一个密封的类(意味着我们不能从中继承),您可能需要这样做
public static Color GetRandomRgb()
{
return rgb[random.Next(rgb.Length)];
}
你可以用它打电话
var colour = ColorExtensions.GetRandomRgb();
如果您使用
rnd.Next(colorArr.Length)
,则在添加或删除颜色时无需考虑它。如果您使用rnd.Next(colorArr.Length)
,则在添加或删除颜色时无需考虑它。或者整个应用程序都有一个随机性源…--顺便说一句,newrandom(DateTime.Now.millis秒)
理论上比不指定种子差一万倍。没有给定的种子环境。使用TickCount
。看见还有虽然你通常只看到100到200个刻度之间的“跳跃”。@Corak,正如我所说,这只是一个例子。但是你可以在没有种子的情况下进行随机测试,可以暂停,也可以不暂停,看看结果如何。我知道在一个闭环中创建一个新的Random
实例是不好的。也因为你所说的原因。但你的结论是,使用毫秒会让它变得更好,这是错误的。在您的示例中,使它更好的是Thread.Sleep(1)
但是(正如您所说的),如果您需要大量的随机值,这将破坏性能。例如,最好有一个static Random Random=new Random()在任何方法之外编码>并使用该方法的频率和速度。如果需要随机数,Random
类是非常好的。它在图像上不安全,但这里不需要这种安全。同样,获得“一次又一次相同值”的问题仅仅是因为大量的随机
实例是在一个闭环中创建的。如果只处理一个实例,就不会有这个问题。试试这个:public静态类RandomTest{private static Random Random=new Random();public