Падающие символы

265
29 января 2018, 03:55

Требуется написать программу которая будет выводит цепочку падающих символов. Первый снизу символ должен быть белый, второй зеленый, остальные темно-зеленые. Проблема в том, что цепочку падающих символов вывел, а как смещать цепочку символов вниз так и не понял. Если я правильно понял то, надо установить курсор в начало строки и потом уже как-то смещать её вниз.

using System;
namespace Task1
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rand = new Random();
            int lenghtStr = rand.Next(1, 11);
            char[] column = new char[lenghtStr];
            for (int i = 0; i < lenghtStr; i++)
            {
                column[i] = (char)rand.Next('A', 'Z');
            }
            for (int i = 0; i < lenghtStr; i++)
            {
                if (i == (lenghtStr - 1))
                {
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine(column[i]);
                }
                else if (i == (lenghtStr - 2))
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine(column[i]);
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.DarkGreen;
                    Console.WriteLine(column[i]);
                }
            }
            Console.SetCursorPosition(0, 0);
            Console.ReadKey();
        }
    }
}
Answer 1

Создадим такой класс Символа

class Sign
{
    //генератор будем использовать в этом классе и снаружи
    public static Random RandomGen = new Random();
    /// <summary>
    /// Получение случайного знака
    /// </summary>
    /// <returns></returns>
    private char GetSign()
    {
        int t = RandomGen.Next(10);
        if (t <= 2)
            return (char)('0' + RandomGen.Next(10));
        else if (t <= 4)
            return (char)('a' + RandomGen.Next(27));
        else if (t <= 6)
            return (char)('A' + RandomGen.Next(27));
        else
            return (char)(RandomGen.Next(32, 255));
    }
    /// <summary>
    /// Отображение случайного символа белого цвета
    /// </summary>
    /// <param name="left">позиция слева</param>
    /// <param name="top">позиция от верха</param>
    public void ShowWhiteSign(int left, int top)
    {
        Console.ForegroundColor = ConsoleColor.White;
        Console.SetCursorPosition(left, top);
        Console.Write(GetSign());
    }
    /// <summary>
    /// Отображение случайного символа зеленого цвета
    /// </summary>
    /// <param name="left">позиция слева</param>
    /// <param name="top">позиция от верха</param>
    public void ShowGreenSign(int left, int top)
    {
        Console.ForegroundColor = ConsoleColor.Green;
        Console.SetCursorPosition(left, top);
        Console.Write(GetSign());
        Console.ForegroundColor = ConsoleColor.White;
    }
    /// <summary>
    /// Отображение случайного символа темного зеленого цвета
    /// </summary>
    /// <param name="left">позиция слева</param>
    /// <param name="top">позиция от верха</param>
    public void ShowDarkGreenSign(int left, int top)
    {
        Console.ForegroundColor = ConsoleColor.DarkGreen;
        Console.SetCursorPosition(left, top);
        Console.Write(GetSign());
        Console.ForegroundColor = ConsoleColor.White;
    }
    /// <summary>
    /// Отображение пробела в нужном месте
    /// </summary>
    /// <param name="left">позиция слева</param>
    /// <param name="top">позиция от верха</param>
    public void ShowSpaceSign(int left, int top)
    {
        Console.SetCursorPosition(left, top);
        Console.Write(' ');
    }
}

Класс Отображателя такой

