Наследование: MonoBehaviour
Пример #1
0
        public void IsMineTest()
        {
            Rules rules = new Rules();
            Mines mines = new Mines();

            mineList = new List <int>();
            mines.initMines();
            mineList = mines.getMines();
            int count = 0;

            for (int i = 0; i < 20; i++)
            {
                int tempnumber = Generating.RandomNumber(0, 99);
                while (rules.IsMine(tempnumber, mineList))
                {
                    tempnumber = Generating.RandomNumber(0, 99);
                }
                mines.AddMine(tempnumber);
            }
            for (int i = 0; i < 100; i++)
            {
                if (rules.IsMine(i, mineList))
                {
                    count++;
                }
            }
            Assert.AreEqual(20, count);
        }
Пример #2
0
        public async Task <Game> CreateGame(int bits, Mines mines = Mines.Three)
        {
            if (string.IsNullOrWhiteSpace(PlayerHash))
            {
                throw new NullReferenceException("PlayerHash is empty. You must create a player first to play the game.");
            }

            if (bits < 30)
            {
                throw new ArgumentOutOfRangeException(nameof(bits));
            }

            var request = new HttpRequestMessage(HttpMethod.Post, "/action/newgame.php")
            {
                Content = new FormUrlEncodedContent(new Dictionary <string, string>
                {
                    { "bd", BdValue },
                    { "player_hash", PlayerHash },
                    { "bet", (bits / 10000.0).ToString(CultureInfo.InvariantCulture) },
                    { "num_mines", ((byte)mines).ToString() }
                })
            };

            var response = await _client.SendAsync(request);

            var content = await response.Content.ReadAsStringAsync();

            var gameResponse = JsonHelper.Deserialize <GameResponse>(content);

            return(new Game(gameResponse, _client));
        }
Пример #3
0
        private Cell <Square> GetSquare(int target, Stream <int> sCheck, Stream <int> sFlag)
        {
            Cell <Square> square = sFlag.Filter(target.Equals).Snapshot(Flags[target], (_, value) => value ? new Flag().Square : new Tile().Square).Hold(new Tile().Square).SwitchC();

            Stream <ISet <int> > sFlipMine = sCheck.Filter(t => Flags[t].Sample()).Filter(Mines.Contains).Map(_ => Mines);
            Stream <ISet <int> > sFlipVoid = sCheck.Filter(t => Flags[t].Sample()).Filter(Voids.Contains).Map(t => CollectConnectedVoid(t, Voids, Adjacent));

            if (Mines.Contains(target))
            {
                var sFlip    = sFlipMine.Filter(targets => targets.Contains(target)).Map(_ => Unit.Value);
                var sTrigger = sCheck.Filter(target.Equals).Filter(_ => Flags[target].Sample()).Map(_ => Unit.Value).OrElse(sFlip);

                return(sTrigger.Map(_ => new Mine().Square).Hold(square).SwitchC());
            }

            if (Voids.Contains(target))
            {
                var sFlip    = sFlipVoid.Filter(targets => targets.Contains(target)).Map(_ => Unit.Value);
                var sTrigger = sCheck.Filter(target.Equals).Filter(_ => Flags[target].Sample()).Map(_ => Unit.Value).OrElse(sFlip);

                return(sTrigger.Map(_ => new Void().Square).Hold(square).SwitchC());
            }

            if (Hints.ContainsKey(target))
            {
                var sFlip    = sFlipVoid.Filter(voids => Adjacent[target].Any(voids.Contains)).Map(voids => Unit.Value);
                var sTrigger = sCheck.Filter(target.Equals).Filter(_ => Flags[target].Sample()).Map(_ => Unit.Value).OrElse(sFlip);

                return(sTrigger.Map(_ => new Hint(Hints[target]).Square).Hold(square).SwitchC());
            }

            return(new Tile().Square);
        }
Пример #4
0
        public async Task SwitchFaction(int newFactionID)
        {
            await Database.UpdateTeam(GameModel.Player, newFactionID);

            foreach (AntiMine am in AntiMines.Values)
            {
                if (GameModel.CellsInView.ContainsKey(am.CellID))
                {
                    am.Stop();
                    GameModel.CellsInView[am.CellID].MapOverlay.RemoveAntiMine();
                }
            }

            foreach (Mine m in Mines.Values)
            {
                if (GameModel.CellsInView.ContainsKey(m.CellID))
                {
                    GameModel.CellsInView[m.CellID].MapOverlay.RemoveAntiMine();
                }
            }

            AntiMines.Clear();
            Mines.Clear();

            Team = new Team(newFactionID, ColorCode.TeamName(newFactionID));
        }
