1.1 --- a/src/rules/knight.c Fri Mar 28 11:45:01 2014 +0100 1.2 +++ b/src/rules/knight.c Fri Mar 28 14:32:52 2014 +0100 1.3 @@ -28,18 +28,106 @@ 1.4 */ 1.5 1.6 #include "knight.h" 1.7 +#include "rules.h" 1.8 +#include <math.h> 1.9 1.10 -_Bool knight_chkrules(Board board, Move *move) { 1.11 - // TODO: implement 1.12 - return FALSE; 1.13 +_Bool knight_chkrules(Move *move) { 1.14 + int dx = abs(move->fromfile - move->tofile); 1.15 + int dy = abs(move->fromrow - move->torow); 1.16 + 1.17 + return (dx == 2 && dy == 1) || (dx == 1 && dy == 2); 1.18 } 1.19 1.20 -_Bool knight_isblocked(Board board, Move *move) { 1.21 - // TODO: implement 1.22 - return TRUE; 1.23 +static int knight_getloc_fixedrow(Board board, Move *move) { 1.24 + int d = 3 - abs(move->fromrow - move->torow); 1.25 + 1.26 + if (d == 1 || d == 2) { 1.27 + if (move->tofile < 6 && 1.28 + board[move->fromrow][move->tofile + d] == move->piece) { 1.29 + if (move->fromfile == POS_UNSPECIFIED) { 1.30 + move->fromfile = move->tofile + d; 1.31 + return VALID_MOVE_SYNTAX; 1.32 + } else { 1.33 + return AMBIGUOUS_MOVE; 1.34 + } 1.35 + } 1.36 + if (move->tofile > 1 && 1.37 + board[move->fromrow][move->tofile - d] == move->piece) { 1.38 + if (move->fromfile == POS_UNSPECIFIED) { 1.39 + move->fromfile = move->tofile - d; 1.40 + return VALID_MOVE_SYNTAX; 1.41 + } else { 1.42 + return AMBIGUOUS_MOVE; 1.43 + } 1.44 + } 1.45 + } 1.46 + 1.47 + return INVALID_POSITION; 1.48 } 1.49 1.50 -_Bool knight_getlocation(Board board, Move *move) { 1.51 - // TODO: implement 1.52 - return FALSE; 1.53 +static int knight_getloc_fixedfile(Board board, Move *move) { 1.54 + int d = 3 - abs(move->fromfile - move->tofile); 1.55 + 1.56 + if (d == 1 || d == 2) { 1.57 + if (move->torow < 6 && 1.58 + board[move->torow + d][move->fromfile] == move->piece) { 1.59 + if (move->fromrow == POS_UNSPECIFIED) { 1.60 + move->fromrow = move->torow + d; 1.61 + return VALID_MOVE_SYNTAX; 1.62 + } else { 1.63 + return AMBIGUOUS_MOVE; 1.64 + } 1.65 + } 1.66 + if (move->torow > 1 && 1.67 + board[move->torow - d][move->fromfile] == move->piece) { 1.68 + if (move->fromrow == POS_UNSPECIFIED) { 1.69 + move->fromrow = move->torow - d; 1.70 + return VALID_MOVE_SYNTAX; 1.71 + } else { 1.72 + return AMBIGUOUS_MOVE; 1.73 + } 1.74 + } 1.75 + } 1.76 + 1.77 + return INVALID_POSITION; 1.78 } 1.79 + 1.80 +int knight_getlocation(Board board, Move *move) { 1.81 + 1.82 + if (move->fromfile != POS_UNSPECIFIED) { 1.83 + return knight_getloc_fixedfile(board, move); 1.84 + } 1.85 + 1.86 + if (move->fromrow != POS_UNSPECIFIED) { 1.87 + return knight_getloc_fixedrow(board, move); 1.88 + } 1.89 + 1.90 + for (int x = -2 ; x <= 2 ; x++) { 1.91 + if (x == 0) { 1.92 + continue; 1.93 + } 1.94 + for (int y = -2 ; y <= 2 ; y++) { 1.95 + if (y == 0 || y == x) { 1.96 + continue; 1.97 + } 1.98 + uint8_t cx = move->tofile + x; 1.99 + uint8_t cy = move->torow + y; 1.100 + 1.101 + if (isidx(cx) && isidx(cy) && board[cy][cx] == move->piece) { 1.102 + if (move->fromfile == POS_UNSPECIFIED 1.103 + && move->fromrow == POS_UNSPECIFIED) { 1.104 + move->fromfile = cx; 1.105 + move->fromrow = cy; 1.106 + } else { 1.107 + return AMBIGUOUS_MOVE; 1.108 + } 1.109 + } 1.110 + } 1.111 + } 1.112 + 1.113 + if (move->fromfile == POS_UNSPECIFIED || move->fromrow == POS_UNSPECIFIED) { 1.114 + return INVALID_POSITION; 1.115 + } else { 1.116 + return VALID_MOVE_SYNTAX; 1.117 + } 1.118 +}