internal override List <PiecePosition> GetPossiblePiecePositions(PiecePosition position, Board board) { var positions = GetPossiblePiecePositionsWithoutRoque(position, board); if (CanBigRoque(board)) { positions.Add(new PiecePosition('A', _initialeLine)); } if (CanSmallRoque(board)) { positions.Add(new PiecePosition('H', _initialeLine)); } return(positions); }
internal List <PiecePosition> GetPossiblePiecePositionsWithoutRoque(PiecePosition position, Board board) { return(new List <PiecePosition> { new PiecePosition((char)(position.Column - 1), position.Line - 1), new PiecePosition((char)(position.Column - 1), position.Line), new PiecePosition((char)(position.Column - 1), position.Line + 1), new PiecePosition(position.Column, position.Line + 1), new PiecePosition(position.Column, position.Line - 1), new PiecePosition((char)(position.Column + 1), position.Line - 1), new PiecePosition((char)(position.Column + 1), position.Line), new PiecePosition((char)(position.Column + 1), position.Line + 1) } .Where(x => IsInBoard(x) && !IsOccupiedBySameColorPiece(board, x) && !board.IsPositionThreatened(x, Color)) .ToList()); }
private bool Roque(PiecePosition fromPosition, PiecePosition toPosition) { var pieceToMove = GetPiece(fromPosition) as King; var pieceAtDestination = GetPiece(toPosition) as Rook; if (pieceToMove == null || pieceAtDestination == null) { return(false); } var king = GetPiece(fromPosition); var rook = GetPiece(toPosition); SetPiece(toPosition, king); SetPiece(fromPosition, rook); return(true); }
private bool CanBigRoque(Board board) { if (HasMoved) { return(false); } var rook = board.GetPiece(new PiecePosition('A', _initialeLine)); if (rook.HasMoved) { return(false); } for (char col = 'B'; col <= 'D'; col++) { var piecePosition = new PiecePosition(col, _initialeLine); if (board.GetPiece(piecePosition) != null || board.IsPositionThreatened(piecePosition, Color)) { return(false); } } return(true); }
public bool IsPositionThreatened(PiecePosition position, PieceColor color) { PieceColor colorThreat; if (color == PieceColor.Black) { colorThreat = PieceColor.White; } else if (color == PieceColor.White) { colorThreat = PieceColor.Black; } else { throw new ArgumentException("Unknown piece color"); } var allPositionsThreatened = new List <PiecePosition>(); for (char col = 'A'; col <= 'H'; col++) { for (int line = 1; line <= 8; line++) { var piecePosition = new PiecePosition(col, line); var piece = GetPiece(piecePosition); if (piece?.Color == colorThreat) { var possiblePiecePositions = GetPossiblePiecePositions(piecePosition); if (possiblePiecePositions != null) { allPositionsThreatened.AddRange(possiblePiecePositions); } } } } return(allPositionsThreatened.Contains(position)); }
internal override List <PiecePosition> GetPossiblePiecePositions(PiecePosition position, Board board) { return(GetDiagonalMoves(position, board)); }
internal override List <PiecePosition> GetPossiblePiecePositions(PiecePosition position, Board board) { return(GetForwardBackwardMoves(position, board)); }
internal abstract List <PiecePosition> GetPossiblePiecePositions(PiecePosition position, Board board);
protected List <PiecePosition> GetForwardBackwardMoves(PiecePosition position, Board board) { var positions = new List <PiecePosition>(); int line = position.Line + 1; while (IsInBoard(position.Column, line)) { var newPosition = new PiecePosition(position.Column, line); if (IsOccupiedBySameColorPiece(board, newPosition)) { break; } positions.Add(newPosition); if (IsOccupiedByOtherColorPiece(board, newPosition)) { break; } line++; } line = position.Line - 1; while (IsInBoard(position.Column, line)) { var newPosition = new PiecePosition(position.Column, line); if (IsOccupiedBySameColorPiece(board, newPosition)) { break; } positions.Add(newPosition); if (IsOccupiedByOtherColorPiece(board, newPosition)) { break; } line--; } char column = (char)(position.Column + 1); while (IsInBoard(column, position.Line)) { var newPosition = new PiecePosition(column, position.Line); if (IsOccupiedBySameColorPiece(board, newPosition)) { break; } positions.Add(newPosition); if (IsOccupiedByOtherColorPiece(board, newPosition)) { break; } column++; } column = (char)(position.Column - 1); while (IsInBoard(column, position.Line)) { var newPosition = new PiecePosition(column, position.Line); if (IsOccupiedBySameColorPiece(board, newPosition)) { break; } positions.Add(newPosition); if (IsOccupiedByOtherColorPiece(board, newPosition)) { break; } column--; } return(positions); }
protected bool IsOccupiedByOtherColorPiece(Board board, PiecePosition position) { var newPiece = board.GetPiece(position); return(newPiece != null && newPiece?.Color != Color); }
protected bool IsOccupiedBySameColorPiece(Board board, PiecePosition position) { var newPiece = board.GetPiece(position); return(newPiece?.Color == Color); }
protected bool IsInBoard(PiecePosition position) { return(IsInBoard(position.Column, position.Line)); }
private void SetPiece(PiecePosition position, Piece piece) { _pieces[position.Column - 'A', position.Line - 1] = piece; }
public List <PiecePosition> GetPossiblePiecePositions(PiecePosition position) { var piece = GetPiece(position); return(piece?.GetPossiblePiecePositions(position, this)); }
private void RemovePiece(PiecePosition position) { _pieces[position.Column - 'A', position.Line - 1] = null; }