public void ZobristUpdate(Move move) { zobristKey ^= whiteCastle[(int)board.WhiteCastle]; zobristKey ^= blackCastle[(int)board.BlackCastle]; if (board.EnPassantSquare.Rank != 0 && board.EnPassantSquare.File != 0) { zobristKey ^= enPassant[board.EnPassantSquare.Rank, board.EnPassantSquare.File]; } side = move.Piece.Color == Color.White ? 0 : 1; zobristKey ^= pieces[side, move.Piece.ToInt, move.From.Rank, move.From.File];//Remove piece on the square zobristKey ^= pieces[side, move.To.GetPiece(board).ToInt, move.To.Rank, move.To.File];//Carry piece to target zobristKey ^= side; Piece capturedPiece; if (move is Ordinary && (capturedPiece = (move as Ordinary).CapturedPiece) != null) { zobristKey = pieces[side,capturedPiece.ToInt, capturedPiece.From.Rank, capturedPiece.From.File]; } else if (move is ShortCastle) { var rookFrom = move.Piece.Color == Color.White ? Coordinate.h1 : Coordinate.h8; var rookTo = move.Piece.Color == Color.White ? Coordinate.f1 : Coordinate.f8; zobristKey ^= pieces[side, Rook.rook, rookFrom.Rank, rookFrom.File]; zobristKey ^= pieces[side, Rook.rook, rookTo.Rank, rookTo.File]; } else if (move is LongCastle) { var rookFrom = move.Piece.Color == Color.White ? Coordinate.a1 : Coordinate.a8; var rookTo = move.Piece.Color == Color.White ? Coordinate.d1 : Coordinate.d8; zobristKey ^= pieces[side, Rook.rook, rookFrom.Rank, rookFrom.File]; zobristKey ^= pieces[side, Rook.rook, rookTo.Rank, rookTo.File]; } }
public void Add(Move move,int depth) { int score = ++killerMoves[depth, move.From.Rank, move.From.File, move.To.Rank, move.To.File]; if (score>bestMoveScores[depth]) { bestMoveScores[depth] = score; BestMoves[depth] = move; } }
public void AddMove(Move move) { int side = move.Piece.Color == Color.White ? 0 : 1;//0 for white and 1 for black int newMoveScore = ++historyMoves[side, move.From.Rank, move.From.File, move.To.Rank, move.To.File]; if (side == 0 && newMoveScore > WhiteBestMoveScore && !move.Equals(WhiteBestMove))//if side is white { WhiteBestMove = move; } else if (side == 1 && newMoveScore > BlackBestMoveScore && !move.Equals(BlackBestMove))//if side is black { BlackBestMove = move; } }
public int HistoryScoreOfMove(Move move) { return historyMoves[move.Piece.Color == Color.White ? 0 : 1, move.From.Rank, move.From.File, move.To.Rank, move.To.File]; }
public override bool Equals(Move move) { return base.Equals(move)&& (move as Promote).PromotedPiece.Equals(PromotedPiece); }
public virtual bool Equals(Move move) { return null != move && move.Piece == Piece && move.GetType() == GetType() && move.From.Equals(From); }
public void TakeBackMove(Move move) { var state = boardStateHistory.Pop(); EnPassantSquare = state.EnPassantSquare; WhiteCastle = state.WhiteCastle; BlackCastle = state.BlackCastle; fiftyMovesRule = state.FiftyMovesRule; zobrist.ZobristKey = state.ZobristKey; threeFoldRepetetion.Remove(); move.UnMakeMove(this); if (Side == Color.Black) totalMoves--; ToggleSide(); }
public void MakeMove(Move move) { Piece movingPiece = move.Piece; boardStateHistory.Push(new State(EnPassantSquare, WhiteCastle, BlackCastle, fiftyMovesRule,zobrist.ZobristKey)); if (Side == Color.Black) totalMoves++; if (movingPiece is Pawn && Math.Abs((movingPiece.From.Rank - ((Ordinary)move).To.Rank)) == 2) { if (movingPiece.Color == Color.White) EnPassantSquare = movingPiece.From.To(Coordinate.Directions.North); else EnPassantSquare = movingPiece.From.To(Coordinate.Directions.South); } else EnPassantSquare = new Coordinate(0, 0); if (movingPiece is Pawn || (move is Ordinary) && (move as Ordinary).CapturedPiece != null) fiftyMovesRule = 0; else fiftyMovesRule++; move.MakeMove(this); if (movingPiece is King) { if (movingPiece.Color == Color.White) { WhiteCastle = Castle.NoneCastle; } else { BlackCastle = Castle.NoneCastle; } } Piece piece; if (WhiteCastle != Castle.NoneCastle) { piece = Coordinate.a1.GetPiece(this); if (!(piece is Rook && piece.Color == Color.White)) { if (WhiteCastle == Castle.BothCastle) { WhiteCastle = Castle.ShortCastle; } else if (WhiteCastle == Castle.LongCastle) { WhiteCastle = Castle.NoneCastle; } } piece = Coordinate.h1.GetPiece(this); if (!(piece is Rook && piece.Color == Color.White)) { if (WhiteCastle == Castle.BothCastle) { WhiteCastle = Castle.LongCastle; } else if (WhiteCastle == Castle.ShortCastle) { WhiteCastle = Castle.NoneCastle; } } } if (BlackCastle != Castle.NoneCastle) { piece = Coordinate.a8.GetPiece(this); if (!(piece is Rook && piece.Color == Color.Black)) { if (BlackCastle == Castle.BothCastle) { BlackCastle = Castle.ShortCastle; } else if (BlackCastle == Castle.LongCastle) { BlackCastle = Castle.NoneCastle; } } piece = Coordinate.h8.GetPiece(this); if (!(piece is Rook && piece.Color == Color.Black)) { if (BlackCastle == Castle.BothCastle) { BlackCastle = Castle.LongCastle; } else if (BlackCastle == Castle.ShortCastle) { BlackCastle = Castle.NoneCastle; } } } ToggleSide(); zobrist.ZobristUpdate(move); threeFoldRepetetion.Add(zobrist.ZobristKey); }
public override bool Equals(Move move) { return base.Equals(move) && To.Equals((move as Ordinary).To); }
public override bool Equals(Move move) { return(base.Equals(move) && To.Equals((move as Ordinary).To)); }