예제 #1
0
파일: rtbgen.c 프로젝트: RyanTaker/tb
// check whether all moves end up in wins for the opponent
// if we are here, all captures are losing
static int check_loss(int *pcs, long64 idx0, ubyte *table, bitboard occ, int *p)
{
  int sq;
  long64 idx, idx2;
  bitboard bb;
  int best = LOSS_IN_ONE;

  int k = *pcs++;
  if (k == 0) { // white king
    bb = WhiteKingMoves;
    while (bb) {
      sq = FirstOne(bb);
      idx2 = MakeMove0(idx0, sq);
      int v = win_loss[table[idx2]];
      if (!v) return 0;
      if (v < best) best = v;
      ClearFirst(bb);
    }
  } else { // otherwise k == 1, i.e. black king
    bb = BlackKingMoves;
    while (bb) {
      sq = FirstOne(bb);
      idx2 = MakeMove1(idx0, sq);
      int v = win_loss[table[idx2]];
      if (!v) return 0;
      if (v < best) best = v;
      ClearFirst(bb);
    }
  }
  while ((k = *pcs++) >= 0) {
    bb = PieceMoves(p[k], pt[k], occ);
    idx = idx0 & ~mask[k];
    while (bb) {
      sq = FirstOne(bb);
      idx2 = MakeMove2(idx, k, sq);
      int v = win_loss[table[idx2]];
      if (!v) return 0;
      if (v < best) best = v;
      ClearFirst(bb);
    }
  }

  return best;
}
예제 #2
0
// captures should be taken care of already
int check_mate_pieces(int *pcs, long64 idx0, ubyte *table, bitboard occ, int *p)
{
  int sq;
  long64 idx, idx2;
  bitboard bb;

  do {
    int k = *pcs;
    bb = PieceMoves(p[k], pt[k], occ);
    idx = idx0 & ~mask[k];
    while (bb) {
      sq = FirstOne(bb);
      idx2 = MakeMove(idx, k, sq);
      if (table[idx2] < WDL_ILLEGAL) return 0;
      ClearFirst(bb);
    }
  } while (*(++pcs) >= 0);

  return 1;
}
예제 #3
0
파일: rtbgen.c 프로젝트: RyanTaker/tb
static int check_mate(int *pcs, long64 idx0, ubyte *table, bitboard occ, int *p)
{
  int sq;
  long64 idx, idx2;
  bitboard bb;

  int k = *pcs++;
  if (k == 0) { // white king
    bb = WhiteKingMoves;
    while (bb) {
      sq = FirstOne(bb);
      idx2 = MakeMove0(idx0, sq);
      if (table[idx2] != ILLEGAL) return 0;
      ClearFirst(bb);
    }
  } else { // otherwise k == 1, i.e. black king
    bb = BlackKingMoves;
    while (bb) {
      sq = FirstOne(bb);
      idx2 = MakeMove1(idx0, sq);
      if (table[idx2] != ILLEGAL) return 0;
      ClearFirst(bb);
    }
  }
  while ((k = *pcs++) >= 0) {
    bb = PieceMoves(p[k], pt[k], occ);
    idx = idx0 & ~mask[k];
    while (bb) {
      sq = FirstOne(bb);
      idx2 = MakeMove2(idx, k, sq);
      if (table[idx2] != ILLEGAL) return 0;
      ClearFirst(bb);
    }
  }

  return 1;
}