Вывод на консоль цепочек падающих символов (как в фильме Матрица) - C#
Формулировка задачи:
Приветствую всех форумчан!
Дано: нуб (т.е. Я)
Нубу дано задание:
Program.cs
Одну строку вроде с горем пополам отображает (надо бы сделать ещё проверку дошла ли цепочка до конца экрана или нет, но это не главное).
Главный вопрос -
Создайте программу, которая будет выводить на экран цепочки падающих символов. Длина каждой цепочки задается случайно. Первый символ цепочки – белый, второй символ – светло-зеленый, остальные символы темно-зеленые. Во время падения цепочки, на каждом шаге, все символы меняют свое значение. Дойдя до конца, цепочка исчезает и сверху формируется новая цепочка.
Что было задумано - обьявить класс FallenString в задачу которого входило бы создание и прорисовка одной строки, в Main-е создать десяток экземпляров класса FallenString, потом создать поток и повесить медаль на грудь за успешно выполненное задание. Но лыжи никуда не поехали)) FallenString.cs
Листинг программы
- using 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();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д