示例#1
0
 internal ChessMove(DateTime startedAt, ChessPiece piece, Coordinate to, ChessMoveAction action)
 {
     StartedAt = startedAt;
     Player    = piece.Owner;
     Piece     = piece.Piece;
     File      = piece.File;
     Rank      = piece.Rank;
     To        = to;
     Action    = action;
     Timestamp = DateTime.UtcNow;
 }
示例#2
0
        public void MovePiece(ChessPiece piece, Coordinate tile)
        {
            ChessPiece focus = GetPiece(piece.Rank, piece.File);

            if (focus == null)
            {
                return;
            }

            if (LastMove != null)
            {
                Console.WriteLine($"{LastMove.Piece} ({LastMove.Rank}, {LastMove.File} => {LastMove.To.X}, {LastMove.To.Y})");
            }

            if (LastMove != null &&
                LastMove.Piece == ChessRank.Pawn &&
                LastMove.Player != focus.Owner &&
                LastMove.File == ((LastMove.Player == ChessOwner.Black) ? 1 : 6) &&
                LastMove.To.Y == ((LastMove.Player == ChessOwner.Black) ? 3 : 4) &&
                focus.Piece == ChessRank.Pawn &&
                tile.X == LastMove.To.X &&
                (LastMove.Player == ChessOwner.Black
                    ? LastMove.To.Y - ((LastMove.Player == ChessOwner.Black) ? 2 : 5)
                    : ((LastMove.Player == ChessOwner.Black) ? 2 : 5) - LastMove.To.Y) == 1)
            {
                ChessPiece target = GetPiece(LastMove.To.X, LastMove.To.Y);

                if (target == null)
                {
                    throw new Exception("Expected pawn at specified tile");
                }

                Pieces.Remove(target);

                ChessOwner      enemy  = focus.Owner == ChessOwner.Black ? ChessOwner.White : ChessOwner.Black;
                ChessMoveAction action = 0;

                if (IsCheckmate(enemy))
                {
                    action |= ChessMoveAction.Checkmate;
                }
                else if (IsInCheck(enemy))
                {
                    action |= ChessMoveAction.Check;
                }

                LastMove   = new ChessMove(StartedAt, focus, tile, action | ChessMoveAction.EnPassant);
                focus.Rank = tile.X;
                focus.File = tile.Y;
            }
            else
            {
                ChessPiece target = GetPiece(tile.X, tile.Y);

                ChessOwner enemy = focus.Owner == ChessOwner.Black ? ChessOwner.White : ChessOwner.Black;

                ChessMoveAction action = 0;

                if (IsCheckmate(enemy))
                {
                    action |= ChessMoveAction.Checkmate;
                }
                else if (IsInCheck(enemy))
                {
                    action |= ChessMoveAction.Check;
                }

                if (target != null)
                {
                    Pieces.Remove(target);
                    action |= ChessMoveAction.Capture;
                }

                LastMove   = new ChessMove(StartedAt, focus, tile, action);
                focus.Rank = tile.X;
                focus.File = tile.Y;
            }
        }