} //Herní plocha public Game(int[] parameters) //Konstruktor, který vytvoří z parametrů z menu nastavení hry samotnou hru { HorizontalTiles = parameters[0]; VerticalTiles = parameters[1]; Mines = parameters[2]; Cover = (ConsoleColor)parameters[3]; CoverSecondary = (ConsoleColor)parameters[4]; Uncover = (ConsoleColor)parameters[5]; UncoverSecondary = (ConsoleColor)parameters[6]; Flag = (ConsoleColor)parameters[7]; Highlight = (ConsoleColor)parameters[8]; Text = (ConsoleColor)parameters[9]; //Nahrají se veškeré fieldy Minefield = new Tile[HorizontalTiles, VerticalTiles]; //Vytvoří se prázdné minové pole int remainingMines = Mines; //Nyní se pomocí třídy Random určí, která políčka budou mít miny int remainingTiles = HorizontalTiles * VerticalTiles; //Máme dvě proměnné: Zbývající miny a zbývající políčka ConsoleColor currentColour; //Také se každému políčku přiřadí jeho první barva Random rng = new Random(); bool mine; for (int x = 0; x != HorizontalTiles; x++) { if (x % 2 == 0) { currentColour = Cover; //Pokud jsme v lichém řádku, políčko úplně vlevo bude mít první barvu (Cover) } else { currentColour = CoverSecondary; //Pokud jsme v sudém, políčko bude mít druhou barvu (Cover Secondary) } for (int y = 0; y != VerticalTiles; y++) { int mineDeterminator = rng.Next(remainingTiles); //Nyní se vygeneruje náhodné číslo od nuly do počtu zbývajících políček if (mineDeterminator < remainingMines) //Pokud je náhodné číslo nižší než počet zbývajících min, { mine = true; //tak následující políčko bude mít minu, remainingMines--; //Samozřejmě se sníží počet zbývajících min a políček remainingTiles--; } else { mine = false; //jinak následující políčko minu mít nebude remainingTiles--; //A sníží se jen počet zbývajících políček } Minefield[x, y] = new CoveredTile(mine, currentColour, (Console.WindowWidth / 2 - HorizontalTiles + 2 * x), y + ((Console.WindowHeight - VerticalTiles) / 2), x, y); //Na pozici x, y se vytvoří nové políčko s minou určenou náhodným generátorem, souřadnicemi x, y a souřadnicemi v Consoli, které jsou propočítany tak, aby se Minefield nacházel ve středu obrazovky if (currentColour == Cover) //nyní se změní currentColour, aby následující políčko mělo jinou barvu a tvořila se „šachovnice“ { currentColour = CoverSecondary; } else { currentColour = Cover; } } } }
public Game(string[] savedGame) //Konstruktor, který slouží k vytvoření hry z hry uložené v souboru .txt { ///První řádek: Pozice umístěných vlaječek ///Druhý řádek: Pozice umístěných otazníků ///Třetí řádek: Pozice min ///Čtvrtý řádek: Pozice již otočených políček ///Pátý řádek: Parametry hry ///Šestý řádek: Současný čas string[] parameters = savedGame[4].Split(','); //Z pátého řádku se přečtou parametry hry a zapíší se do fieldů HorizontalTiles = int.Parse(parameters[0]); VerticalTiles = int.Parse(parameters[1]); Mines = int.Parse(parameters[2]); Cover = (ConsoleColor)int.Parse(parameters[3]); CoverSecondary = (ConsoleColor)int.Parse(parameters[4]); Uncover = (ConsoleColor)int.Parse(parameters[5]); UncoverSecondary = (ConsoleColor)int.Parse(parameters[6]); Flag = (ConsoleColor)int.Parse(parameters[7]); Highlight = (ConsoleColor)int.Parse(parameters[8]); Text = (ConsoleColor)int.Parse(parameters[9]); Program.DefaultTextColour = Text; //Barva textu v programu se také změní podle uložené hry Minefield = new Tile[HorizontalTiles, VerticalTiles]; //Vytvoří se prázdný Minefield ConsoleColor currentColour; DiffSwitcher.SetLoaded(parameters); //Parametry se odešlou také do DiffSwitcheru, aby hráč, pokud se vrátí zpátky do nastavení, zde viděl tato nastavení for (int x = 0; x != HorizontalTiles; x++) { if (x % 2 == 0) { currentColour = Cover; } else { currentColour = CoverSecondary; //Nastavení barev funguje naprosto stejně jako u prvního konstruktoru } for (int y = 0; y != VerticalTiles; y++) { Minefield[x, y] = new CoveredTile(false, currentColour, (Console.WindowWidth / 2 - HorizontalTiles + 2 * x), y + ((Console.WindowHeight - VerticalTiles) / 2), x, y); //Nejprve se pokryje celý Minefield neotočenými políčkami if (currentColour == Cover) { currentColour = CoverSecondary; } else { currentColour = Cover; } } } string[] uncovered = savedGame[3].Split(';'); //Poté se podle čtvrtého řádku otočí políčka foreach (string coordinates in uncovered) { if (coordinates != "") { string[] position = coordinates.Split(','); Minefield[int.Parse(position[0]), int.Parse(position[1])] = new UncoveredTile(Minefield[int.Parse(position[0]), int.Parse(position[1])], false); } } string[] flagged = savedGame[0].Split(';'); //Podle prvního řádku se označí políčka vlaječkou foreach (string coordinates in flagged) { if (coordinates != "") { string[] position = coordinates.Split(','); Minefield[int.Parse(position[0]), int.Parse(position[1])].SetTileToFlag(); } } string[] questioned = savedGame[1].Split(';'); foreach (string coordinates in questioned) //Podle druhého řádku se umístí ozazníčky { if (coordinates != "") { string[] position = coordinates.Split(','); Minefield[int.Parse(position[0]), int.Parse(position[1])].SetTileToQuestionMark(); } } string[] mines = savedGame[2].Split(';'); //A podle třetího řádku se umístí miny foreach (string coordinates in mines) { if (coordinates != "") { string[] position = coordinates.Split(','); Minefield[int.Parse(position[0]), int.Parse(position[1])].PlantMine(); } } }