private void AppendRayMoves( BoardSquare originSquare, Position.Position position, MoveDelta rayDelta, List <Move> moves) { var board = position.Board; var moveBuilder = new MoveBuilder(piece, originSquare); var currentSquare = originSquare; while (rayDelta.IsCanApplyTo(currentSquare)) { currentSquare = rayDelta.GetDestSquare(currentSquare); if (board.IsEmpty(currentSquare)) { moves.Add(moveBuilder.SetDestSquare(currentSquare).Build()); } else { var obstacle = board.GetPieceAt(currentSquare); if (obstacle.player != position.PlayerToMove) { moves.Add(moveBuilder .SetDestSquare(currentSquare) .SetCapture(obstacle.piece) .Build()); } break; } } }
public void AppendMoves(BoardSquare originSquare, Position.Position position, List <Move> moves) { var board = position.Board; var playerToMove = position.PlayerToMove; var moveDeltas = GetMoveDeltas(); var moveBuilder = new MoveBuilder(GetPiece(), originSquare); for (int i = 0; i < moveDeltas.Length; ++i) { if (!moveDeltas[i].IsCanApplyTo(originSquare)) { continue; } var destSquare = moveDeltas[i].GetDestSquare(originSquare); if (board.IsEmpty(destSquare)) { moves.Add(moveBuilder.SetDestSquare(destSquare).Build()); } else { var pieceAtDestSquare = board.GetPieceAt(destSquare); if (pieceAtDestSquare.player != playerToMove) { moves.Add(moveBuilder .SetDestSquare(destSquare) .SetCapture(pieceAtDestSquare.piece) .Build()); } } } }
public void AppendMoves(BoardSquare originSquare, Position.Position position, List <Move> moves) { var board = position.Board; var moveBuilder = new MoveBuilder(Piece.Pawn, originSquare); var moveAppender = GetMoveAppender(originSquare); var moveForwardSquare = new BoardSquare(originSquare.Row + deltaRow, originSquare.Column); if (board.IsEmpty(moveForwardSquare)) { moveAppender(moveBuilder.SetDestSquare(moveForwardSquare), moves); if (originSquare.Row == initialRow) { var moveDoubleForwardSquare = GetDoubleForwardMoveSquare(originSquare); if (board.IsEmpty(moveDoubleForwardSquare)) { moves.Add(moveBuilder .SetDestSquare(moveDoubleForwardSquare) .SetPawnDoubleMove() .Build()); } } } if (originSquare.Column > 0) { AppendIfCanCapture( new BoardSquare(originSquare.Row + deltaRow, originSquare.Column - 1), moveBuilder, board, moves, moveAppender); } if (originSquare.Column + 1 < Board.Board.ColumnCount) { AppendIfCanCapture( new BoardSquare(originSquare.Row + deltaRow, originSquare.Column + 1), moveBuilder, board, moves, moveAppender); } if (originSquare.Row == enPassantCaptureRow && position.EnPassantCaptureColumn.Exists(x => Abs(originSquare.Column - x) == 1)) { var enPassantDstSquare = new BoardSquare( originSquare.Row + deltaRow, position.EnPassantCaptureColumn.ValueOr(0)); moves.Add(moveBuilder .SetDestSquare(enPassantDstSquare) .SetEnPassantCapture() .Build()); } }
private void AppendIfCanCapture( BoardSquare destSquare, MoveBuilder moveBuilder, Board.Board board, List <Move> moves, Action <MoveBuilder, List <Move> > moveAppender) { if (board.IsEmpty(destSquare)) { return; } var pieceAtDestSquare = board.GetPieceAt(destSquare); if (pieceAtDestSquare.player != player) { moveAppender( moveBuilder.SetDestSquare(destSquare).SetCapture(pieceAtDestSquare.piece), moves); } }