예제 #1
0
파일: Board.cs 프로젝트: latkin/pentagoag
        public List <Board> GenerateSafeBoards(bool includeCheckmates)
        {
            List <Board> boards       = this.GenerateSubBoards();
            Board        workingBoard = new Board();

            for (int k = 0; k < boards.Count; k++)
            {
                workingBoard.Copy(boards[k]);

                foreach (Board b in workingBoard.GenerateSubBoards())
                {
                    if (b.GetWinner() == workingBoard.CurrentPlayer)
                    {
                        boards.RemoveAt(k);
                        k--;
                        break;
                    }
                    if (includeCheckmates &&
                        BoardEvaluator.HasCheckmate(b, workingBoard.CurrentPlayer))
                    {
                        boards.RemoveAt(k);
                        k--;
                        break;
                    }
                }
            }
            return(boards);
        }
예제 #2
0
파일: Board.cs 프로젝트: latkin/pentagoag
        // Finds all unique boards possible after applying a move by the current player
        public List <Board> GenerateSubBoards()
        {
            Dictionary <Board, int> boards = new Dictionary <Board, int>(256);

            if (this.GetWinner() != PieceColor.Empty)
            {
                return(new List <Board>());
            }

            Board b = new Board(this);

            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    if (this.GetColorAt(i, j) == PieceColor.Empty)
                    {
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.LowerLeftAntiClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.LowerLeftClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.LowerRightAntiClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.LowerRightClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.UpperLeftAntiClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.UpperLeftClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.UpperRightAntiClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.UpperRightClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                    }
                }
            }

            return(new List <Board>(boards.Keys));
        }
예제 #3
0
파일: Board.cs 프로젝트: latkin/pentagoag
        // Finds all unique boards possible after applying a move by the current player
        public List<Board> GenerateSubBoards()
        {
            Dictionary<Board, int> boards = new Dictionary<Board, int>(256);

            if (this.GetWinner() != PieceColor.Empty)
                return new List<Board>();

            Board b = new Board(this);

            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    if (this.GetColorAt(i, j) == PieceColor.Empty)
                    {
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.LowerLeftAntiClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.LowerLeftClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.LowerRightAntiClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.LowerRightClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.UpperLeftAntiClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.UpperLeftClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.UpperRightAntiClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                        b.Copy(this);
                        b.ApplyMoveFast(i, j, this.CurrentPlayer, Rotation.UpperRightClockwise);
                        if (!boards.ContainsKey(b))
                        {
                            b.Evaluation = BoardEvaluator.Evaluate(ref b);
                            boards.Add(new Board(b), 0);
                        }
                    }
                }
            }

            return new List<Board>(boards.Keys);
        }
예제 #4
0
        private Move GetMoveFromBoards(Board currentBoard, Board aiBoard)
        {
            Move returnMove = new Move();
            if (currentBoard.Equals(aiBoard))
            {
                returnMove.pieceColor = PieceColor.Empty;
                return returnMove;
            }

            PieceColor moveColor = (aiBoard.CurrentPlayer == PieceColor.White) ? PieceColor.Black: PieceColor.White;

            returnMove.pieceColor = moveColor;

            Board b = new Board(currentBoard);

            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    b.Copy(currentBoard);
                    if (b.GetColorAt(i, j) == PieceColor.Empty)
                    {
                        returnMove.xCoord = i;
                        returnMove.yCoord = j;

                        b.Copy(currentBoard);
                        b.PlacePieceAt(i, j, moveColor);
                        b.DoRotation(Rotation.LowerLeftAntiClockwise);
                        if (b.Equals(aiBoard))
                        {
                            returnMove.rotation = Rotation.LowerLeftAntiClockwise;
                            return returnMove;
                        }

                        b.Copy(currentBoard);
                        b.PlacePieceAt(i, j, moveColor);
                        b.DoRotation(Rotation.LowerLeftClockwise);
                        if (b.Equals(aiBoard))
                        {
                            returnMove.rotation = Rotation.LowerLeftClockwise;
                            return returnMove;
                        }

                        b.Copy(currentBoard);
                        b.PlacePieceAt(i, j, moveColor);
                        b.DoRotation(Rotation.LowerRightAntiClockwise);
                        if (b.Equals(aiBoard))
                        {
                            returnMove.rotation = Rotation.LowerRightAntiClockwise;
                            return returnMove;
                        }

                        b.Copy(currentBoard);
                        b.PlacePieceAt(i, j, moveColor);
                        b.DoRotation(Rotation.LowerRightClockwise);
                        if (b.Equals(aiBoard))
                        {
                            returnMove.rotation = Rotation.LowerRightClockwise;
                            return returnMove;
                        }

                        b.Copy(currentBoard);
                        b.PlacePieceAt(i, j, moveColor);
                        b.DoRotation(Rotation.UpperLeftAntiClockwise);
                        if (b.Equals(aiBoard))
                        {
                            returnMove.rotation = Rotation.UpperLeftAntiClockwise;
                            return returnMove;
                        }

                        b.Copy(currentBoard);
                        b.PlacePieceAt(i, j, moveColor);
                        b.DoRotation(Rotation.UpperLeftClockwise);
                        if (b.Equals(aiBoard))
                        {
                            returnMove.rotation = Rotation.UpperLeftClockwise;
                            return returnMove;
                        }

                        b.Copy(currentBoard);
                        b.PlacePieceAt(i, j, moveColor);
                        b.DoRotation(Rotation.UpperRightAntiClockwise);
                        if (b.Equals(aiBoard))
                        {
                            returnMove.rotation = Rotation.UpperRightAntiClockwise;
                            return returnMove;
                        }

                        b.Copy(currentBoard);
                        b.PlacePieceAt(i, j, moveColor);
                        b.DoRotation(Rotation.UpperRightClockwise);
                        if (b.Equals(aiBoard))
                        {
                            returnMove.rotation = Rotation.UpperRightClockwise;
                            return returnMove;
                        }
                    }
                }
            }
            // shouldn't ever get here
            Debug.Assert(false, "Bogus move \r\n" + masterBoard.ToString());
            return returnMove;
        }
예제 #5
0
파일: Board.cs 프로젝트: latkin/pentagoag
        public List<Board> GenerateSafeBoards(bool includeCheckmates)
        {
            List<Board> boards = this.GenerateSubBoards();
            Board workingBoard = new Board();

            for (int k = 0; k < boards.Count; k++)
            {
                workingBoard.Copy(boards[k]);

                foreach (Board b in workingBoard.GenerateSubBoards())
                {
                    if (b.GetWinner() == workingBoard.CurrentPlayer)
                    {
                        boards.RemoveAt(k);
                        k--;
                        break;
                    }
                    if(includeCheckmates &&
                        BoardEvaluator.HasCheckmate(b, workingBoard.CurrentPlayer))
                    {
                        boards.RemoveAt(k);
                        k--;
                        break;
                    }
                }
            }
            return boards;
        }