private void Start()
    {
        WinPanel.SetActive(false);
        LosePanel.SetActive(false);
        PausePanel.SetActive(false);
        m_pentagons.Clear();
        m_hexagons.Clear();

        var stageInfo = GameManager.Instance.GetStageInfo();

        if (null != stageInfo)
        {
            m_countX       = stageInfo.X;
            m_countY       = stageInfo.Y;
            m_maxMineCount = stageInfo.LandMine;
        }

        bool isReverse = false;
        bool isIndent  = true;

        HashSet <KeyValuePair <int, int> > minePos;

        GenerateMine(out minePos);

        for (int y = 0; y < m_countY; ++y)
        {
            SHAPE shape   = (0 == y % 2) ? SHAPE.HEXAGON : SHAPE.PENTAGON;
            int   CountX  = (SHAPE.HEXAGON == shape) ? (int)((float)m_countX / 2f) : m_countX;
            bool  reverse = isReverse;
            for (int x = 0; x < CountX; ++x)
            {
                Vector3            pos        = Vector3.zero;
                LandMineController controller = null;

                switch (shape)
                {
                case SHAPE.HEXAGON:
                {
                    float posX = (true == isIndent) ? x * m_hexagon.Width : x * m_hexagon.Width + (m_hexagon.Width / 2f);
                    float posY = y * m_hexagon.Height - m_hexagon.ReverseHeight;

                    pos        = new Vector3(posX, posY, 0f);
                    controller = GameObject.Instantiate <LandMineController>(m_hexagon, pos, Quaternion.identity, m_parent.transform);
                    m_hexagons.Add(new KeyValuePair <int, int>(x, y), controller);
                }
                break;

                case SHAPE.PENTAGON:
                {
                    float posX = x * m_pentagon.Width;
                    float posY = (true == reverse)
                                ? y * m_pentagon.Height - m_pentagon.ReverseHeight
                                : y * m_pentagon.Height;

                    pos        = new Vector3(posX, posY, 0f);
                    controller = GameObject.Instantiate <LandMineController>(m_pentagon, pos, Quaternion.identity, m_parent.transform);
                    if (true == reverse)
                    {
                        controller.transform.Rotate(new Vector3(0, 0, 180f));
                    }
                    m_pentagons.Add(new KeyValuePair <int, int>(x, y), controller);
                }
                break;
                }

                var isMine = minePos.Contains(new KeyValuePair <int, int>(x, y));
                controller.Initialize(isMine, x, y, reverse);

                reverse = !reverse;
            }

            if (1 == y % 2)
            {
                isReverse = !isReverse;
                isIndent  = !isIndent;
            }
        }

        foreach (var pair in m_hexagons)
        {
            var hex = pair.Value;
            if (false == hex.IsMine)
            {
                var near = GetNearLandMine(hex);
                int num  = 0;

                foreach (var mine in near)
                {
                    if (true == mine.IsMine)
                    {
                        ++num;
                    }
                }

                hex.SetNumber(num);
            }
            else
            {
                hex.SetNumber(0);
            }
        }

        foreach (var pair in m_pentagons)
        {
            var penta = pair.Value;
            if (false == penta.IsMine)
            {
                var near = GetNearLandMine(penta);
                int num  = 0;

                foreach (var mine in near)
                {
                    if (true == mine.IsMine)
                    {
                        ++num;
                    }
                }

                penta.SetNumber(num);
            }
            else
            {
                penta.SetNumber(0);
            }
        }
    }
    public List <LandMineController> GetNearLandMine(LandMineController controller)
    {
        var list = new List <LandMineController>();

        if (SHAPE.HEXAGON == controller.Shape)
        {
            int startX = (0 == controller.Y % 4) ? controller.X * 2 - 1 : controller.X * 2;
            for (int x = startX; x < startX + 3; ++x)
            {
                if (m_pentagons.ContainsKey(new KeyValuePair <int, int>(x, controller.Y + 1)))
                {
                    list.Add(m_pentagons[new KeyValuePair <int, int>(x, controller.Y + 1)]);
                }

                if (m_pentagons.ContainsKey(new KeyValuePair <int, int>(x, controller.Y - 1)))
                {
                    list.Add(m_pentagons[new KeyValuePair <int, int>(x, controller.Y - 1)]);
                }
            }
        }
        else
        {
            int myX = controller.X;
            int myY = controller.Y;
            if (m_pentagons.ContainsKey(new KeyValuePair <int, int>(myX - 1, myY)))
            {
                list.Add(m_pentagons[new KeyValuePair <int, int>(myX - 1, myY)]);
            }

            if (m_pentagons.ContainsKey(new KeyValuePair <int, int>(myX + 1, myY)))
            {
                list.Add(m_pentagons[new KeyValuePair <int, int>(myX + 1, myY)]);
            }

            int hexStartX = (0 == myX % 2) ? (myX / 2) - 1 : myX / 2;
            if (true == controller.IsReverse)
            {
                if (m_hexagons.ContainsKey(new KeyValuePair <int, int>(myX / 2, myY + 1)))
                {
                    list.Add(m_hexagons[new KeyValuePair <int, int>(myX / 2, myY + 1)]);
                }

                for (int x = hexStartX; x < hexStartX + 2; ++x)
                {
                    if (m_hexagons.ContainsKey(new KeyValuePair <int, int>(x, myY - 1)))
                    {
                        list.Add(m_hexagons[new KeyValuePair <int, int>(x, myY - 1)]);
                    }
                }
            }
            else
            {
                if (m_hexagons.ContainsKey(new KeyValuePair <int, int>(myX / 2, myY - 1)))
                {
                    list.Add(m_hexagons[new KeyValuePair <int, int>(myX / 2, myY - 1)]);
                }

                for (int x = hexStartX; x < hexStartX + 2; ++x)
                {
                    if (m_hexagons.ContainsKey(new KeyValuePair <int, int>(x, myY + 1)))
                    {
                        list.Add(m_hexagons[new KeyValuePair <int, int>(x, myY + 1)]);
                    }
                }
            }
        }

        return(list);
    }