Перемешать 3 цвета - PullRequest
0 голосов
/ 12 мая 2018

Я делаю Breakout Game и хочу, чтобы кирпичи получили случайный BackColor.Прямо сейчас у меня есть кирпичи, которые заполняются всеми типами цветов: красным, зеленым, синим, желтым, розовым и всеми другими.

Что я хочу сделать, так это только получить случайное, чтобы рандомизировать только три цвета:синий, желтый и зеленый.

Это то, что у меня сейчас есть:

private Random rnd = new Random();

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

bricks[x, y].BackColor = randomColor;

Я искал и пробовал много разных вещей, но ничего не помогло!Я чувствую, что это может быть просто сделать, но как-то не могу до него добратьсяЯ думал о создании списка из 3 цветов и попытался рандомизировать список, но это не сработало!

Ответы [ 5 ]

0 голосов
/ 12 мая 2018

Вы можете написать это как расширение 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();
0 голосов
/ 12 мая 2018

О комментариях:
Использование Thread.Sleep() является лишь примером для проверки результатов локального экземпляра класса Random при использовании в замкнутом цикле.
Возможно, вы получите серию с одинаковым результатом. Или все одинаковые значения.

Здесь, в качестве теста, я вставляю небольшую паузу (1 мс) при возврате случайного цвета, чтобы цвета каждый раз выбирались с использованием нового семени (почти). Проверьте это без паузы.

Реализация по умолчанию, использующая один экземпляр класса 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 Random random = new Random();

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

Немного другой способ получить разные оттенки Red, Green и Yellow для каждого элемента:
(Вероятно, следует немного подправить, чтобы избежать полусерого цвета).

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;
}

Это случайная палитра, которую генерирует этот метод:

enter image description here

0 голосов
/ 12 мая 2018

почему бы не сопоставить 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

0 голосов
/ 12 мая 2018

Отказ от ответственности: я новичок (в 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)];

(редактирование colorArr.Length, предложенное Corak )

Использование массива для хранениявсе цвета, из которых будет выбран.Затем из массива вызывается случайный элемент.

0 голосов
/ 12 мая 2018

Напишите свой собственный метод и вызовите его вместо этого. Создайте случайное число, например, 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;
  }
...