detect en passant, add some tests for it - chess-puzzles - chess puzzle book ge… | |
git clone git://git.codemadness.org/chess-puzzles | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 64c4e3aaecf348c2cb7c61f5569cae1a820d20db | |
parent d69d3ff1075f952ebdd45af40e7580bb3003721f | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Wed, 20 Dec 2023 20:35:16 +0100 | |
detect en passant, add some tests for it | |
Diffstat: | |
M fen_to_svg.c | 21 ++++++++++++++++++--- | |
M tests.sh | 17 +++++++++++++++-- | |
2 files changed, 33 insertions(+), 5 deletions(-) | |
--- | |
diff --git a/fen_to_svg.c b/fen_to_svg.c | |
@@ -1,4 +1,3 @@ | |
-/* TODO: write some test-cases for parsing and output FEN */ | |
/* TODO: option to flip board? */ | |
#include <ctype.h> | |
@@ -120,8 +119,6 @@ showboardfen(void) | |
putchar('-'); | |
} | |
printf(" %d %d", halfmove, movenumber); | |
- | |
- /* ? TODO: detect en passant, invalid castling etc? */ | |
} | |
void | |
@@ -592,6 +589,24 @@ main(int argc, char *argv[]) | |
black_can_castle[0] = 0; | |
} | |
+ /* the en passant square resets after a move */ | |
+ enpassantsquare[0] = -1; | |
+ enpassantsquare[1] = -1; | |
+ /* moved 2 squares and there is an opponent pawn next … | |
+ if (piece == 'P' && y == 6 && y2 == 4) { | |
+ if (getpiece(x - 1, y2) == 'p' || | |
+ getpiece(x + 1, y2) == 'p') { | |
+ enpassantsquare[0] = x; | |
+ enpassantsquare[1] = 5; | |
+ } | |
+ } else if (piece == 'p' && y == 1 && y2 == 3) { | |
+ if (getpiece(x - 1, y2) == 'P' || | |
+ getpiece(x + 1, y2) == 'P') { | |
+ enpassantsquare[0] = x; | |
+ enpassantsquare[1] = 2; | |
+ } | |
+ } | |
+ | |
/* possible promotion: queen, knight, bishop */ | |
if (*s == 'q' || *s == 'n' || *s == 'b') { | |
if (side_to_move == 'w') | |
diff --git a/tests.sh b/tests.sh | |
@@ -63,5 +63,18 @@ testfen 'r3kbr1/pp2qppp/n1p2n2/3p1B2/3P1B2/4QN1b/PPP2PPP/RN2… | |
'r3kbr1/pp2qppp/n1p2n2/3p4/3P1B2/3BQN1b/PPP2PPP/RN2K2R w KQq - 8 12'\ | |
'd3f5' | |
-# TODO: test halfmove | |
-# TODO: test enpassant | |
+# test en passant: move white pawn g2 to g4, enpassant square becomes g3. | |
+testfen 'r4k1r/ppppp1pp/8/8/5pP1/4P3/PPPP1P1P/R3K2R b - g3 0 4'\ | |
+ 'r4k1r/ppppp1pp/8/8/5p2/4P3/PPPP1PPP/R3K2R w - - 0 4'\ | |
+ 'g2g4' | |
+# moving 2 squares near a pawn, but not en passant. | |
+testfen 'r4k1r/ppppp1p1/8/5p2/6P1/4P2p/PPPP1P1P/R3K2R b - - 0 6'\ | |
+ 'r4k1r/ppppp1p1/8/5p2/8/4P2p/PPPP1PPP/R3K2R w - - 0 6'\ | |
+ 'g2g4' | |
+# test en passant for black. | |
+testfen 'r4k1r/ppp1p1p1/8/2Pp1p2/6P1/4P2p/PP1P1P1P/R3K2R w - d6 0 9'\ | |
+ 'r4k1r/ppppp1p1/8/2P2p2/6P1/4P2p/PP1P1P1P/R3K2R b - - 0 8'\ | |
+ 'd7d5' | |
+testfen 'r4k1r/p1ppp1p1/8/1pP2p2/6P1/4P2p/PP1P1P1P/R3K2R w - b6 0 9'\ | |
+ 'r4k1r/ppppp1p1/8/2P2p2/6P1/4P2p/PP1P1P1P/R3K2R b - - 0 8'\ | |
+ 'b7b5' |