Требуется написать программу которая будет выводит цепочку падающих символов. Первый снизу символ должен быть белый, второй зеленый, остальные темно-зеленые. Проблема в том, что цепочку падающих символов вывел, а как смещать цепочку символов вниз так и не понял. Если я правильно понял то, надо установить курсор в начало строки и потом уже как-то смещать её вниз.
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();
}
}
}
Создадим такой класс Символа
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);
}
}
Не знаю, правильно ли я вас понял, но по крайней мере у вас теперь есть от чего плясать.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Возникла проблема с запросом естественного соединенияСоздал запрос при создании DataAdapter select * from table1 natural join table2, но команда dataAdapter
Такая проблема, делаю игру на Unity , игра хоррор и в ней есть ИИ, который ищет игрока по всему домуЕще в игре есть двери
Нужно зашифровать строку алгоритмом RSA при этом используя ключ в xml формате(созданный в C#), как это реализовать в nodejs?