Пример #5
0
        static RealmManager()
        {
            Worlds[World.TUT_ID]      = new Tutorial(false);
            Worlds[World.NEXUS_ID]    = Worlds[0] = new Nexus();
            Worlds[World.NEXUS_LIMBO] = new NexusLimbo();
            Worlds[World.VAULT_ID]    = new Vault(true);
            Worlds[World.TEST_ID]     = new Test();
            Worlds[World.RAND_REALM]  = new RandomRealm();
            Worlds[World.GAUNTLET]    = new GauntletMap();
            Worlds[World.WC]          = new WineCellarMap();
            Worlds[World.ARENA]       = new ArenaMap();
            Worlds[World.SHOP]        = new ShopMap("Default");
            Worlds[World.MARKET]      = new MarketMap();

            Monitor = new RealmPortalMonitor(Worlds[World.NEXUS_ID] as Nexus);

            //AddWorld(GameWorld.AutoName(1, true));

            Mines.Add(0, Worlds[World.NEXUS_ID] as Mine);

            MerchantLists.GetKeys();
            MerchantLists.AddPetShop();
            MerchantLists.AddCustomShops();
            foreach (var i in MerchantLists.shopLists)
            {
                ShopWorlds.TryAdd(i.Key, AddWorld(new ShopMap(i.Key)));
            }
        }
Пример #6
0
        public async Task<Game> CreateGame(int bits, Mines mines = Mines.Three)
        {
            if (string.IsNullOrWhiteSpace(PlayerHash))
                throw new NullReferenceException("PlayerHash is empty. You must create a player first to play the game.");

            if (bits < 30)
                throw new ArgumentOutOfRangeException(nameof(bits));

            var request = new HttpRequestMessage(HttpMethod.Post, "/action/newgame.php")
            {
                Content = new FormUrlEncodedContent(new Dictionary<string, string>
                {
                    {"bd", BdValue },
                    {"player_hash", PlayerHash},
                    {"bet", (bits / 10000.0).ToString(CultureInfo.InvariantCulture)},
                    {"num_mines", ((byte) mines).ToString()}
                })
            };

            var response = await _client.SendAsync(request);
            var content = await response.Content.ReadAsStringAsync();

            var gameResponse = JsonHelper.Deserialize<GameResponse>(content); 
            return new Game(gameResponse, _client);
        }
Пример #7
0
    // Start is called before the first frame update
    void Start()
    {
        tiles   = new GameObject[hight, width];
        reveald = new bool[hight, width];
        flags   = new bool[hight, width];

        Vector3 pos = Vector3.zero;

        for (int i = 0; i < hight; i++)
        {
            for (int j = 0; j < width; j++)
            {
                pos.x            = pos.x + size;
                tiles[i, j]      = factory.MakeBlank(pos);
                tiles[i, j].name = "Tile_" + i + "_" + j;
                tiles[i, j].transform.SetParent(transform);
            }
            pos.y = pos.y - size;
            pos.x = pos.x - size * width;
        }
        pos.z = -5;
        pos.x = size * (width + 1) / 2;
        pos.y = -size * hight / 2;
        Camera.main.transform.position = pos;
        Camera.main.orthographicSize   = (hight / 5) * cameraSizeIndex;

        mines = new Mines(width, hight, Mathf.FloorToInt(width * hight * minePercent));

        OnFlagsCountChanged?.Invoke(flagCount);
    }
