Body zdarma Java týden
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Matrix

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Matrix neboli „Matrix Rain“ je program, který náhodně generuje znaky a vypisuje je do „consolové aplikace“. Podrobný popis programu a vysvětlení je přiložený u zdrojového kódu.

Ukázka kódu:

/* nastavení názvu console */
Console.Title = "Matrix";

/* vypnutí kurzoru */
Console.CursorVisible = false;

/* nastavení barvy textu */
Console.ForegroundColor = ConsoleColor.DarkGreen;

/* nastavení pozice zleva na 0 */
Console.WindowLeft = 0;

/* nastavení pozice shora na 0 */
Console.WindowTop = 0;

/* (nastavení výšky console)... výška console = výška vyrovnávací paměti = "maximální" výška console */
Console.WindowHeight = Console.BufferHeight = Console.LargestWindowHeight;

/* (nastavení šířky console)... šířka console = šířka vyrovnávací paměti = "maximální" šířka okna */
Console.WindowWidth = Console.BufferWidth = Console.LargestWindowWidth;

.
.
.

Galerie

Program byl vytvořen v roce 2012.

 

Stáhnout

Staženo 862x (27.33 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Program pro vás napsal Eldest
Avatar
Jak se ti líbí článek?
5 hlasů
Autor se zabývá C# a PHP (HTML, CSS, JS, jQuery, MySQL).
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
Regulární výrazy v C# .NET
Aktivity (1)

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:27.10.2012 12:18

Opravdu pěkné :) Opravil jsem ti to pípání, stačí do poslední větvě podmínky pro znak vyndat z výběru znak #183:

/* vrátíme znak (nahodne cislo) */
int i = rnd.Next(32, 255);
if (i == 183)
    i = 200;
return (char)i;

Tak to kdyžtak pak uprav v kódu, nechci ti do toho hrabat :)

Editováno 27.10.2012 12:20
Odpovědět 27.10.2012 12:18
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Eldest
Redaktor
Avatar
Eldest:27.10.2012 12:40

Díky, nemohl jsem na to přijít.

 
Odpovědět 27.10.2012 12:40
Avatar
matesax
Redaktor
Avatar
Odpovídá na Eldest
matesax:27.10.2012 13:21

Mírně bych to upravil:

using System;

namespace Matrix
{
    class Program
    {
        private static Random random = new Random();
        private static bool time = false;

        static void Main(string[] args)
        {
            Console.Title = "Matrix";
            Console.CursorVisible = false;
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            Console.WindowLeft = Console.WindowTop = 0;
            Console.WindowHeight = Console.BufferHeight = Console.LargestWindowHeight;
            Console.WindowWidth = Console.BufferWidth = Console.LargestWindowWidth;

            int width, height;

            int[] a, b;

            Initialize(out width, out height, out a, out b);

            while (true)
            {
                MatrixSteep(width, height, a, b);

                System.Threading.Thread.Sleep(10);

                if (Console.KeyAvailable && Console.ReadKey().Key == ConsoleKey.F5)
                    Initialize(out width, out height, out a, out b);
            }
        }

        private static void Initialize(out int width, out int height, out int[] a, out int[] b)
        {
            int height1, height2;

            height = Console.WindowHeight;

            height1 = height / 2;

            height2 = height1 / 2;

            width = Console.WindowWidth - 1;

            a = new int[width];

            b = new int[width];

            Console.Clear();

            for (int x = 0; x < width; x++)
            {
                a[x] = random.Next(height);

                b[x] = random.Next(height2 * (x % 11 != 10 ? 2 : 1), height1 * (x % 11 != 10 ? 2 : 1));
            }
        }

        private static void MatrixSteep(int width, int height, int[] a, int[] b)
        {
            time = !time;

            for (int x = 0; x < width; x++)
            {
                if (x % 11 == 10)
                {
                    if (!time)
                        continue;

                    Console.ForegroundColor = ConsoleColor.White;
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.DarkGreen;

                    Console.SetCursorPosition(x, InBoxY(a[x] - 2 - (b[x] / 40 * 2), height));

                    Console.Write(RandomChar());

                    Console.ForegroundColor = ConsoleColor.Green;
                }

                Console.SetCursorPosition(x, a[x]);

                Console.Write(RandomChar());

                a[x] = InBoxY(a[x] + 1, height);

                Console.SetCursorPosition(x, InBoxY(a[x] - b[x], height));

                Console.Write(' ');
            }
        }

        private static int InBoxY(int n, int height)
        {
            n = n % height;

            return n < 0 ? n + height : n;
        }

        private static char RandomChar()
        {
            switch (random.Next(5))
            {

                case 0:

                    return (char)('0' + random.Next(10));

                case 2:

                    return (char)('a' + random.Next(27));

                case 4:

                    return (char)('A' + random.Next(27));

                default:

                    int i = random.Next(32, 255);

                    if (i == 183)
                        i = 200;

                    return (char)i;
            }

        }
    }
}
 
