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; }
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; } }