Пример #8
0
    void OnTriggerEnter2D(Collider2D hitinfo)
    {
        JumpSkull js = hitinfo.GetComponent <JumpSkull>();
        EnemyGun  eg = hitinfo.GetComponent <EnemyGun>();
        Mines     m  = hitinfo.GetComponent <Mines>();
        Boss      b  = hitinfo.GetComponent <Boss>();
        Floor     f  = hitinfo.GetComponent <Floor>();

        // Debug.Log(hitinfo.name);
        if (m != null)
        {
            m.TakeDamage(100);
            Destroy(gameObject);
        }
        if (eg != null)
        {
            eg.TakeDamage(50);
            Destroy(gameObject);
        }
        if (js != null)
        {
            js.TakeDamage(34);
            Destroy(gameObject);
        }
        if (b != null)
        {
            b.TakeDamage(20);
            Destroy(gameObject);
        }
        if (f != null)
        {
            Destroy(gameObject);
        }
    }
Пример #9
0
 public void AddNewMine(Mines newMine)
 {
     repellers.Add(newMine);
     for (int i = 0; i < flock.Count; i++)
     {
         flock[i].AddRepellers(newMine);
     }
 }
Пример #10
0
 public GameHub(
     IGameEvents gameEvents,
     Mines mines
     )
 {
     _gameEvents = gameEvents;
     _mines      = mines;
 }
Пример #11
0
 // Use this for initialization
 void Start()
 {
     mine       = Instantiate(mineFab);
     mineScript = mine.GetComponent(typeof(Mines)) as Mines;
     playerObj  = Instantiate(playerFab);
     player     = new Player(this);
     player.setCoords(6, 7);
 }
Пример #12
0
 public void RemoveMine(int mineCellID)
 {
     if (GameModel.CellsInView.ContainsKey(mineCellID))
     {
         GameModel.CellsInView[mineCellID].MapOverlay.RemoveMine();
         Mines.TryRemove(mineCellID, out Mine value);
     }
 }
Пример #13
0
 // менюха нев гаме
 private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
 {
     newGame();
     showField(g, status);
     SmileBox.Image   = Image.FromFile("good.jpg");
     TimetextBox.Text = "00:00:00";
     MinetextBox.Text = Mines.ToString();
 }
Пример #14
0
 public void Union(Component other)
 {
     Nodes.AddRange(other.Nodes);
     Mines.AddRange(other.Mines);
     foreach (var score in other.Scores)
     {
         Scores[score.Key] += score.Value;
     }
 }
 public ComponentScore Add(ComponentScore other)
 {
     Mines.AddRange(other.Mines);
     foreach (var score in other.Scores)
     {
         Scores[score.Key] += score.Value;
     }
     SelfScore = Mines.Sum(x => Scores[x.Id]);
     return(this);
 }
Пример #16
0
 LevelBox FindLevelBox(Mines mines)
 {
     foreach (var level_box in GetComponentsInChildren <LevelBox>())
     {
         if (level_box.correspondingMines == mines)
         {
             return(level_box);
         }
     }
     throw new System.Exception("FindLevelBox failed");
 }
Пример #17
0
 public bool IsValid()
 {
     return
         (Width > 0 &&
          Height > 0 &&
          IsValidPosition(StartPosition) &&
          IsValidPosition(Exit) &&
          !StartPosition.IsEqual(Exit) &&
          !Mines.Any(x => x.IsEqual(StartPosition)) &&
          !Mines.Any(x => x.IsEqual(Exit)));
 }
 public ComponentScore(Node node, Node[] mines, IScorer scorer)
 {
     Mines  = new[] { node }.Where(x => x.IsMine).ToList();
     Scores = new Dictionary <int, long>();
     foreach (var mine in mines)
     {
         var d = scorer.GetDistance(mine, node);
         Scores.Add(mine.Id, d * d);
     }
     SelfScore = Mines.Sum(x => Scores[x.Id]);
 }
Пример #19
0
        public async Task <Mine> CreateMine(int cellID)
        {
            Mine mine = new Mine(cellID, ID);
            await Database.AddMine(ID, cellID);

            await Wallet.SubtractConfinium(GameModel.MINE_BASE_PRICE);

            Mines.TryAdd(cellID, mine);

            return(mine);
        }