Odpovědět 27.10.2012 13:21
Avatar
Eldest
Redaktor
Avatar
Odpovídá na matesax
Eldest:27.10.2012 13:27

Ok, díky. :)

 
Odpovědět 27.10.2012 13:27
Avatar
Kit
Redaktor
Avatar
Odpovídá na Eldest
Kit:27.10.2012 13:36
/* height2 = height1 (děleno) 2 */
height2 = height1 / 2;

Takhle se komentáře určitě nedělají. V komentáři by mělo být spíš uvedeno proč dělíš dvěma. Například že v této výšce přepneš barvu nebo tak nějak. Už ze zápisu je patrné, že se dělí dvěma, tato informace v komentáři být nemusí.

Zkus si představit, že by sis to rozmyslel a chtěl dělit třemi. Musel bys to upravovat na dvou místech a to je častým zdrojem chyb.

Odpovědět 27.10.2012 13:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Eldest
Redaktor
Avatar
Odpovídá na Kit
Eldest:27.10.2012 13:42

Ok, díky příště se určitě budu snažit toto napravit. :) Důvod proč jsem psal ty vysvětlivky jako pro první třídu základní školy, byl ten, protože jsem to psal pro spolužáky SŠ, kteří C# skoro vůbec neumí (i když z něho asi budou maturovat :D).

 
Odpovědět 27.10.2012 13:42
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Eldest
David Čápka:27.10.2012 13:46

Mě se tam moc nezamlouvají ty modifikátory out, je jich tam nějak moc. Jak vlastně děláš ty mezery? Je to fakt dobrý.

Odpovědět 27.10.2012 13:46
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:27.10.2012 13:55

Potřeba modifikátorů out vznikla při vytvoření nevhodné konstrukce cyklu while (true). Jednoduchou úpravou je možné se tohoto nešvaru zbavit.

Odpovědět 27.10.2012 13:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Eldest
Redaktor
Avatar
Odpovídá na David Čápka
Eldest:27.10.2012 13:57

Ok, říkám dělal jsem to i trochu pro spolužáky, tak jsem použil out, protože to znají ze školy. Jinak hodně jsem používal i Google :D Jinak je to řádek 156. (ty mezery)

/* vypsání mezery */
Console.Write(' ');
 
Odpovědět 27.10.2012 13:57
Avatar
Kit
Redaktor
Avatar
Odpovídá na Eldest
Kit:27.10.2012 14:01

Měli jsme na mysli out mezi formálními parametry metody Initialize(). Zbav se jich.

Odpovědět 27.10.2012 14:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Eldest
Redaktor
Avatar
Odpovídá na Kit
Eldest:27.10.2012 14:04

Ok

 
Odpovědět 27.10.2012 14:04
Avatar
matesax
Redaktor
Avatar
Odpovídá na Eldest
matesax:27.10.2012 14:14

Pravda - out se na toto nehodí:

using System;

namespace Matrix
{
    class Program
    {
        private static Random random = new Random();
        private static bool time = false;
        private static int width, height;
        private static int[] a, b;

        static void Main(string[] args)
        {
            Console.Title = "Matrix";
            Console.CursorVisible = false;
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            Console.WindowLeft = Console.WindowTop = 0;
            Console.WindowHeight = Console.BufferHeight = Console.LargestWindowHeight;
            Console.WindowWidth = Console.BufferWidth = Console.LargestWindowWidth;

            Initialize();

            while (true)
            {
                MatrixSteep(width, height, a, b);

                System.Threading.Thread.Sleep(10);

                if (Console.KeyAvailable && Console.ReadKey().Key == ConsoleKey.F5)
                    Initialize();
            }
        }

        private static void Initialize()
        {
            int height1, height2;

            height = Console.WindowHeight;

            height1 = height / 2;

            height2 = height1 / 2;

            width = Console.WindowWidth - 1;

            a = new int[width];

            b = new int[width];

            Console.Clear();

            for (int x = 0; x < width; x++)
            {
                a[x] = random.Next(height);

                b[x] = random.Next(height2 * (x % 11 != 10 ? 2 : 1), height1 * (x % 11 != 10 ? 2 : 1));
            }
        }

        private static void MatrixSteep(int width, int height, int[] a, int[] b)
        {
            time = !time;

            for (int x = 0; x < width; x++)
            {
                if (x % 11 == 10)
                {
                    if (!time)
                        continue;

                    Console.ForegroundColor = ConsoleColor.White;
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.DarkGreen;

                    Console.SetCursorPosition(x, InBoxY(a[x] - 2 - (b[x] / 40 * 2), height));

                    Console.Write(RandomChar());

                    Console.ForegroundColor = ConsoleColor.Green;
                }

                Console.SetCursorPosition(x, a[x]);

                Console.Write(RandomChar());

                a[x] = InBoxY(a[x] + 1, height);

                Console.SetCursorPosition(x, InBoxY(a[x] - b[x], height));

                Console.Write(' ');
            }
        }

