示例#1
0
        private static void DebugInfo(PositionManager positions, IBoard board, PatternMatcher matcher)
        {
            var matches1 = matcher.MatchPatterns(board, positions.Lines).ToList();

            PatternBoard pBoard = board as PatternBoard;

            if (pBoard != null)
            {
                var  matches2 = pBoard.Matches.Get().ToList();
                var  any      = matches1.Except(matches2).ToList();
                bool same     = (matches1.Count() == matches2.Count()) && !any.Any();
                Debug.Assert(same);
            }

            var groupedMatches = matches1.GroupBy(m => m.Pattern.PatternType, m => m);

            foreach (var match in groupedMatches)
            {
                var pos = string.Join(",", match.Select(l => $"{l.Pattern.Player}:({l.Positions.First().Row},{l.Positions.First().Col})"));
                if (!string.IsNullOrWhiteSpace(pos))
                {
                    Debug.WriteLine($"Pattern {match.Key} at {pos}.");
                }
            }
        }
        private IEnumerable <IEnumerable <Position> > GetWinLines(IBoard board)
        {
            PatternBoard patternBoard = board as PatternBoard;

            if (patternBoard == null)
            {
                var patterns = this.patternRepository.Get(PatternType.Five);
                return(this.matcher.MatchPatterns(board, this.positions.Lines, patterns).Select(m => m.Positions));
            }

            return(patternBoard.Matches.Get(PatternType.Five).Select(m => m.Positions));
        }
        public double GetScore(IBoard board, PieceType player)
        {
            MatchRepository matchRepository;
            PatternBoard    patternBoard = board as PatternBoard;

            if (patternBoard != null)
            {
                matchRepository = patternBoard.Matches;
            }
            else
            {
                var matches = this.matcher.MatchPatterns(board, positions.Lines);
                matchRepository = new MatchRepository();
                foreach (var match in matches)
                {
                    matchRepository.Add(match.Pattern.Player, match.Pattern.PatternType, match);
                }
            }

            double myScore = GetScore(player, matchRepository);
            double oScore  = GetScore(player.GetOther(), matchRepository);

            var  nextPlayer = board.Count % 2 == 0 ? PieceType.P1 : PieceType.P2;
            bool isMyTurn   = player == nextPlayer;

            if (isMyTurn)
            {
                myScore *= 1.2;
            }
            else
            {
                oScore *= 1.2;
            }

            return(myScore - oScore);
        }