Пример #20
0
 private void rbMines_CheckedChanged(object sender, EventArgs e)
 {
     if (rbMines.Checked)
     {
         if (pnlGame.Controls.Count >= 1)
         {
             pnlGame.Controls.RemoveAt(0);
         }
         Mines mines = new Mines();
         pnlGame.Controls.Add(mines);
     }
 }
    /// <summary>
    /// pishniaz hay server inja sakhte mishe;
    /// </summary>
    /// <param name="_id_server"></param>
    public void Change_value(string _id_server, string _id, GameObject content_home)
    {
        //content_home
        Content_home = content_home;

        Chilligames_SDK.API_Client.Recive_data_server <Panel_Servers.Model_server>(new Chilligames.SDK.Model_Client.Req_data_server {
            Name_app = "Venomic", _id_server = _id_server
        }, Result =>
        {
            // fill entitys
            Name_server = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Name_server;
            Freeze      = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Freeze;
            Mines       = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Mines;
            Delete      = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Delete;
            Chance      = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Chance;
            Reset       = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Reset;
            Active_day  = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Active_Days;
            Total_level = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Level;
            Coin        = DeserializeObject <Panel_Servers.Model_server.Setting_servers>(Result.Setting.ToString()).Coine;

            //formule S to Day
            Active_day = Mathf.Abs((int)Active_day) / 60 / 60 / 24 + 1;


            //change texts
            Text_nameserver_number.text = Name_server;
            Text_freeze_number.text     = Freeze.ToString();
            Text_mines_number.text      = Mines.ToString();
            Text_delete_number.text     = Delete.ToString();
            Text_chance_number.text     = Chance.ToString();
            Text_reset_number.text      = Reset.ToString();
            Text_Active_day_number.text = Active_day.ToString();
            Text_level_number.text      = Total_level.ToString();
            Text_Coin_number.text       = Coin.ToString();



            gameObject.GetComponent <Button>().onClick.AddListener(() =>
            {
                //work
                Missions = Instantiate(Raw_model_mission_online, Place_mission);
                Missions.GetComponent <Raw_model_game_play_online>().Change_value(_id, Name_server, (int)Coin, (int)Total_level, 0, (int)Freeze, (int)Mines, (int)Delete, (int)Chance, (int)Reset, _id_server, gameObject);

                //effect camera
                Player.Cam.Move_camera(new Vector3(10, 10, 0));
                Player.Cam.Change_color();

                //music controler
                Menu.Play_music_GamePlay();
            });
        }, err => { });
    }
    private void CallActionByBuildingCategory(string category, Unit option)
    {
        if (Utils.IsWarehouse(category))
        {
            Warehouses warehouses = building.GetComponent <Warehouses>();
            warehouses.OnChangeStorePreferences(option);
            return;
        }

        Mines mines = building.GetComponent <Mines>();

        mines.OnSetSelectedOption(option);
    }
Пример #23
0
 // spawns mines every given interval
 public IEnumerator MineSpawning()
 {
     while (isAlive)
     {
         if (currentMineCount < maxMineCount)
         {
             Instantiate(minePrefab, this.transform.position + (Vector3.forward * -1.5f), Quaternion.Inverse(this.transform.rotation), mineParent);
             Mines newMine = minePrefab.GetComponent <Mines>();
             BoidManager.instance.AddNewMine(newMine);
             currentMineCount++;
             yield return(mineDelay);
         }
     }
     yield return(null);
 }
Пример #24
0
    public void Restart()
    {
        reveald = new bool[hight, width];
        flags   = new bool[hight, width];
        for (int i = 0; i < hight; i++)
        {
            for (int j = 0; j < width; j++)
            {
                factory.SetNormal(tiles[i, j].GetComponent <SpriteRenderer>());
            }
        }

        mines = new Mines(width, hight, Mathf.FloorToInt(width * hight * 0.25f));

        OnFlagsCountChanged?.Invoke(flagCount);
    }
Пример #25
0
        public void CounterTest()
        {
            Mines mines = new Mines();
            Rules rules = new Rules();

            mineList = new List <int>();
            mines.initMines();
            mineList = mines.getMines();
            int count = 0;

            for (int i = 0; i < 20; i++)
            {
                int tempnumber = Generating.RandomNumber(0, 99);
                while (rules.IsMine(tempnumber, mineList))
                {
                    tempnumber = Generating.RandomNumber(0, 99);
                }
                mines.AddMine(tempnumber);
            }
            buttons = new List <Button>();
            for (int i = 0; i < 100; i++)
            {
                buttons.Add(new Button());
                buttons[i].BackColor = Color.FromArgb(192, 192, 192);
                buttons[i].Name      = (i).ToString();
                if (i < 80)
                {
                    buttons[i].BackColor = Color.FromArgb(0, 0, 0);
                }
            }
            Gameplay   gameplay = new Gameplay();
            List <int> numbers  = new List <int>();

            for (int i = 0; i < 9; i++)
            {
                numbers.Add(i);
            }
            for (int i = 0; i < 100; i++)
            {
                Assert.IsTrue(numbers.Contains(gameplay.CountAdjacentMines(buttons[i], mineList)));
            }
        }
