Beispiel #1
0
static void square_clear(board_t * board, int square, int piece) {

   int pos, piece_12, colour;
   int sq, size;

   ASSERT(board!=NULL);
   ASSERT(square_is_ok(square));
   ASSERT(piece_is_ok(piece));

   // init

   pos = board->pos[square];
   ASSERT(pos>=0);

   colour = piece_colour(piece);
   piece_12 = piece_to_12(piece);

   // square

   ASSERT(board->square[square]==piece);
   board->square[square] = Empty;

   ASSERT(board->pos[square]==pos);
   board->pos[square] = -1; // not needed

   // piece list

   ASSERT(board->variant==Horde?board->list_size[colour]>=1:board->list_size[colour]>=2);
   size = --board->list_size[colour];
   ASSERT(pos<=size);

   if (pos != size) {

      sq = board->list[colour][size];
      ASSERT(square_is_ok(sq));
      ASSERT(sq!=square);

      ASSERT(board->pos[sq]==size);
      board->pos[sq] = pos;

      ASSERT(board->list[colour][pos]==square);
      board->list[colour][pos] = sq;
   }

   board->list[colour][size] = SquareNone;

   // material

   ASSERT(board->number[piece_12]>=1);
   board->number[piece_12]--;

   // hash key

   board->key ^= random_64(RandomPiece+piece_12*64+square_to_64(square));
}
Beispiel #2
0
static void square_set(board_t * board, int square, int piece, int pos) {

   int piece_12, colour;
   int sq, size;

   ASSERT(board!=NULL);
   ASSERT(square_is_ok(square));
   ASSERT(piece_is_ok(piece));
   ASSERT(pos>=0);

   // init

   colour = piece_colour(piece);
   piece_12 = piece_to_12(piece);

   // square

   ASSERT(board->square[square]==Empty);
   board->square[square] = piece;

   ASSERT(board->pos[square]==-1);
   board->pos[square] = pos;

   // piece list

   size = board->list_size[colour]++;
   ASSERT(board->list[colour][size]==SquareNone);
   ASSERT(pos<=size);

   if (pos != size) {

      sq = board->list[colour][pos];
      ASSERT(square_is_ok(sq));
      ASSERT(sq!=square);

      ASSERT(board->pos[sq]==pos);
      board->pos[sq] = size;

      ASSERT(board->list[colour][size]==SquareNone);
      board->list[colour][size] = sq;
   }

   board->list[colour][pos] = square;

   // material

   ASSERT(board->number[piece_12]<=8);
   board->number[piece_12]++;

   // hash key

   board->key ^= random_64(RandomPiece+piece_12*64+square_to_64(square));
}
Beispiel #3
0
static void square_move(board_t * board, int from, int to, int piece) {

   int colour, pos;
   int piece_index;

   ASSERT(board!=NULL);
   ASSERT(square_is_ok(from));
   ASSERT(square_is_ok(to));
   ASSERT(piece_is_ok(piece));

   // init

   colour = piece_colour(piece);

   pos = board->pos[from];
   ASSERT(pos>=0);

   // from

   ASSERT(board->square[from]==piece);
   board->square[from] = Empty;

   ASSERT(board->pos[from]==pos);
   board->pos[from] = -1; // not needed

   // to

   ASSERT(board->square[to]==Empty);
   board->square[to] = piece;

   ASSERT(board->pos[to]==-1);
   board->pos[to] = pos;

   // piece list

   ASSERT(board->list[colour][pos]==from);
   board->list[colour][pos] = to;

   // hash key

   piece_index = RandomPiece + piece_to_12(piece) * 64;

   board->key ^= random_64(piece_index+square_to_64(from))
               ^ random_64(piece_index+square_to_64(to));
}
void board_init_list(board_t * board) {

   int sq_64, sq, piece;
   int colour, pos;

   ASSERT(board!=NULL);

   // init

   for (sq_64 = 0; sq_64 < 64; sq_64++) {
      sq = square_from_64(sq_64);
      board->pos[sq] = -1;
   }

   for (piece = 0; piece < 12; piece++) board->number[piece] = 0;

   // white piece list

   colour = White;
   pos = 0;

   for (sq_64 = 0; sq_64 < 64; sq_64++) {
      sq = square_from_64(sq_64);
      piece = board->square[sq];
      ASSERT(pos>=0&&pos<=16);
      if (colour_equal(piece,colour) && piece_is_king(piece)) {
         board->pos[sq] = (sint8)pos;
         board->list[colour][pos] = (uint8)sq;
         pos++;
         board->number[piece_to_12(piece)]++;
      }
   }
   ASSERT(pos==1);

   for (sq_64 = 0; sq_64 < 64; sq_64++) {
      sq = square_from_64(sq_64);
      piece = board->square[sq];
      ASSERT(pos>=0&&pos<=16);
      if (colour_equal(piece,colour) && !piece_is_king(piece)) {
         board->pos[sq] = (sint8)pos;
         board->list[colour][pos] = (uint8)sq;
         pos++;
         board->number[piece_to_12(piece)]++;
      }
   }

   ASSERT(pos>=1&&pos<=16);
   board->list[colour][pos] = SquareNone;
   board->list_size[colour] = (sint8)pos;

   // black piece list

   colour = Black;
   pos = 0;

   for (sq_64 = 0; sq_64 < 64; sq_64++) {
      sq = square_from_64(sq_64);
      piece = board->square[sq];
      ASSERT(pos>=0&&pos<=16);
      if (colour_equal(piece,colour) && piece_is_king(piece)) {
         board->pos[sq] = (sint8)pos;
         board->list[colour][pos] = (uint8)sq;
         pos++;
         board->number[piece_to_12(piece)]++;
      }
   }
   ASSERT(pos==1);

   for (sq_64 = 0; sq_64 < 64; sq_64++) {
      sq = square_from_64(sq_64);
      piece = board->square[sq];
      ASSERT(pos>=1&&pos<=16);
      if (colour_equal(piece,colour) && !piece_is_king(piece)) {
         board->pos[sq] = (sint8)pos;
         board->list[colour][pos] = (uint8)sq;
         pos++;
         board->number[piece_to_12(piece)]++;
      }
   }

   ASSERT(pos>=1&&pos<=16);
   board->list[colour][pos] = SquareNone;
   board->list_size[colour] = (sint8)pos;

   // hash key

   board->key = hash_key(board);
}
Beispiel #5
0
int piece_to_char(int piece) {

    ASSERT(piece_is_ok(piece));

    return PieceString[piece_to_12(piece)];
}