示例#1
0
        private void ExecuteAtomicMove(AtomicMove move)
        {
            Location source      = move.GetSource();
            Location destination = move.GetDestination();

            Piece piece     = Get(source);
            Piece destPiece = Get(destination);

            if (destPiece != null)
            {
                capturedPieces.Push(destPiece);
                move.Capture();

                if (destPiece.GetPieceColor().IsWhite())
                {
                    whitePieces.Remove(destPiece);
                }
                else
                {
                    blackPieces.Remove(destPiece);
                }
            }

            Set(destination, piece);
            Set(source, null);
            piece.Do(move);
            Update();
        }
示例#2
0
 public override void Undo(AtomicMove move)
 {
     base.Undo(move);
     if (move == firstMove)
     {
         moved     = false;
         firstMove = null;
     }
 }
示例#3
0
 public override void Do(AtomicMove move)
 {
     base.Do(move);
     if (!moved)
     {
         firstMove = move;
         moved     = true;
     }
 }
示例#4
0
        public Animation(float speed, AtomicMove move, Piece piece, float tileSize)
        {
            this.speed    = speed;
            this.move     = move;
            this.piece    = piece;
            this.tileSize = tileSize;

            start  = new Vector2f(move.GetSource().GetFile() * tileSize, (7 - move.GetSource().GetRank()) * tileSize);
            dir    = new Vector2f(move.GetDestination().GetFile() * tileSize, (7 - move.GetDestination().GetRank()) * tileSize) - start;
            length = (float)Math.Sqrt(dir.X * dir.X + dir.Y * dir.Y) / tileSize;
        }
示例#5
0
        public Move Parse(string str)
        {
            Move move;

            if (str[0] == '0')
            {
                move = Castling.Parse(str, turn);
            }
            else
            {
                move = new AtomicMove(str);
            }
            return(move);
        }
示例#6
0
        public void MouseButtonReleased(Vector2f location, Mouse.Button button)
        {
            location = location - offset;
            int x = (int)(location.X / tileSize);
            int y = (int)(location.Y / tileSize);

            Location destination = new Location(x, 7 - y);

            if (button == Mouse.Button.Left && pickedPiece != null && !startMove.Equals(destination))
            {
                Move move;
                if (pickedPiece.GetPieceType() == PieceType.King && position.Get(destination) == null && startMove.EulerDistance(destination) > 1 && pickedPiece.GetLocation().GetRank() == destination.GetRank())
                {
                    //Rochade
                    if (startMove.GetFile() < destination.GetFile())
                    {
                        //Small
                        move = new KingsideCastling(position.GetTurn());
                    }
                    else
                    {
                        //Big
                        move = new QueensideCastling(position.GetTurn());
                    }
                }
                else
                {
                    move = new AtomicMove(pickedPiece.GetPieceType(), startMove, destination);
                }
                if (position.Do(move))
                {
                    AnimateMove(pickedPiece, move);
                }

                SelectPiece(pickedPiece);
                pickedPiece = null;
            }
            else
            {
                pickedPiece = null;
            }
        }
示例#7
0
        private void ExecuteAtomicMoveReversed(AtomicMove move)
        {
            Location source      = move.GetDestination();
            Location destination = move.GetSource();

            Piece piece = Get(source);

            Set(destination, piece);
            piece.Undo(move);
            if (move.DidCapture())
            {
                Piece destPiece = capturedPieces.Pop();
                Add(destPiece);
            }
            else
            {
                Set(source, null);
            }
            Update();
        }
示例#8
0
 public virtual void Undo(AtomicMove move)
 {
     this.location = move.GetSource();
 }
示例#9
0
 public virtual void Do(AtomicMove move)
 {
     this.location = move.GetDestination();
 }