1

Недавно у меня появилось новогоднее настроение (мда в начале декабря), надеюсь оно как обычно не пропадёт под конец года. Мне как раз нечего было разрабатывать и писать, я решил сделать себе программистский Новый Год на 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, получилось уже лучше, однако как сделать, чтобы он рандомно ставился только в заполненные поля?Результат:

brizgalka
  • 54
  • 5
  • Что именно не понятно? – Lofectr Dec 07 '20 at 07:46
  • как вариант по поробуй это Console.ForegroundColor = Random.Next(IEnumerable); – Dude36 Dec 07 '20 at 07:51
  • 1
    @Dude36 "Brushes": нельзя использовать статические типы в качестве аргументов типов. "IEnumerable" является тип, который недопустим в данном контексте. – brizgalka Dec 07 '20 at 08:08
  • Задать координаты в консоли: Console.SetCursorPosition. Генерировать случайные числа: класс Random. – Alexander Petrov Dec 07 '20 at 09:19
  • Посмотрите это. Там если не всё, то большинство из того что вам нужно, есть. – aepot Dec 07 '20 at 10:39
  • Вот еще один пример работы с консолью. – aepot Dec 07 '20 at 10:45
  • @AlexanderPetrov Я приводил выше код. Куда хотя-бы примерно мне ставить SetCursorPosition? – brizgalka Dec 07 '20 at 12:09
  • @n3rovik вы точно заметили 2 ссылки с примерами, где этот SetCursorPosition используется? Когда вы вызываете этот метод, консоль переставляет курсор в нужные координаты. Когда вы следом вызываете Write или WriteLine консоль пишет что-то на месте курсора. Должно быть просто. Далее, почитайте про циклы for и foreach и while. Без них вам будет очень сложно сделать то что вы делаете. – aepot Dec 07 '20 at 13:02
  • @aepot так а как сделать чтобы оно рандомно ставило курсор только в заполненные области – brizgalka Dec 07 '20 at 13:26
  • в начале кода Random rnd = new Random(), в цикле Console.SetCursorPosition(rnd.Next(Console.BufferWidth),rnd.Next(Console.BufferHeight)). Это выставит курсор в рандомную область экрана. Про "заполненные" не понял. Можете эти рандомы запомнить в переменные и использовать как точку отсчета для рисования. – aepot Dec 07 '20 at 13:29
  • @aepot спасибо, теперь у меня каша на экране) я имел ввиду заполненные ёлкой области, чтобы он только цвета рандомных элементов ёлки менял. – brizgalka Dec 07 '20 at 13:38
  • Понял. Рандомно будет сложно, просто задайте массив координат и перебирайте его в цикле, записывая символ рандомного цвета. Вам же не нужно много точек, иначе помимо того что в рандомном месте надо будет нарисовать другим цветом, то еще потребуется и стереть потом. Point[] points = new Point[] { new Point(5, 11), new Point(2, 12) ... } и так далее. А потом циклом по этому массиву рисуя рандомным цветом. while (!Console.KeyAvailable) { foreach (Point point in points) { Console.SetCursorPosition(point.X, point.Y); Console.Write(...); } Thread.Sleep(500); } Console.ReadKey(true); – aepot Dec 07 '20 at 13:50
  • @aepot стирать мне это не потребуется, т.к. после каждого рандомного расставления точек ёлочка рисуется в консоли по новой и точки продолжают рисоваться. – brizgalka Dec 07 '20 at 14:02
  • @aepot Плюс я выложил код, а на нём видно что вбивать все корды вручную - это садомазахизм – brizgalka Dec 07 '20 at 14:09

1 Answers1

0
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);
    };
}
  • Cпасибо, конечно, но я уже придумал костыль, как работают реальные гирлянды, плюс в твоём коде нельзя менять высоту ёлки хотя у меня если поменять, то мигать будет в других местах – brizgalka Dec 11 '20 at 02:20
  • @n3rovik - покажите свой код, опубликуйте ответ. – Alexander Petrov Dec 11 '20 at 07:17