Example #1
0
        public static SecondPlayerMove MinMove(List <BoardItem> board, int colorCount, int maxSize)
        {
            if (board.Count() == maxSize || TwinsChecker.CheckTwins(board))
            {
                // Should never happend
                throw new Exception();
            }
            var bestMove = new SecondPlayerMove()
            {
                Rank = int.MaxValue
            };

            var positions = Enumerable.Range(0, board.Count);

            foreach (var position in positions)
            {
                var newBoard = board.ConvertAll(_ => new BoardItem(_.Color)).ToList();
                //Wastawiamy element
                var item = new BoardItem();
                newBoard.Insert(position, item);

                // Gra pierwszy gracz (minimalizujemy)
                FirstPlayerMove firstPlayerMove = MaxMove(newBoard, position, colorCount, maxSize);
                if (bestMove.Rank > firstPlayerMove.Rank)
                {
                    bestMove = new SecondPlayerMove()
                    {
                        Position = position, Rank = firstPlayerMove.Rank
                    };;
                }
            }
            return(bestMove);
        }
Example #2
0
        public static FirstPlayerMove MaxMove(List <BoardItem> board, int position, int colorCount, int maxSize)
        {
            if (TwinsChecker.CheckTwins(board))
            {
                // Should never happend
                throw new Exception();
            }
            var bestMove = new FirstPlayerMove()
            {
                Rank = int.MinValue
            };

            var colors = Enumerable.Range(0, colorCount);

            foreach (var color in colors)
            {
                var newBoard = board.ConvertAll(_ => new BoardItem(_.Color)).ToList();
                newBoard[position].Color = color;

                // Sprawdzamy czy gra się zakończyła
                if (TwinsChecker.CheckTwins(newBoard)) // Są ciasne bliźniaki (przegrywamy)
                {
                    if (bestMove.Rank < newBoard.Count)
                    {
                        bestMove = new FirstPlayerMove()
                        {
                            Color = color, Rank = newBoard.Count
                        };
                    }
                }
                else if (newBoard.Count == maxSize) // Doszliśmy do końca (wygrywamy)
                {
                    return(new FirstPlayerMove()
                    {
                        Color = color, Rank = int.MaxValue
                    });
                }
                else // Gra się nie skończyła
                {
                    // Gra drugi gracz (maksymalizujemy)
                    SecondPlayerMove secondPlayerMove = MinMoveCached(newBoard, colorCount, maxSize);
                    if (bestMove.Rank < secondPlayerMove.Rank)
                    {
                        bestMove = new FirstPlayerMove()
                        {
                            Color = color, Rank = secondPlayerMove.Rank
                        };
                    }
                }
            }
            return(bestMove);
        }