public void ValidadeDestinationPosition(Position origin, Position destination) { if (!Brd.Piece(origin).PossibleMovement(destination)) { throw new BoardException("Invalid destination position!"); } }
public void MakeThePlay(Position origin, Position destination) { Piece CapturedPiece = RunMovement(origin, destination); if (IsItChecked(CurrentPlayer)) { UndoMovement(origin, destination, CapturedPiece); throw new BoardException("You Can't put yourself in check!"); } Piece p = Brd.Piece(destination); //#Special Play: Promotion if (p is Pawn) { if (p.Color == Color.White && destination.Row == 0 || p.Color == Color.Black && destination.Row == 7) { p = Brd.RemovePiece(destination); Pieces.Remove(p); Piece queen = new Queen(Brd, p.Color); Brd.PutPiece(queen, destination); Pieces.Add(queen); } } if (IsItChecked(Opponent(CurrentPlayer))) { Check = true; } else { Check = false; } if (CheckmateTest(Opponent(CurrentPlayer))) { Finished = true; } else { Turn++; ChangePlayer(); } //#Special Play: En Passant if (p is Pawn && destination.Row == origin.Row - 2 || destination.Row == origin.Row + 2) { VulnerableEnPassant = p; } else { VulnerableEnPassant = null; } }
public override bool[,] PossibleMovements() { bool[,] mat = new bool[Brd.Rows, Brd.Columns]; Position pos = new Position(0, 0); //North pos.SetValues(Position.Row - 1, Position.Column); while (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; if (Brd.Piece(pos) != null && Brd.Piece(pos).Color != Color) { break; } pos.SetValues(pos.Row - 1, pos.Column); } //South pos.SetValues(Position.Row + 1, Position.Column); while (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; if (Brd.Piece(pos) != null && Brd.Piece(pos).Color != Color) { break; } pos.SetValues(pos.Row + 1, pos.Column); } //East pos.SetValues(Position.Row, Position.Column + 1); while (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; if (Brd.Piece(pos) != null && Brd.Piece(pos).Color != Color) { break; } pos.SetValues(pos.Row, pos.Column + 1); } //West pos.SetValues(Position.Row, Position.Column - 1); while (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; if (Brd.Piece(pos) != null && Brd.Piece(pos).Color != Color) { break; } pos.SetValues(pos.Row, pos.Column - 1); } return(mat); }
public void ValidateOriginPosition(Position pos) { if (Brd.Piece(pos) == null) { throw new BoardException("There is no piece in the chosen origin position!"); } if (CurrentPlayer != Brd.Piece(pos).Color) { throw new BoardException("The chosen piece is not yours!"); } if (!Brd.Piece(pos).IsTherePossibleMovements()) { throw new BoardException("There is no possible movements for the chosen piece!"); } }
public override bool[,] PossibleMovements() { bool[,] mat = new bool[Brd.Rows, Brd.Columns]; Position pos = new Position(0, 0); if (Color == Color.White) { pos.SetValues(Position.Row - 1, Position.Column); if (Brd.IsValidPosition(pos) && Free(pos)) { mat[pos.Row, pos.Column] = true; } pos.SetValues(Position.Row - 2, Position.Column); Position p2 = new Position(Position.Row - 1, Position.Column); if (Brd.IsValidPosition(p2) && Free(p2) && Brd.IsValidPosition(pos) && Free(pos) && MovementsQty == 0) { mat[pos.Row, pos.Column] = true; } pos.SetValues(Position.Row - 1, Position.Column - 1); if (Brd.IsValidPosition(pos) && IsThereEnemy(pos)) { mat[pos.Row, pos.Column] = true; } pos.SetValues(Position.Row - 1, Position.Column + 1); if (Brd.IsValidPosition(pos) && IsThereEnemy(pos)) { mat[pos.Row, pos.Column] = true; } //#Special Play: En Passant if (Position.Row == 3) { Position left = new Position(Position.Row, Position.Column - 1); if (Brd.IsValidPosition(left) && IsThereEnemy(left) && Brd.Piece(left) == Match.VulnerableEnPassant) { mat[left.Row - 1, left.Column] = true; } Position right = new Position(Position.Row, Position.Column + 1); if (Brd.IsValidPosition(right) && IsThereEnemy(right) && Brd.Piece(right) == Match.VulnerableEnPassant) { mat[right.Row - 1, right.Column] = true; } } } else { pos.SetValues(Position.Row + 1, Position.Column); if (Brd.IsValidPosition(pos) && Free(pos)) { mat[pos.Row, pos.Column] = true; } pos.SetValues(Position.Row + 2, Position.Column); Position p2 = new Position(Position.Row + 1, Position.Column); if (Brd.IsValidPosition(p2) && Free(p2) && Brd.IsValidPosition(pos) && Free(pos) && MovementsQty == 0) { mat[pos.Row, pos.Column] = true; } pos.SetValues(Position.Row + 1, Position.Column - 1); if (Brd.IsValidPosition(pos) && IsThereEnemy(pos)) { mat[pos.Row, pos.Column] = true; } pos.SetValues(Position.Row + 1, Position.Column + 1); if (Brd.IsValidPosition(pos) && IsThereEnemy(pos)) { mat[pos.Row, pos.Column] = true; } //#Special Play: En Passant if (Position.Row == 4) { Position left = new Position(Position.Row, Position.Column - 1); if (Brd.IsValidPosition(left) && IsThereEnemy(left) && Brd.Piece(left) == Match.VulnerableEnPassant) { mat[left.Row + 1, left.Column] = true; } Position right = new Position(Position.Row, Position.Column + 1); if (Brd.IsValidPosition(right) && IsThereEnemy(right) && Brd.Piece(right) == Match.VulnerableEnPassant) { mat[right.Row + 1, right.Column] = true; } } } return(mat); }
private bool Free(Position pos) { return(Brd.Piece(pos) == null); }
private bool IsThereEnemy(Position pos) { Piece p = Brd.Piece(pos); return(p != null && p.Color != Color); }
private bool CanMove(Position pos) { Piece p = Brd.Piece(pos); return(p == null || p.Color != Color); }
public override bool[,] PossibleMovements() { bool[,] mat = new bool[Brd.Rows, Brd.Columns]; Position pos = new Position(0, 0); //North pos.SetValues(Position.Row - 1, Position.Column); if (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; } //North-East pos.SetValues(Position.Row - 1, Position.Column + 1); if (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; } //East pos.SetValues(Position.Row, Position.Column + 1); if (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; } //South-East pos.SetValues(Position.Row + 1, Position.Column + 1); if (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; } //South pos.SetValues(Position.Row + 1, Position.Column); if (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; } //South-West pos.SetValues(Position.Row + 1, Position.Column - 1); if (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; } //West pos.SetValues(Position.Row, Position.Column - 1); if (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; } //North-West pos.SetValues(Position.Row - 1, Position.Column - 1); if (Brd.IsValidPosition(pos) && CanMove(pos)) { mat[pos.Row, pos.Column] = true; } //#Special Play: Castling if (MovementsQty == 0 && !Match.Check) { //Castling Short Position posR1 = new Position(Position.Row, Position.Column + 3); if (CastlingTest(posR1)) { Position p1 = new Position(Position.Row, Position.Column + 1); Position p2 = new Position(Position.Row, Position.Column + 2); if (Brd.Piece(p1) == null && Brd.Piece(p2) == null) { mat[Position.Row, Position.Column + 2] = true; } } //Castling Long Position posR2 = new Position(Position.Row, Position.Column - 4); if (CastlingTest(posR2)) { Position p1 = new Position(Position.Row, Position.Column - 1); Position p2 = new Position(Position.Row, Position.Column - 2); Position p3 = new Position(Position.Row, Position.Column - 3); if (Brd.Piece(p1) == null && Brd.Piece(p2) == null && Brd.Piece(p3) == null) { mat[Position.Row, Position.Column - 2] = true; } } } return(mat); }
private bool CastlingTest(Position pos) { Piece p = Brd.Piece(pos); return(p != null && p is Rook && p.Color == Color && p.MovementsQty == 0); }