class SignsShower
{
    private int _heightWindow;
    private int _widthWindow;
    private int[] _widthPosSimple;
    private int[] _widthPosAddition;
    private readonly Sign _sign = new Sign();
    //ctor
    public SignsShower() : this((Console.WindowWidth - 1), Console.WindowHeight)
    { }
    /// <summary>
    /// Отображатель символов
    /// </summary>
    /// <param name="windowWidth">ширина консольного окна минус 1</param>
    /// <param name="windowHeight">высота консольного окна</param>
    public SignsShower(int windowWidth, int windowHeight)
    {
        Initialization(windowWidth, windowHeight);
    }
    private void Initialization(int windowWidth, int windowHeight)
    {
        //получаем высоту окна
        _heightWindow = windowHeight;
        int h1 = _heightWindow / 2; //половина высоты
        int h2 = _heightWindow / 4; //четверть высоты
        //ширина окна
        _widthWindow = windowWidth;
        //два массива размером в ширину окна
        _widthPosSimple = new int[_widthWindow];
        _widthPosAddition = new int[_widthWindow];
        //заполнение массивов случайными числами
        for (int i = 0; i < _widthWindow; i++)
        {
            _widthPosSimple[i] = Sign.RandomGen.Next(_heightWindow);
            int k = (i % 11 != 10) ? 2 : 1;
            int min = h2 * k;
            int max = h1 * k;
            _widthPosAddition[i] = Sign.RandomGen.Next(min, max);
        }
    }
    /// <summary>
    /// Отображение символов в случайных позициях с необх.цветом
    /// </summary>
    public void SignShow()
    {
        for (int i = 0; i < _widthWindow; i++)
        {
            if (_widthPosSimple[i] < 10)
            {
                //отображение темного символа
                _sign.ShowDarkGreenSign(i, _widthPosSimple[i]);
            }
            else if (_widthPosSimple[i] < 25)
            {
                //отображение зеленого символа
                _sign.ShowGreenSign(i, _widthPosSimple[i]);
            }
            else
            {
                //отображаем белый символ
                _sign.ShowWhiteSign(i, _widthPosSimple[i]);
            }
            //сдвигаем координату по высоте для отображения в след. цикле вызова SignShow()
            _widthPosSimple[i] = CheckNextHeightPosition(_widthPosSimple[i] + 1, _heightWindow);
            //пробельный символ
            int next = _widthPosSimple[i] - _widthPosAddition[i];
            int nextPos = CheckNextHeightPosition(next, _heightWindow);
            _sign.ShowSpaceSign(i, nextPos);
        }
    }
    /// <summary>
    /// Проверка значения след.позиции
    /// </summary>
    /// <param name="next">значение след.положения по высоте</param>
    /// <param name="height">общая допустимая высота</param>
    /// <returns></returns>
    private int CheckNextHeightPosition(int next, int height)
    {
        next = next % height;
        if (next < 0)
        {
            return next + height;
        }
        else
        {
            return next;
        }
    }
}

Теперь включим в работу эти классы так

static void Main(string[] args)
    {
        //отображатель
        SignsShower signsShower = new SignsShower();
        //готовим консоль
        Console.Clear();
        Console.CursorVisible = false;
        //в бесконечном цикле с вычисляемой задержкой отображаем
        int ms = 0;
        while (true)
        {
            //засекаем время
            DateTime timeMark = DateTime.Now;
            //отображаем символы
            signsShower.SignShow();
            //задержка
            ms = 10 - (int)((TimeSpan)(DateTime.Now - timeMark)).TotalMilliseconds;
            if (ms > 0) System.Threading.Thread.Sleep(ms);
        }
    }

Не знаю, правильно ли я вас понял, но по крайней мере у вас теперь есть от чего плясать.

READ ALSO
SQL естественное соединение

SQL естественное соединение

Возникла проблема с запросом естественного соединенияСоздал запрос при создании DataAdapter select * from table1 natural join table2, но команда dataAdapter

214
C# открытие двери ИИ (Unity3D)

C# открытие двери ИИ (Unity3D)

Такая проблема, делаю игру на Unity , игра хоррор и в ней есть ИИ, который ищет игрока по всему домуЕще в игре есть двери

239
Node.js encrypt RSA[XML]

Node.js encrypt RSA[XML]

Нужно зашифровать строку алгоритмом RSA при этом используя ключ в xml формате(созданный в C#), как это реализовать в nodejs?

210
Невозможно определить формат uri

Невозможно определить формат uri

Собственно, вот код -

157