Вывод на консоль цепочек падающих символов (как в фильме Матрица) - C#
Формулировка задачи:
Приветствую всех форумчан!
Дано: нуб (т.е. Я)
Нубу дано задание:
Program.cs
Одну строку вроде с горем пополам отображает (надо бы сделать ещё проверку дошла ли цепочка до конца экрана или нет, но это не главное).
Главный вопрос -
Создайте программу, которая будет выводить на экран цепочки падающих символов. Длина каждой цепочки задается случайно. Первый символ цепочки – белый, второй символ – светло-зеленый, остальные символы темно-зеленые. Во время падения цепочки, на каждом шаге, все символы меняют свое значение. Дойдя до конца, цепочка исчезает и сверху формируется новая цепочка.
Что было задумано - обьявить класс FallenString в задачу которого входило бы создание и прорисовка одной строки, в Main-е создать десяток экземпляров класса FallenString, потом создать поток и повесить медаль на грудь за успешно выполненное задание. Но лыжи никуда не поехали)) FallenString.csusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Matrix
{
class FallenString
{
private int stringLength;
private int positionX; // координата х начала падающей строки
private int positionY; // координата y
public int StringLength
{
get { return this.stringLength; }
}
public int PositionX
{
get { return positionX; }
}
public int PositionY
{
get { return positionY; }
}
public void DrawString() // пошаговое отображние строки начиная с координат (positionX, positionY) с изменением символов
{
Random rnd = new Random();
for (int i = 0; i < this.stringLength; i++)
{
for (int j = 0; j < i + 1; j++)
{
SetSymbolColor(i, j);
Console.SetCursorPosition(this.positionX, this.positionY + j);
Console.Write("{0}", Convert.ToChar(rnd.Next(100, 126)));
Thread.Sleep(rnd.Next(500));
}
}
}
public void SetSymbolColor(int val1, int val2)
{
if (val2 == val1)
Console.ForegroundColor = ConsoleColor.White;
else if (val2 == val1 - 1)
Console.ForegroundColor = ConsoleColor.Green;
else
Console.ForegroundColor = ConsoleColor.DarkGreen;
}
// конструктор
public FallenString(int val1, int val2)
{
Random rnd = new Random();
this.stringLength = rnd.Next(10, 20);
this.positionX = val1;
this.positionY = val2;
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Matrix
{
class Program
{
static void Main(string[] args)
{
Random rnd = new Random();
FallenString str = new FallenString(rnd.Next(0, Console.WindowWidth), rnd.Next(0, Console.WindowHeight));
ThreadStart write = new ThreadStart(str.DrawString);
Thread thread = new Thread(write);
thread.Start();
Console.ReadKey();
}
}
}как получить в консоли несколько "падающих строк"?
Заранее большое спасибо за помощь!Решение задачи: «Вывод на консоль цепочек падающих символов (как в фильме Матрица)»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Matras
{
class MyClass
{
private object locker = new object();
public bool[] kaplia = new bool[10]; //Console.WindowWidth
public int[] dlinaKapli = new int[10];
public int[] ostalos = new int[10];
public char[] simBol = new char[] {'Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G',
'H','J','K','L','Z','X','C','V','B','N','M','1','2','3','4',
'5','6','7','8','9','0','Й','Ц','У','К','Е','Н','Г','Ш','Щ',
'З','Х','Ъ','Ф','Ы','В','А','П','Р','О','Л','Д','Ж','Э','Я',
'Ч','С','М','И','Т','Ь','Б','Ю','№','@','#','%','$','&','?'};
private void NextLine()
{
if (Console.CursorLeft == 10)
{
Console.WriteLine("");
//Thread.Sleep(500);
}
}
public void Potok(object x)
{
Random kap = new Random();
Random dlina = new Random();
Random c = new Random();
while (true)
{
lock (locker)
{
if (this.kaplia[(int)x] == false)
{
if (kap.Next(0, 100) < 10)
{
this.kaplia[(int)x] = true;
this.dlinaKapli[(int)x] = dlina.Next(3, 10);
this.ostalos[(int)x] = dlinaKapli[(int)x];
Console.ForegroundColor = ConsoleColor.White;
Console.Write((int)x);//simBol[c.Next(0, 59)]+
Console.ForegroundColor = ConsoleColor.Red;
this.ostalos[(int)x] = this.ostalos[(int)x] - 1;
NextLine();
}
else
{
Console.Write(" ");
NextLine();
}
}
else
{
if (this.dlinaKapli[(int)x] - this.ostalos[(int)x] == 1) //(true)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write((int)x);
Console.ForegroundColor = ConsoleColor.Red;
this.ostalos[(int)x] = this.ostalos[(int)x] - 1;
NextLine();
}
else
{
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.Write((int)x);
Console.ForegroundColor = ConsoleColor.Red;
this.ostalos[(int)x] = this.ostalos[(int)x] - 1;
this.kaplia[(int)x] = (this.ostalos[(int)x] == 0) ? false : true;
NextLine();
}
}
}
}
}
}
class Program
{
static void Main()
{
MyClass instance = new MyClass();
Thread thread;
for (int i = 0; i < 10 - 1; i++)
{
thread = new Thread(new ParameterizedThreadStart(instance.Potok));
thread.Start(i);
}
Console.ReadKey();
}
}
}