Пример #26
0
        public IEnumerable <ValidationResult> Validate(ValidationContext validationContext)
        {
            if (BoardSize.Columns < 0 || BoardSize.Rows < 0)
            {
                yield return(new ValidationResult("not a valid board size"));
            }

            if (StartingPoint.X < 0 || StartingPoint.Y < 0 || StartingPoint.X > BoardSize.Rows - 1 || StartingPoint.Y > BoardSize.Columns - 1)
            {
                yield return(new ValidationResult("not a valid starting point"));
            }

            if (Mines.Exists(pos => pos.X < 0 || pos.Y < 0 || pos.X > BoardSize.Rows - 1 || pos.Y > BoardSize.Columns - 1))
            {
                yield return(new ValidationResult("not a valid mine position"));
            }

            if (ExitPoint.X < 0 || ExitPoint.Y < 0 || ExitPoint.X > BoardSize.Rows - 1 || ExitPoint.Y > BoardSize.Columns - 1)
            {
                yield return(new ValidationResult("not a valid exit point"));
            }
        }
Пример #27
0
    private void Awake()
    {
        Debug.Log("Awake MineExpansions");
        SM = GameObject.Find("MainCamera").GetComponent <SceneManage>();

        MineBlocks = gameObject.transform.Find("MineBlocks");
        Robots     = gameObject.transform.Find("Robots");
        Mines      = gameObject.transform.parent.GetComponent <Mines>();
        indexMine  = transform.GetSiblingIndex();

        dynPrice  = gameObject.transform.Find("MineBlocks/MineBlockNext").GetComponentInChildren <Text>();
        pBuyRobot = gameObject.transform.Find("BuyRobot").GetComponentInChildren <Text>();
        pUpBag    = gameObject.transform.Find("BuyBag").GetComponentInChildren <Text>();
        pUpSpeed  = gameObject.transform.Find("BuySpeed").GetComponentInChildren <Text>();
        pUpMine   = gameObject.transform.Find("BuyMine").GetComponentInChildren <Text>();
        pUpEnergy = gameObject.transform.Find("BuyEnergy").GetComponentInChildren <Text>();

        Pipe          = gameObject.transform.Find("Pipe").gameObject;
        buyRobot      = gameObject.transform.Find("BuyRobot").gameObject;
        upgradeBag    = gameObject.transform.Find("BuyBag").gameObject;
        upgradeSpeed  = gameObject.transform.Find("BuySpeed").gameObject;
        upgradeMine   = gameObject.transform.Find("BuyMine").gameObject;
        upgradeEnergy = gameObject.transform.Find("BuyEnergy").gameObject;


        buyRobot.SetActive(false);
        Pipe.SetActive(false);
        upgradeBag.SetActive(false);
        upgradeSpeed.SetActive(false);
        upgradeMine.SetActive(false);
        upgradeEnergy.SetActive(false);

        //Роботы
        robots = Robots.GetComponentsInChildren <Robot>();

        LoadBlocks();
        //nextBlock имеет ссылку только после LoadBlocks()
        psBoom = nextBlock.GetComponentInChildren <ParticleSystem>();
    }
