src/rules/knight.c

changeset 16
a298c6637c30
parent 12
84880c7e1ea6
equal deleted inserted replaced
15:7ffd66591afe 16:a298c6637c30
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 * 27 *
28 */ 28 */
29 29
30 #include "knight.h" 30 #include "knight.h"
31 #include "rules.h"
32 #include <math.h>
31 33
32 _Bool knight_chkrules(Board board, Move *move) { 34 _Bool knight_chkrules(Move *move) {
33 // TODO: implement 35 int dx = abs(move->fromfile - move->tofile);
34 return FALSE; 36 int dy = abs(move->fromrow - move->torow);
37
38 return (dx == 2 && dy == 1) || (dx == 1 && dy == 2);
35 } 39 }
36 40
37 _Bool knight_isblocked(Board board, Move *move) { 41 static int knight_getloc_fixedrow(Board board, Move *move) {
38 // TODO: implement 42 int d = 3 - abs(move->fromrow - move->torow);
39 return TRUE; 43
44 if (d == 1 || d == 2) {
45 if (move->tofile < 6 &&
46 board[move->fromrow][move->tofile + d] == move->piece) {
47 if (move->fromfile == POS_UNSPECIFIED) {
48 move->fromfile = move->tofile + d;
49 return VALID_MOVE_SYNTAX;
50 } else {
51 return AMBIGUOUS_MOVE;
52 }
53 }
54 if (move->tofile > 1 &&
55 board[move->fromrow][move->tofile - d] == move->piece) {
56 if (move->fromfile == POS_UNSPECIFIED) {
57 move->fromfile = move->tofile - d;
58 return VALID_MOVE_SYNTAX;
59 } else {
60 return AMBIGUOUS_MOVE;
61 }
62 }
63 }
64
65 return INVALID_POSITION;
40 } 66 }
41 67
42 _Bool knight_getlocation(Board board, Move *move) { 68 static int knight_getloc_fixedfile(Board board, Move *move) {
43 // TODO: implement 69 int d = 3 - abs(move->fromfile - move->tofile);
44 return FALSE; 70
71 if (d == 1 || d == 2) {
72 if (move->torow < 6 &&
73 board[move->torow + d][move->fromfile] == move->piece) {
74 if (move->fromrow == POS_UNSPECIFIED) {
75 move->fromrow = move->torow + d;
76 return VALID_MOVE_SYNTAX;
77 } else {
78 return AMBIGUOUS_MOVE;
79 }
80 }
81 if (move->torow > 1 &&
82 board[move->torow - d][move->fromfile] == move->piece) {
83 if (move->fromrow == POS_UNSPECIFIED) {
84 move->fromrow = move->torow - d;
85 return VALID_MOVE_SYNTAX;
86 } else {
87 return AMBIGUOUS_MOVE;
88 }
89 }
90 }
91
92 return INVALID_POSITION;
45 } 93 }
94
95 int knight_getlocation(Board board, Move *move) {
96
97 if (move->fromfile != POS_UNSPECIFIED) {
98 return knight_getloc_fixedfile(board, move);
99 }
100
101 if (move->fromrow != POS_UNSPECIFIED) {
102 return knight_getloc_fixedrow(board, move);
103 }
104
105 for (int x = -2 ; x <= 2 ; x++) {
106 if (x == 0) {
107 continue;
108 }
109 for (int y = -2 ; y <= 2 ; y++) {
110 if (y == 0 || y == x) {
111 continue;
112 }
113 uint8_t cx = move->tofile + x;
114 uint8_t cy = move->torow + y;
115
116 if (isidx(cx) && isidx(cy) && board[cy][cx] == move->piece) {
117 if (move->fromfile == POS_UNSPECIFIED
118 && move->fromrow == POS_UNSPECIFIED) {
119 move->fromfile = cx;
120 move->fromrow = cy;
121 } else {
122 return AMBIGUOUS_MOVE;
123 }
124 }
125 }
126 }
127
128 if (move->fromfile == POS_UNSPECIFIED || move->fromrow == POS_UNSPECIFIED) {
129 return INVALID_POSITION;
130 } else {
131 return VALID_MOVE_SYNTAX;
132 }
133 }

mercurial