Introduction
Introduction Statistics Contact Development Disclaimer Help
improve check for castling and castling availability - chess-puzzles - chess pu…
git clone git://git.codemadness.org/chess-puzzles
Log
Files
Refs
README
LICENSE
---
commit b9e10f90912e4d6c82e4a4738a2fcdbd77b0d6db
parent 526df2437b7f656c5f7f68f207478dd2ee15db53
Author: Hiltjo Posthuma <[email protected]>
Date: Thu, 21 Dec 2023 17:58:13 +0100
improve check for castling and castling availability
This improves compatibility with chess960.
Diffstat:
M fen.c | 50 ++++++++++++++++++++---------…
M tests.sh | 33 +++++++++++++++++++++++++++++…
2 files changed, 65 insertions(+), 18 deletions(-)
---
diff --git a/fen.c b/fen.c
@@ -625,21 +625,24 @@ next:
halfmove++;
/* castling */
- if (piece == 'K' && y == 7 && y2 == 7 && x == 4) {
+ if (piece == 'K' && y == 7 && y2 == 7) {
/* white: kingside castling: "e1g1" */
- if (x2 == 6) {
+ if (x2 >= x + 2) { /* moved more than 1 square…
place('R', x2 - 1, y2);
x2 = 7;
y2 = 7;
place(0, x2, y2); /* clear rook square…
- } else if (x2 == 2) {
+ } else if (x2 <= x - 2) { /* moved more than 1…
/* white: queenside castling: "e1c1" */
- place('R', x2 + 1, y2);
- x2 = 0;
- y2 = 7;
- place(0, x2, y2);
+ for (j = x2 - 1; j > 0; j--) {
+ if (getpiece(j, y2) == 'R') {
+ place('R', x2 + 1, y2)…
+ place(0, j, y2); /* cl…
+ break;
+ }
+ }
}
- } else if (piece == 'k' && y == 0 && y2 == 0 && x == 4…
+ } else if (piece == 'k' && y == 0 && y2 == 0) {
/* black: kingside castling: "e8g8" */
if (x2 == 6) {
place('r', x2 - 1, y2);
@@ -660,16 +663,26 @@ next:
white_can_castle[0] = white_can_castle[1] = 0;
} else if (piece == 'k') {
black_can_castle[0] = black_can_castle[1] = 0;
- } else if (piece == 'R') {
- if (x == 7 && y == 7)
- white_can_castle[0] = 0;
- else if (x == 0 && y == 7)
- white_can_castle[1] = 0;
- } else if (piece == 'r') {
- if (x == 0 && y == 0)
- black_can_castle[1] = 0;
- else if (x == 7 && y == 0)
- black_can_castle[0] = 0;
+ } else if (piece == 'R' && y == 7) {
+ for (j = 0; j < 7; j++) {
+ if (getpiece(j, y) == 'K') {
+ if (j < x)
+ white_can_castle[0] = …
+ else if (j > x)
+ white_can_castle[1] = …
+ break;
+ }
+ }
+ } else if (piece == 'r' && y == 0) {
+ for (j = 0; j < 7; j++) {
+ if (getpiece(j, y) == 'k') {
+ if (j > x)
+ black_can_castle[1] = …
+ else if (j < x)
+ black_can_castle[0] = …
+ break;
+ }
+ }
}
/* taken en passant? */
@@ -712,6 +725,7 @@ next:
side_to_move = side_to_move == 'b' ? 'w' : 'b';
}
}
+
/* highlight last move */
highlightmove(x, y, x2, y2);
diff --git a/tests.sh b/tests.sh
@@ -91,3 +91,36 @@ testfen 'rnbqkbnr/ppppppp1/8/8/3P4/4P1p1/PPP2P1P/RNBQKBNR w …
testfen 'rnbqkbnr/pppp1pp1/4P3/7p/8/8/PPP1PPPP/RNBQKBNR b KQkq - 0 3'\
'rnbqkbnr/pppp1pp1/8/3Pp2p/8/8/PPP1PPPP/RNBQKBNR w KQkq e6 1 3'\
'd5e6'
+
+# 960 white queenside castle
+testfen 'qrn1bk1n/ppb1pprp/2p3p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KR2RN b q - 5 6'\
+ 'qrn1bk1n/ppb1pprp/2p3p1/3p4/1B1P4/3NPB2/PPP2PPP/QR3KRN w KQq - 4 6'\
+ 'f1c1'
+# 960, rook moved: remove ability for black to castle.
+testfen 'q1r1bk1n/ppb1pprp/2pn2p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KRR2N w - - 8 8'\
+ 'qr2bk1n/ppb1pprp/2pn2p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KRR2N b q - 7 7'\
+ 'b8c8'
+# 960, rook moved
+testfen 'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/3R4/PPP1P1PP/BBN1KRNQ b Kkq - 1 3'\
+ 'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/8/PPP1P1PP/BBNRKRNQ w KQkq - 0 3'\
+ 'd1d3'
+# 960, rook moved
+testfen 'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/5R2/PPP1P1PP/BBNRK1NQ b Qkq - 1 3'\
+ 'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/8/PPP1P1PP/BBNRKRNQ w KQkq - 0 3'\
+ 'f1f3'
+# 960, rook moved
+testfen 'bbn1krnq/ppp1p1pp/3r4/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ w KQk - 1 4'\
+ 'bbnrkrnq/ppp1p1pp/8/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ b KQkq - 0 3'\
+ 'd8d6'
+# 960, rook moved
+testfen 'bbnrk1nq/ppp1p1pp/5r2/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ w KQq - 1 4'\
+ 'bbnrkrnq/ppp1p1pp/8/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ b KQkq - 0 3'\
+ 'f8f6'
+# 960, en passant move
+testfen 'bbnrk1nq/ppp1p2p/3r4/3p1ppP/P2P1P2/8/1PP1P1P1/BBNRKRNQ w KQq g6 0 6'\
+ 'bbnrk1nq/ppp1p1pp/3r4/3p1p1P/P2P1P2/8/1PP1P1P1/BBNRKRNQ b KQq - 0 5'\
+ 'g7g5'
+# 960, en passant take
+testfen 'bbnrk1nq/ppp1p2p/3r2P1/3p1p2/P2P1P2/8/1PP1P1P1/BBNRKRNQ b KQq - 0 6'\
+ 'bbnrk1nq/ppp1p2p/3r4/3p1ppP/P2P1P2/8/1PP1P1P1/BBNRKRNQ w KQq g6 0 6'\
+ 'h5g6'
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.