List <PanelAreaType> GetReachPanelAreaTypeList(TurnType turnType)
        {
            var area1 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area1);
            var area2 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area2);
            var area3 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area3);
            var area4 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area4);
            var area5 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area5);
            var area6 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area6);
            var area7 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area7);
            var area8 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area8);
            var area9 = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == PanelAreaType.Area9);

            List <PanelAreaType> reachPanelAreaTypeList = new List <PanelAreaType>();

            // Vertical
            addPanelAreaTypeWhenReach(reachPanelAreaTypeList, turnType, area1, area2, area3);
            addPanelAreaTypeWhenReach(reachPanelAreaTypeList, turnType, area4, area5, area6);
            addPanelAreaTypeWhenReach(reachPanelAreaTypeList, turnType, area7, area8, area9);

            // Horizontal
            addPanelAreaTypeWhenReach(reachPanelAreaTypeList, turnType, area1, area4, area7);
            addPanelAreaTypeWhenReach(reachPanelAreaTypeList, turnType, area2, area5, area8);
            addPanelAreaTypeWhenReach(reachPanelAreaTypeList, turnType, area3, area6, area9);

            // Diagonal
            addPanelAreaTypeWhenReach(reachPanelAreaTypeList, turnType, area1, area5, area9);
            addPanelAreaTypeWhenReach(reachPanelAreaTypeList, turnType, area3, area5, area7);

            return(reachPanelAreaTypeList);
        }
        public PanelAreaType SelectPanelArea(PlayerEntity player, PanelAreaType panelAreaType)
        {
            var turnType = player.Equals(_1stPlayer) ? TurnType._1stPlayer : TurnType._2ndPlayer;
            var panel    = PanelAreaList.FirstOrDefault(x => x.PanelAreaType == panelAreaType);

            panel.SetTurnType(turnType);

            return(panelAreaType);
        }
        public PanelAreaType SelectPanelAreaByAI()
        {
            var canSelectPanelAreaList = PanelAreaList.Where(x => !x.Selected).ToList();
            var random        = new Random();
            var index         = random.Next(canSelectPanelAreaList.Count);
            var panelAreaType = canSelectPanelAreaList[index].PanelAreaType;

            SelectPanelArea(_2ndPlayer, panelAreaType);

            return(panelAreaType);
        }
        ResultType GetResult(TurnType turnType)
        {
            var list    = PanelAreaList.Where(x => x.TurnType == TurnType._1stPlayer).ToList();
            var isClear = isClearWithPanelAreaList(list);

            if (isClear)
            {
                if (turnType == TurnType._1stPlayer)
                {
                    return(ResultType.Win);
                }
                else
                {
                    return(ResultType.Lose);
                }
            }

            list    = PanelAreaList.Where(x => x.TurnType == TurnType._2ndPlayer).ToList();
            isClear = isClearWithPanelAreaList(list);
            if (isClear)
            {
                if (turnType == TurnType._1stPlayer)
                {
                    return(ResultType.Lose);
                }
                else
                {
                    return(ResultType.Win);
                }
            }

            if (IsEnd)
            {
                return(ResultType.Draw);
            }

            return(ResultType.None);
        }