public void Reprint()
 {
     ///Shrnutí
     ///Metoda, která smaže a znovu vytiskne menu. Používá se v případě, že uživatel zmenšil nedopatřením okno, aby se mu povedlo srovnat vytištěné objekty na svá místa.
     Console.BackgroundColor = ConsoleColor.Black;
     Console.Clear();                  //Vymaže Consoli
     DiffSwitcher.PrintGraphics(true); //Vytiskne znovu grafiky
     PrintMenu(false);                 //Víme že se nacházíme někde mezi nastaveními, proto není jméno zvýrazněno
 }
 public void PrintMenu(bool higlightName)
 {
     ///Shrnutí
     ///Vytiskne znovu menu, přijímá bool, podle kterého určuje zda má být jméno zvýrazněno
     DiffSwitcher.PrintMenuName(higlightName); //Nejprve se vytiskne jméno
     DiffSwitcher.PrintGraphics(false);        //Následně grafiky bez obdélníků (tedy hlavně druhý a třetí řádek menu)
     foreach (GameSetting setting in GameSettings)
     {
         setting.Print(false, Reprint); //Následně se vytisknou všechny GameSettingy z arraye v menu
     }
     foreach (GameSetting colourSetting in DiffSwitcher.Colours)
     {
         colourSetting.Print(false, Reprint); //A všechny barvy z arraye společného pro všechna menu
     }
 }
        private static bool EnableSwitch()
        {
            ///Shrnutí
            ///Tato metoda umožní hráči dělat akce v tomto menu
            ///Vrací bool, podle toho zda má hráč zájem hrát znovu (true: hrát znovu/false: konec hry)
            foreach (IGraphic label in Labels) //Nejprve se vytisknou všechny grafické objekty,
            {
                if (label == null)             //které nejsou null
                {
                    continue;
                }
                label.Print(label.GetType() == (typeof(Border)), Reprint); //Oba bordery se vytisknou se silnými svislými liniemi. Pokud při tištění není hra nastavena na celou obrazovku, počká se na opravu od uživatele, vymaže se Console a vytiskne se menu znovu
            }
            ConsoleKey keypressed;                                         //Budeme opět číst klávesu od uživatele

            do                                                             //Začne do while cyklus, který trvá dokud uživatel nezmáčkne Enter
            {
                for (int x = 0; x < 4; x++)                                //Nejprve se vytisknou všechny grafické objekty,
                {
                    if (SwitchableLabels[x] == null)                       //které nejsou null
                    {
                        continue;
                    }
                    SwitchableLabels[x].Print(x == ChosenLabel, Reprint); //Vybrané tlačítko se vytiskne zvýrazněně (bílou barvou). Pokud při tištění není hra nastavena na celou obrazovku, počká se na opravu od uživatele, vymaže se Console a vytiskne se menu znovu
                }
                keypressed = Console.ReadKey(true).Key;                   //Nyní přečteme klávesu od uživatele
                switch (keypressed)
                {
                case ConsoleKey.UpArrow:                                               //Pokud uživatel zmáčkne šipku nahoru
                    if (ChosenLabel != 0 && SwitchableLabels[ChosenLabel - 1] != null) //Ověří se, zda již nejsme úplně nahoře (Buď se ChosenLabel rovná nule nebo se tlačítko o jedna výš rovná null)
                    {
                        ChosenLabel--;                                                 //Pokud nejsme, sníží se ChosenLabel o jedna
                    }
                    break;

                case ConsoleKey.DownArrow:    //Pokud uživatel zmáčkne šipku dolů
                    if (ChosenLabel != 3)     //Pokud se nenacházíme již úplně dole (na pozici tři), zvýší se ChosenLabel o jedna
                    {
                        ChosenLabel++;
                    }
                    break;

                case ConsoleKey.R:     //Pokud uživatel zmáčkne R zavolá se metoda Reprint
                    try
                    {
                        Reprint();                      //Pokusí se vymazat menu a vytisknout jej znovu
                    }
                    catch (ArgumentOutOfRangeException) //Pokud nastane situace, že něco by se mělo tisknout mimo obrazovku
                    {
                        Program.WaitForFix();           //Vyzve uživatele, aby zvětšil hru na celou obrazovku a nepustí ho dál dokud tak neučiní
                        Reprint();                      //Znovu se pokusí vymazat menu a vytisknout jej znovu
                    }
                    break;
                }
            } while (keypressed != ConsoleKey.Enter); //Když hráč zmáčkne Enter tak se pokračuje podle toho, které tlačítko bylo vybráno
            switch (ChosenLabel)
            {
            case 0:                                                                                                                                                                                                                                                            //Na pozici nula může být (v případě výhry) SaveHighscore (Uložit skóre), nebo (v případě prohry) View Minefield (Zobrazit minové pole)
                if (GameWon)                                                                                                                                                                                                                                                   //Pokud byla hra vyhraná, tak se jde uložit skóre
                {
                    SwitchableLabels[0].Print(false, Reprint);                                                                                                                                                                                                                 //Přetiskne toto tlačítko bez zvýraznění
                    SaveHighscore();                                                                                                                                                                                                                                           //Zavolá se metoda SaveHighscore(), která uloží hru
                    SwitchableLabels[0] = null;                                                                                                                                                                                                                                //Toto tlačítko se změní na null, aby nebylo možné toto skóre ukládat znovu
                    Labels[5]           = null;
                    ChosenLabel         = 1;                                                                                                                                                                                                                                   //Chosen Label se automaticky změní na 1, aby nebylo vybrané tlačítko nula
                }
                else                                                                                                                                                                                                                                                           //Pokud byla hra prohraná, tak se zobrazí znovu Hrací plocha s vyznačenými minami vlaječkou
                {
                    if (((Console.LargestWindowWidth - 5) > Console.WindowWidth) || ((Console.LargestWindowHeight - 3) > Console.WindowHeight))                                                                                                                                //Nejprve zkontroluje zda je hra zobrazena na celou obrazovku, jinak by se mohly grafiky špatně vytvořit
                    {
                        Program.WaitForFix();                                                                                                                                                                                                                                  //Případně počká na opravu od uživatele
                    }
                    GameControls.PlayedGame.PrintMinefield(true);                                                                                                                                                                                                              //Vytiskne se znovu hrací plocha, ale všechny políčka s minou se označí vlaječkou
                    (new Border(new Coordinates(GameControls.PlayedGame.Minefield[0, 0].Position, -2, -1), GameControls.PlayedGame.VerticalTiles + 2, 2 * (GameControls.PlayedGame.HorizontalTiles + 2), ConsoleColor.Black, ConsoleColor.White, false)).Print(true, Reprint); //Vytvoří se rámeček okolo hrací plochy a okamžitě se vytiskne. Pokud při tištění není hra nastavena na celou obrazovku, počká se na opravu od uživatele, vymaže se Console a vytiskne se menu znovu
                    (new Border(0, 1, Console.WindowHeight - 1, Console.WindowWidth, ConsoleColor.Black, ConsoleColor.Gray, false)).Print(true, Reprint);                                                                                                                      //Vytvoří se rámeček okolo obrazovky a okamžitě se vytiskne. Pokud při tištění není hra nastavena na celou obrazovku, počká se na opravu od uživatele, vymaže se Console a vytiskne se menu znovu
                    Console.ReadKey();                                                                                                                                                                                                                                         //Hrací plocha zůstane zobrazená dokud uživatel nezmáčkne klávesu
                    Console.BackgroundColor = ConsoleColor.Black;                                                                                                                                                                                                              //Poté se celá Console vyčistí
                    Console.Clear();
                }
                return(EnableSwitch());                           //A vrátíme se zpátky na začátek této metody

            case 1:                                               //Pokud je zmáčknuto Play Again, tak se chceme vrátit zpátky do menu, kde nastavujeme hru
                foreach (GameMenu menu in DiffSwitcher.GameMenus) //U všech menu nastavíme ChosenLine zpátky na nulu
                {
                    if (menu == null)                             //Pokud samozřejmě není menu == null
                    {
                        continue;
                    }
                    menu.ChooseLine(0);
                }
                Console.BackgroundColor = ConsoleColor.Black;
                Console.Clear();                                                                                                  //Console se vyčistí a přejdeme zpátky do DiffSwitcheru
                DiffSwitcher.PrintGraphics(true);                                                                                 //DiffSwitcher vytiskne všechny své grafiky
                DiffSwitcher.SwitchTo(DiffSwitcher.ChosenMenu, true);                                                             //Přejdeme na vybrané menu
                GameControls.PlayedGame = DiffSwitcher.EnableSwitch();                                                            //Zavoláme metodu EnableSwitch() pomocí, které vytvoříme hru, kterou vložíme do GameControls.PlayedGame()
                return(true);                                                                                                     //Vrátí se true a hráč poté může hru rovnou začít hrát

            case 2:                                                                                                               //Pokud je zmáčknuto Play Again with the same parameters, tak se okamžitě vytvoří hra se stejnými parametry
                Console.BackgroundColor = ConsoleColor.Black;
                Console.Clear();                                                                                                  //Vyčistí se Console
                (new PositionedText("Loading...", ConsoleColor.Black, (Console.WindowWidth - 10) / 2, 12)).Print(false, Reprint); //Vytvoří a vytiskne text Loading... U větších minefieldů může tvorba hry chvilku trvat, čili aby bylo jasné, že se nejdná o chybu a skutečně se něco děje
                int[] parameters = GameControls.PlayedGame.GetParameters();                                                       //Získají se parametry ze hry, která byla právě dohrána
                GameControls.PlayedGame = new Game(parameters);                                                                   //A vytvoří se pomocí nich nová hra
                return(true);                                                                                                     //Vrátí se true a hráč poté může hru rovnou začít hrát

            case 3:                                                                                                               //Pokud je zmáčknuto Quit, tak se program ukončí
                Environment.Exit(0);                                                                                              //Program se ukončí s kódem 0
                return(false);
            }
            return(false);
        }