        private static int InBoxY(int n, int height)
        {
            n = n % height;

            return n < 0 ? n + height : n;
        }

        private static char RandomChar()
        {
            switch (random.Next(5))
            {

                case 0:

                    return (char)('0' + random.Next(10));

                case 2:

                    return (char)('a' + random.Next(27));

                case 4:

                    return (char)('A' + random.Next(27));

                default:

                    int i = random.Next(32, 255);

                    if (i == 183)
                        i = 200;

                    return (char)i;
            }

        }
    }
}
 
Odpovědět 27.10.2012 14:14
Avatar
Eldest
Redaktor
Avatar
Eldest:27.10.2012 14:18

Máte pravdu :) S vámi profesionálama se dá těžko rovnat :D

 
Odpovědět 27.10.2012 14:18
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:27.10.2012 14:33

Moc se mi to líbí, je to pěkně zpracovaný. Ale když zmenším velikost okna aby to nebylo tak velký tak se to celý rozbije :-D obraz si lítá jak chce a je to nekoukatelný.

 
Odpovědět 27.10.2012 14:33
Avatar
Eldest
Redaktor
Avatar
Odpovídá na Fugiczek
Eldest:27.10.2012 14:41

No, asi je to proto, že je tam nastavené, aby to okno bylo, co největší a ten program s tím prostě počítá a podle toho se řídí. Šlo by to každopádně přenastavit.

 
Odpovědět 27.10.2012 14:41
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Eldest
Fugiczek:27.10.2012 14:45

Bylo by dobré tu velikost okna fixnout aby s ní nešlo pohybovat, nebo při každé změně rozměru přepočítávat to co je důležité na to zobrazení. Myslím že fixnout velikost je jednoduší. Ale toto jsou maličkosti. Máš to pěkný ;-)

 
Odpovědět 27.10.2012 14:45
Avatar
Eldest
Redaktor
Avatar
Eldest:27.10.2012 14:51

Ok, pokusím se to opravit + i to co psali kolegové. :)

 
Odpovědět 27.10.2012 14:51
Avatar
Eldest
Redaktor
Avatar
Odpovídá na Fugiczek
Eldest:27.10.2012 15:03

Problém je v tom, že u console nevím jak se nastavuje, aby nešlo hýbat s velikostí okna.

 
Odpovědět 27.10.2012 15:03
Avatar
Maxfx
Redaktor
Avatar
Maxfx:27.10.2012 15:23

to znam z netu

Odpovědět 27.10.2012 15:23
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Eldest
David Čápka:27.10.2012 19:27

No je vidět, že Matrix tu evidentně uspěl :) Mezerami jsem myslel jak to funguje, že se ti tam taky hezky tvoří ta prázdná místa, nebo to dělá samo? Nepopsal bys tu ten algoritmus slovy? Abych to nemusel vyčítat ze zdrojáku? Možná by to bylo super i napsat do toho článku, asi nejsem jediný, koho zajímá, jak ten rain funguje.

Odpovědět 27.10.2012 19:27
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Eldest
Redaktor
Avatar
Eldest:27.10.2012 19:37

No ty vlastně generuješ náhodné znaky, které vypisuješ na dané pozici v consoli Console.SetCur­sorPosition() a jedním z těch znaků je mezera ' ' viz. ř.156, až bude trochu času, tak ten program více rozepíšu, jak přesně funguje. :) (Pokud pár dnů vydržíš, totálně totiž nestíhám :D)

Editováno 27.10.2012 19:40
 
Odpovědět 27.10.2012 19:37
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Eldest
David Čápka:27.10.2012 19:43

Vydržím :)

Odpovědět 27.10.2012 19:43
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Eldest
Redaktor
Avatar
Odpovídá na David Čápka
Eldest:27.10.2012 19:46

Díky :D, ale myslím, že ty jsi na rozdíl ode mě, na takové úrovni, že jen mrkneš a vidíš! :D Tak na co takový profík tutoriál"? :D

 
Odpovědět 27.10.2012 19:46
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Eldest
David Čápka:27.10.2012 19:53

Já jsem zvyklý na objektový kód, tohle bych musel luštit :) Ale není to tak špatné, měl by ses podívat na objekty, jsou důležité.

Odpovědět 27.10.2012 19:53
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Eldest
Redaktor
Avatar
Odpovídá na David Čápka
Eldest:27.10.2012 19:55

Něco málo o nich vím, ale spíš je neumím používat (přesněji jsem líný je používat)...., v druhé verzi Matrixu + tutoriál to bude už přes třídy atd. :)

Editováno 27.10.2012 19:58
 
Odpovědět 27.10.2012 19:55
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Eldest
David Čápka:27.10.2012 20:02

Dobře, těším se :)

Odpovědět 27.10.2012 20:02
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 26 zpráv z 26.