src/chess/king.c

Thu, 03 Sep 2026 12:13:05 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 03 Sep 2026 12:13:05 +0200
changeset 214
31d73d150c76
parent 195
27d02ccb0cef
permissions
-rw-r--r--

make all should really build all (including the tests)

we removed the tests from the all-target initially
because they will cause warnings with compilers not
supporting C23

but we should not care too much about this

10
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
55
54ea19938d57 updated copyright and version info
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
4 * Copyright 2016 Mike Becker. All rights reserved.
10
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 *
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 */
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29
16
a298c6637c30 introduced status codes for get_location to produce detailed error messages + added knight rules
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
30 #include "rules.h"
10
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 #include "king.h"
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
32
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
33 static bool king_castling_chkmoved(
195
27d02ccb0cef flip File and Rank parameters into correct order
Mike Becker <universe@uap-core.de>
parents: 194
diff changeset
34 const GameState *gamestate, File file, Rank rank) {
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
35
98
9cb41383540f change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
36 for (unsigned i = 0; i < gamestate->movecount; i++) {
9cb41383540f change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
37 if (gamestate->moves[i].fromfile == file
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
38 && gamestate->moves[i].fromrank == rank) {
80
b980a7192b5a replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents: 64
diff changeset
39 return true;
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
40 }
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
41 }
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
42
80
b980a7192b5a replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents: 64
diff changeset
43 return false;
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
44 }
10
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
46 bool king_chkrules(const GameState *gamestate, const Move* move) {
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
47 if (abs(move->torank - move->fromrank) <= 1 &&
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
48 abs(move->tofile - move->fromfile) <= 1) {
80
b980a7192b5a replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents: 64
diff changeset
49 return true;
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
50 } else {
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
51 /* castling */
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
52 if (move->fromrank == move->torank &&
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
53 move->fromrank == (piece_color(move->piece) == WHITE ? 0 : 7) &&
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
54 move->fromfile == fileidx('e') &&
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
55 (move->tofile == fileidx('c') || move->tofile == fileidx('g'))) {
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
56
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
57 return !king_castling_chkmoved(gamestate,
195
27d02ccb0cef flip File and Rank parameters into correct order
Mike Becker <universe@uap-core.de>
parents: 194
diff changeset
58 move->fromfile, move->fromrank) &&
27d02ccb0cef flip File and Rank parameters into correct order
Mike Becker <universe@uap-core.de>
parents: 194
diff changeset
59 !king_castling_chkmoved(gamestate,
27d02ccb0cef flip File and Rank parameters into correct order
Mike Becker <universe@uap-core.de>
parents: 194
diff changeset
60 move->tofile == fileidx('c') ? 0 : 7, move->fromrank);
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
61 } else {
80
b980a7192b5a replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents: 64
diff changeset
62 return false;
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
63 }
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
64 }
10
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 }
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
67 bool king_isblocked(const GameState *gamestate, const Move *move) {
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
68
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
69 Color op_color = opponent_color(piece_color(move->piece));
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
70
64
4eda5df55f86 fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents: 55
diff changeset
71 /* being in check does not "block" the king, so don't test it here */
80
b980a7192b5a replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents: 64
diff changeset
72 bool blocked = false;
47
d726e4b46c33 refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents: 25
diff changeset
73
64
4eda5df55f86 fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents: 55
diff changeset
74 /* just test, if castling move is blocked */
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
75 if (abs(move->tofile - move->fromfile) == 2) {
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
76 if (move->tofile == fileidx('c')) {
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
77 blocked |= gamestate->board[move->torank][fileidx('b')];
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
78 }
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
79 File midfile = (move->tofile+move->fromfile)/2;
161
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
80 bool incheck = false;
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
81 if (gamestate->movecount > 0) {
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
82 incheck = is_check_position(gamestate);
161
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
83 }
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
84 blocked |= incheck || gamestate->board[move->torank][midfile] ||
195
27d02ccb0cef flip File and Rank parameters into correct order
Mike Becker <universe@uap-core.de>
parents: 194
diff changeset
85 is_covered(gamestate, midfile, move->torank, op_color);
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
86 }
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
87
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
88 return blocked;
10
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
89 }
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
90
170
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
91 size_t king_moves(const GameState *gamestate,
195
27d02ccb0cef flip File and Rank parameters into correct order
Mike Becker <universe@uap-core.de>
parents: 194
diff changeset
92 Color c, File f, Rank r, Move *moves) {
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
93
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
94 size_t count = 0;
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
95 Piece king = mkpiece(KING, c);
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
96
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
97 for (int dr = -1 ; dr <= 1 ; dr++) {
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
98 for (int df = -1 ; df <= 1 ; df++) {
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
99 if (dr == 0 && df == 0) {
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
100 continue;
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
101 }
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
102
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
103 Rank torank = r + dr;
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
104 File tofile = f + df;
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
105
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
106 if (!isidx(torank) || !isidx(tofile)) {
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
107 continue;
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
108 }
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
109
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
110 moves[count] = (Move){0};
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
111 moves[count].piece = king;
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
112 moves[count].fromrank = r;
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
113 moves[count].fromfile = f;
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
114 moves[count].torank = torank;
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
115 moves[count].tofile = tofile;
195
27d02ccb0cef flip File and Rank parameters into correct order
Mike Becker <universe@uap-core.de>
parents: 194
diff changeset
116 moves[count].capture = piece_at(gamestate, tofile, torank) != 0;
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
117 count++;
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
118 }
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
119 }
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
120
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
121 Rank homerank = c == WHITE ? 0 : 7;
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
122 if (r == homerank && f == fileidx('e')) {
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
123 moves[count] = (Move){0};
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
124 moves[count].piece = king;
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
125 moves[count].fromrank = r;
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
126 moves[count].fromfile = f;
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
127 moves[count].torank = r;
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
128 moves[count].tofile = fileidx('c');
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
129 count++;
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
130
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
131 moves[count] = (Move){0};
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
132 moves[count].piece = king;
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
133 moves[count].fromrank = r;
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
134 moves[count].fromfile = f;
194
619f07c95894 rename Row to Rank
Mike Becker <universe@uap-core.de>
parents: 193
diff changeset
135 moves[count].torank = r;
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
136 moves[count].tofile = fileidx('g');
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
137 count++;
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
138 }
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
139
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
140 return count;
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
141 }

mercurial