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); }
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); }
public void Undo() { if (UndoChessBoard != null) { PieceTakenRemove(ChessBoard.LastMove); PieceTakenRemove(PreviousChessBoard.LastMove); ChessBoard = new Board(UndoChessBoard); CurrentGameBook = UndoGameBook.MakeClone(); ChessBoard.GenerateValidMoves(); ChessBoard.EvaluateBoardScore(); } }
public void GenerateValidMoves() => ChessBoard.GenerateValidMoves();
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); } }