Пример #1
0
        public static bool LoadTheGame()
        {
            ///Shrnutí
            ///Tato metoda dá hráči na výběr z uložených souborů ve složce AppData/Roaming/Minesweeper/SavedGames/ a načte vybraný soubor
            ///Vrací bool, podle toho zda byla hra úspěšně načtena nebo ne
            if (((Console.LargestWindowWidth - 5) > Console.WindowWidth) || ((Console.LargestWindowHeight - 3) > Console.WindowHeight)) //Nejprve se zkontroluje velikost okna a případně se počká na opravu od uživatele
            {
                Program.WaitForFix();
                Reprint();
            }
            string Path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Minesweeper");

            Path = System.IO.Path.Combine(Path, "SavedGames");                                                                                              //Dáme dohromady celou cestu ke složce
            if (!Directory.Exists(Path))                                                                                                                    //Zkontrolujeme jestli složka existuje
            {
                (new PositionedText("There are no saved games to be loaded.", ConsoleColor.Black, Console.WindowWidth / 2 - 19, 15)).Print(false, Reprint); //Pokud ne informujeme uživatele
                Console.ReadKey(true);
                return(false);                                                                                                                              //A vrátí se false, protože hra nebyla načtena
            }
            FilesAsText = new List <PositionedText>();                                                                                                      //Pokud složka existuje vytvoří se seznam, do kterého se vloží grafické interpretace souborů
            string[] saveGameFiles = Directory.GetFiles(Path);                                                                                              //Nejprve získáme názvy souborů ze složky jako array stringů
            for (int x = 0; x < saveGameFiles.Length; x++)
            {
                FilesAsText.Add(new PositionedText(System.IO.Path.GetFileNameWithoutExtension(saveGameFiles[x]), ConsoleColor.Black, Console.WindowWidth / 2 - 10, 29 + x)); //Poté z každho stringu vytvoříme PositionedText, pozice textu záleží na jeho pořadí ve složce a délce názvu
            }
            if (saveGameFiles.Length == 0)                                                                                                                                   //Pokud nezískáme žádné soubory, opět informujeme uživatele, že neexistují žádné hry k načtení
            {
                (new PositionedText("There are no saved games to be loaded.", ConsoleColor.Black, Console.WindowWidth / 2 - 19, 15)).Print(false, Reprint);
                Console.ReadKey(true);
                return(false);                     //A vrátí se false, protože hra nebyla načtena
            }
            ConsoleKey keypressed = 0;             //Nyní už uživatel může vybírat soubor. Budeme tedy číst klávesu

            ChosenFile = 0;                        //A přednastaví se vybraný soubor na nulu (tedy ten úplně horní)
            while (keypressed != ConsoleKey.Enter) //While cyklus výběru souborů probíhá až dokud není potvrzen Enterem
            {
                for (int x = 0; x < FilesAsText.Count; x++)
                {
                    FilesAsText[x].Print(x == ChosenFile, LoadFilesReprint); //Nejprve se všechny soubory vytisknou, aktuálně zvolený soubor 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 toto menu a soubory se vytisknou znovu
                }
                keypressed = Console.ReadKey(true).Key;                      //Přečte klávesu od uživatele
                switch (keypressed)
                {
                case ConsoleKey.UpArrow:     //Pokud je zmáčnuté tlačítko šipka nahoru
                    if (ChosenFile != 0)     //A zároveň nejsme na souboru na pozici nula (úplně nahoře), posuneme se o jedna nahoru
                    {
                        ChosenFile--;
                    }
                    break;

                case ConsoleKey.DownArrow:                   //Pokud je zmáčknuté tlačítko šipka dolů
                    if (ChosenFile != FilesAsText.Count - 1) //A nejsme na pozici počtu souborů mínus jedna (tedy úplně dole), posuneme se o jedna dolů
                    {
                        ChosenFile++;
                    }
                    break;

                case ConsoleKey.Escape: //Pokud hráč zmáčkne Escape vrátí se zpátky do PauseMenu
                    return(false);      //Nebyla načtena žádná hra, tedy se vrátí false

                case ConsoleKey.R:      //Pokud uživatel zmáčkne R zavolá se metoda LoadFilesReprint
                    try
                    {
                        LoadFilesReprint();             //Tato metoda smaže a znovu vypíše menu i se soubory
                    }
                    catch (ArgumentOutOfRangeException) //Pokud nastane situace, že něco by se mělo tisknout mimo obrazovku
                    {
                        Program.WaitForFix();           //Program počká na opravu
                        LoadFilesReprint();             //A znovu zavolá metodu LoadFilesReprint()
                    }
                    break;
                }
            }
            GameControls.PlayedGame = new Game(File.ReadAllLines(saveGameFiles[ChosenFile])); //Nyní se z vybraného souboru vytvoří hra pomocí konstruktoru
            GameControls.SetLoaded(File.ReadAllLines(saveGameFiles[ChosenFile]));             //Zároveň se nastavení nahrají i do GameControls (jako Počet otočených políček nebo nové barvy)
            int[] Parameters = GameControls.PlayedGame.GetParameters();                       //Získají se parametry nové hry a pošlou se do Diffswitcheru
            if (Parameters[0] == 10 && Parameters[1] == 10 && Parameters[2] == 10)            //Pokud se shodují s nastavením pro obtížnost Easy (Lehkou) tak se DiffSwitcher přepne na Easy
            {
                DiffSwitcher.SwitchTo(0, false, false);
            }
            else if (Parameters[0] == 20 && Parameters[1] == 20 && Parameters[2] == 60) //Pokud se shodují s nastavením pro Medium (Střední) tak se DiffSwitcher přepne na Medium
            {
                DiffSwitcher.SwitchTo(1, false, false);
            }
            else if (Parameters[0] == 30 && Parameters[1] == 30 && Parameters[2] == 180) //Pokud se shodují s nastavením pro Hard (Těžkou) tak se DiffSwitcher přepne na Hard
            {
                DiffSwitcher.SwitchTo(2, false, false);
            }
            else //Pokud se neshodují s žádnou výchozí obtížností
            {
                DiffSwitcher.GameMenus[3] = new CustomGameMenu(Parameters); //Vytvoří se nové CustomGameMenu podle těchto parametrů, zabere třetí pozici v Arrayi obtížností
                DiffSwitcher.SwitchTo(3, false, false);              //A DiffSwitcher se na něj přepne
            }
            GameControls.PlayedGame.TilesAndMinesAroundCalculator(); //Proběhne přepočítání políček a min okolo
            return(true);                                            //Vrátí se true, protože hra byla úspěšně načtena
        }
        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);
        }