Пример #28
0
    IEnumerator _WriteNewScore(Mines mines, int score)
    {
        bool contact_server = (mines.remoteBestScore == 0 || score < mines.remoteBestScore);

        int local_best = LoadLocalBest(mines.nbombs);

        if (local_best == 0 || score < local_best)
        {
            local_best = score;
            SaveLocalBest(mines.nbombs, score);
        }

        var level_box = FindLevelBox(mines);
        var text      = level_box.transform.Find("Canvas/Text (1)").GetComponent <UnityEngine.UI.Text>();

        text.fontSize = 50;
        text.text     = string.Format("local best: {0} s", local_best);

        if (contact_server)
        {
            string hexdigest = CalculateMD5Hash(mines.nbombs + "SeCrEt" + local_best);
            string url       = string.Format("https://vrsketch.eu/minesweeper/score?h={0}", hexdigest);
            WWW    www       = new WWW(url);
            yield return(www);

            if (string.IsNullOrEmpty(www.error))
            {
                string[] lines = www.text.Split('\n');
                foreach (var mines1 in FindObjectsOfType <Mines>())
                {
                    mines1.remoteBestScore = ParseBest(lines, mines1.nbombs);
                }
            }
        }
        if (mines.remoteBestScore > 0 && !text.text.Contains("\n"))
        {
            text.text = string.Format("{0}\nglobal best: {1} s", text.text, mines.remoteBestScore);
        }
    }
Пример #29
0
        public void Configure(string gameSettingsFile, string movesFile)
        {
            var gameSettings = File.ReadAllLines(gameSettingsFile ?? Path.Combine(Directory.GetCurrentDirectory(), _defaultGameSettingsFile));

            ValidateConfigFile(gameSettings);

            Size           = GetPoint(gameSettings, "Boarding Size:", 0);
            StartPosition  = GetPoint(gameSettings, "Starting Point:", 1);
            ExitPosition   = GetPoint(gameSettings, "Exit Point:", 3);
            StartDirection = GetDirection(gameSettings[2]);

            for (int i = 4; i < gameSettings.Length; i++)
            {
                Mines.Add(GetPoint(gameSettings, "Mine:", i));
            }



            var movements = File.ReadAllLines(movesFile ?? Path.Combine(Directory.GetCurrentDirectory(), _defaultMovesFile));

            for (int i = 0; i < movements.Length; i++)
            {
                if (string.IsNullOrEmpty(movements[i]))
                {
                    continue;
                }

                if (movements[i].ToLower().Trim() == "m")
                {
                    Movements.Add(Movement.Move);
                }
                else if (movements[i].ToLower().Trim() == "r")
                {
                    Movements.Add(Movement.Rotate);
                }
            }
        }
Пример #30
0
        private void newGame()
        {
            int row, col; // индексы клетки
            int n = 0;    // количество поставленных мин

            // очищаем поле
            for (row = 1; row <= FieldHeight; row++)
            {
                for (col = 1; col <= FieldWight; col++)
                {
                    Field[row, col] = 0;
                }
            }
            Random rnd = new Random();

            // расставим мины
            do
            {
                row = rnd.Next(FieldHeight) + 1;
                col = rnd.Next(FieldWight) + 1;

                if (Field[row, col] != 9)
                {
                    Field[row, col] = 9;
                    n++;
                }
            }while (n != Mines);
            // для каждой клетки вычислим кол-во мин вокруг
            MinesAround(row, col);
            // начинаем
            status           = 0;
            FindMines        = 0;
            FindFlags        = 0;
            MinetextBox.Font = new Font("Tahoma", 16);
            MinetextBox.Text = Mines.ToString();
        }
Пример #31
0
        private void Right_Button_Click_Reaction(int row, int col, int tag, string activator /*to know who lost*/)
        {
            Button btn = find_button_by_tag(tag);

            if (btn == null)
            {
                throw new MinesweeperException("Invalid Button to MinesGrid reference on multiple reveal");
            }

            if (!Mines.IsInGrid(row, col))
            {
                throw new MinesweeperException("Invalid Button to MinesGrid reference on flag"); // the button points to an invalid plate
            }
            if (Mines.IsFlagged(row, col))                                                       // the button has flag image child
            {
                btn.Content = "";                                                                // clears flag image
            }
            else
            {
                // attaches flag image to the button
                StackPanel sp = new StackPanel();
                sp.Orientation = Orientation.Horizontal;
                Image       flagImage = new Image();
                BitmapImage bi        = new BitmapImage();
                bi.BeginInit();
                bi.UriSource = new Uri(@"..\..\flag.png", UriKind.Relative);
                bi.EndInit();
                flagImage.Source = bi;
                flagImage.Width  = bi.PixelWidth;
                flagImage.Height = bi.PixelHeight;
                sp.Children.Add(flagImage);
                btn.Content = sp;
            }

            Mines.FlagMine(row, col);
        }