Пример #1
0
bool piece_attack(const board_t * board, int piece, int from, int to) {

    int delta;
    int inc, sq;

    ASSERT(board_is_ok(board));
    ASSERT(piece_is_ok(piece));
    ASSERT(square_is_ok(from));
    ASSERT(square_is_ok(to));

    delta = to - from;
    ASSERT(delta_is_ok(delta));

    if ((piece & DELTA_MASK(delta)) == 0) return false; // no pseudo-attack

    if (!piece_is_slider(piece)) return true;

    inc = DELTA_INC(delta);
    ASSERT(inc_is_ok(inc));

    for (sq = from+inc; sq != to; sq += inc) {
        ASSERT(square_is_ok(sq));
        if (board->square[sq] != Empty) return false; // blocker
    }

    return true;
}
Пример #2
0
bool attack_is_ok(const attack_t * attack) {

   int i;
   int sq, inc;

   if (attack == NULL) return false;

   // checks

   if (attack->dn < 0 || attack->dn > 2) return false;

   for (i = 0; i < attack->dn; i++) {
      sq = attack->ds[i];
      if (!SQUARE_IS_OK(sq)) return false;
      inc = attack->di[i];
      if (inc != IncNone && !inc_is_ok(inc)) return false;
   }

   if (attack->ds[attack->dn] != SquareNone) return false;
   if (attack->di[attack->dn] != IncNone) return false;

   return true;
}