Вывод на консоль цепочек падающих символов (как в фильме Матрица) - C#

Узнай цену своей работы

Формулировка задачи:

Приветствую всех форумчан! Дано: нуб (т.е. Я) Нубу дано задание:

Создайте программу, которая будет выводить на экран цепочки падающих символов. Длина каждой цепочки задается случайно. Первый символ цепочки – белый, второй символ – светло-зеленый, остальные символы темно-зеленые. Во время падения цепочки, на каждом шаге, все символы меняют свое значение. Дойдя до конца, цепочка исчезает и сверху формируется новая цепочка.

Что было задумано - обьявить класс 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;
            
        }
    }
}
Program.cs
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();
 
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы