Смена цвета в случайных позициях в C#

Недавно у меня появилось новогоднее настроение (мда в начале декабря), надеюсь оно как обычно не пропадёт под конец года. Мне как раз нечего было разрабатывать и писать, я решил сделать себе программистский Новый Год на C#. Я вывел ёлочку под восьмибитную версию Jingle Bells в консоль, вот код:

using System;
using System.Media;
using System.Threading;


namespace HappyNewYear
{
    class Program
    {

        static void Main(string[] args)
        {
            Random rand = new Random();
            // Врубает музыку.
            SoundPlayer jingleBells = new SoundPlayer();
            jingleBells.SoundLocation = Environment.CurrentDirectory + @"/JingleBells.wav";
            jingleBells.PlayLooping();
            Console.WriteLine("С новым годом!\n");
            StarLayer();
            TreeLayer(3);
            Console.ForegroundColor = ConsoleColor.DarkYellow;
            Console.WriteLine("     000 ");
            Console.WriteLine("     000 ");
            Console.WriteLine("     000 ");
            while (true)
            {
                for (byte i = 0; i < 5; i++)
                {
                    Console.SetCursorPosition(rand.Next(1, 9), rand.Next(6, 20));
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write("0");
                }
                Thread.Sleep(400);
                Console.Clear();
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine("С новым годом!\n");
                StarLayer();
                TreeLayer(3);
                Console.ForegroundColor = ConsoleColor.DarkYellow;
                Console.WriteLine("     000 ");
                Console.WriteLine("     000 ");
                Console.WriteLine("     000 ");
            }
            Console.ReadKey();
        }

        // Выводит слой ёлочки
        static void TreeLayer(byte amount)
        {
            
            for (byte i = 0; i < amount; i++) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("      0  ");
                Console.WriteLine("     000 ");
                Console.WriteLine("    00000 ");
                Console.WriteLine("   0000000 ");
                Console.WriteLine("  000000000 ");
                Console.WriteLine(" 00000000000 ");
            }
        }

        // Выводит звезду-пизду
        static void StarLayer()
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("      0  ");
            Console.WriteLine("    00000  ");
            Console.WriteLine("     000 ");
            Console.WriteLine("    0   0 ");
        }
    }
}

В общем я хочу чтобы ёлочка в рандомных местах меняла цвет на рандомный, типа красный, синий, жёлтый и так постоянно, желательно в такт музыке. Я знаю как менять цвет консоли, но вот вышеуказанную задачу просто не потяну.

UPD: По совету Александра Петрова) Я добавил в свой код SetCursorPosition, получилось уже лучше, однако как сделать, чтобы он рандомно ставился только в заполненные поля?Результат:


Ответы (1 шт):

Автор решения: Alexander Petrov
static void Main()
{
    Console.CursorVisible = false;
    Console.BackgroundColor = ConsoleColor.Black;
    Console.Clear();

    var tree = new string[]
    {
        "     0     ",
        "    000    ",
        "   00000   ",
        "  0000000  ",
        " 000000000 ",
        "00000000000",
        "     0     ",
        "    000    ",
        "   00000   ",
        "  0000000  ",
        " 000000000 ",
        "00000000000",
        "     0     ",
        "    000    ",
        "   00000   ",
        "  0000000  ",
        " 000000000 ",
        "00000000000"
    };

    var random = new Random();

    while (true)
    {
        for (int y = 0; y < tree.Length; y++)
        {
            for (int x = 0; x < tree[y].Length; x++)
            {
                Console.ForegroundColor = (ConsoleColor)random.Next(1, 16);
                Console.SetCursorPosition(x, y);
                Console.Write(tree[y][x]);
            }
            Console.WriteLine();
        }
        Thread.Sleep(500);
    };
}
→ Ссылка