Esempio n. 1
0
        private static ResultBoards GetPossibleBoards(ChessPieceColor movingSide, Board examineBoard)
        {
            //We are going to store our result boards here
            resultBoards = new ResultBoards
            {
                Positions = new List <Board>()
            };

            for (byte x = 0; x < 64; x++)
            {
                Square sqr = examineBoard.Squares[x];

                //Make sure there is a piece on the square
                if (sqr.Piece == null)
                {
                    continue;
                }

                //Make sure the color is the same color as the one we are moving.
                if (sqr.Piece.PieceColor != movingSide)
                {
                    continue;
                }

                //For each valid move for this piece
                foreach (byte dst in sqr.Piece.ValidMoves)
                {
                    //We make copies of the board and move so that we can move it without effecting the parent board
                    Board board = examineBoard.FastBoardCopy();

                    //Make move so we can examine it
                    board.MovePiece(x, dst, ChessPieceType.Queen);

                    //We Generate Valid Moves for Board
                    board.GenerateValidMoves();


                    if (board.BlackCheck && movingSide == ChessPieceColor.Black)
                    {
                        continue;
                    }
                    if (board.WhiteCheck && movingSide == ChessPieceColor.White)
                    {
                        continue;
                    }

                    //We calculate the board score
                    board.EvaluateBoardScore();

                    //Invert Score to support Negamax
                    board.Score = SideToMoveScore(board.Score, GetOppositeColor(movingSide));

                    resultBoards.Positions.Add(board);
                }
            }

            return(resultBoards);
        }
Esempio n. 2
0
        public bool MovePiece(byte srcPosition, byte dstPosition)
        {
            Piece piece = ChessBoard.Squares[srcPosition].Piece;

            PreviousChessBoard = new Board(ChessBoard);
            UndoChessBoard     = new Board(ChessBoard);
            UndoGameBook       = new Book(CurrentGameBook);

            ChessBoard.MovePiece(srcPosition, dstPosition, PromoteToPieceType);

            ChessBoard.LastMove.GeneratePGNString(ChessBoard);

            GenerateValidMoves();
            ChessBoard.EvaluateBoardScore();

            //If there is a check in place, check if this is still true;
            if (piece.PieceColor == ChessPieceColor.White)
            {
                if (ChessBoard.WhiteCheck)
                {
                    //Invalid Move
                    ChessBoard = new Board(PreviousChessBoard);
                    ChessBoard.GenerateValidMoves();
                    return(false);
                }
            }
            else if (piece.PieceColor == ChessPieceColor.Black)
            {
                if (ChessBoard.BlackCheck)
                {
                    //Invalid Move
                    ChessBoard = new Board(PreviousChessBoard);
                    ChessBoard.GenerateValidMoves();
                    return(false);
                }
            }

            MoveHistory.Push(ChessBoard.LastMove);
            FileIO.SaveCurrentGameMove(ChessBoard, PreviousChessBoard, CurrentGameBook, ChessBoard.LastMove);

            CheckForMate(WhoseMove, ref ChessBoard);
            PieceTakenAdd(ChessBoard.LastMove);

            if (ChessBoard.WhiteMate || ChessBoard.BlackMate)
            {
                LastMove.PgnMove += "#";
            }
            else if (ChessBoard.WhiteCheck || ChessBoard.BlackCheck)
            {
                LastMove.PgnMove += "+";
            }

            return(true);
        }
Esempio n. 3
0
        public void Undo()
        {
            if (UndoChessBoard != null)
            {
                PieceTakenRemove(ChessBoard.LastMove);
                PieceTakenRemove(PreviousChessBoard.LastMove);

                ChessBoard      = new Board(UndoChessBoard);
                CurrentGameBook = UndoGameBook.MakeClone();

                ChessBoard.GenerateValidMoves();
                ChessBoard.EvaluateBoardScore();
            }
        }
Esempio n. 4
0
 public void GenerateValidMoves() => ChessBoard.GenerateValidMoves();
Esempio n. 5
0
        private ResultBoards GetSortValidMoves()
        {
            ResultBoards succ = new ResultBoards { Positions = new List<Board>(30) };

            piecesRemaining = 0;

#if (USETPL)
            Parallel.For(0,64, (ii) =>
#else
            for (byte ii = 0; ii < 64; ii++)
#endif
            {
                byte x = (byte)ii;
                Square sqr = Squares[x];

                //Make sure there is a piece on the square
                if (sqr.Piece == null)
#if (USETPL)
                    return;
#else
                    continue;
#endif

                piecesRemaining++;

                //Make sure the color is the same color as the one we are moving.
                if (sqr.Piece.PieceColor != WhoseMove)
#if (USETPL)
                    return;
#else
                    continue;
#endif

                    //For each valid move for this piece
                foreach (byte dst in sqr.Piece.ValidMoves)
                {
                    //We make copies of the board and move so that we can move it without effecting the parent board
                    Board board = FastBoardCopy();

                    //Make move so we can examine it
                    board.MovePiece(x, dst, ChessPieceType.Queen);

                    //We Generate Valid Moves for Board
                    board.GenerateValidMoves();

                    //Invalid Move
                    if (board.WhiteCheck && WhoseMove == ChessPieceColor.White)
                    {
                        continue;
                    }

                    //Invalid Move
                    if (board.BlackCheck && WhoseMove == ChessPieceColor.Black)
                    {
                        continue;
                    }

                    //We calculate the board score
                    board.EvaluateBoardScore();

                    //Invert Score to support Negamax
                    board.Score = SideToMoveScore(board.Score, board.WhoseMove);

                    succ.Positions.Add(board);
                }

            }