示例#1
0
        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];
            }
        }
示例#2
0
        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;
            }
        }
示例#3
0
 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;
     }
 }
示例#4
0
 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];
 }
示例#5
0
 public override bool Equals(Move move)
 {
     return base.Equals(move)&& (move as Promote).PromotedPiece.Equals(PromotedPiece);
 }
示例#6
0
 public virtual bool Equals(Move move)
 {
     return null != move && move.Piece == Piece && move.GetType() == GetType() && move.From.Equals(From);
 }
示例#7
0
        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();
        }
示例#8
0
        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);
        }
示例#9
0
 public override bool Equals(Move move)
 {
     return base.Equals(move) && To.Equals((move as Ordinary).To);
 }
示例#10
0
 public override bool Equals(Move move)
 {
     return(base.Equals(move) && To.Equals((move as Ordinary).To));
 }