SebLague / Chess-Challenge

Create your own tiny chess bot!
https://www.youtube.com/watch?v=Ne40a5LkK6A
MIT License
1.78k stars 1.07k forks source link

Bug: IsCapture is not set when an en passant move is manually constructed #445

Open DrBrask opened 11 months ago

DrBrask commented 11 months ago

IsCapture is not set when an en passant move is manually constructed.

This seems to be because the underlying MoveHelper.CreateMoveFromName(...) method doesn't set the captureType for en passant moves.

Here is an example from the test below.

Since EnPassant is true, IsCapture should also be true but it is not. image

The result is that a manually created EP Move instance does not match what the move generator produces because Move.Equals says they are different.

Here is a xUnit test:

[Fact]
public void EnPassantTest()
{
    var internalBoard = new ChessChallenge.Chess.Board();
    internalBoard.LoadPosition("1q5k/8/8/3pP3/8/6K1/8/8 w - d6 2 4");
    var board = new Board(internalBoard);

    var moves = board.GetLegalMoves();

    // Expect to find e5d6 (EP move)
    var expected = new Move("e5d6", board);   // BUG: This constructor fails to set captureType correctly

    // This fails because "IsCapture" is not set correctly in 'expected'
    Assert.Contains(expected, moves);
}

The correctly generated Move from the move generator looks like this: image

Position used: 1q5k/8/8/3pP3/8/6K1/8/8 w - d6 2 4

cc @SebLague

DrBrask commented 10 months ago

Fixed by #447