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); }