Пример #1
0
int main()
{
// Establish initial board state:
	bool board[8][8];
	char opPos[2];
	char myPos[2];

	memset(board, true);

// Take input to decide if you are first or second player:
	if( firstPlayer )
		make_move( myPos, opPos );
	else
		take_move( );
}
Пример #2
0
int in_checkmate(B b)
{
  // Make a transposition table (maybe permanent?)
  if(!b->pieces[KING + 6 * b->side_to_move]) return 1; // Deals with
  // pins etc.
  Bitboard attackers;
	if(!(attackers = attacked(bit_scan_forwards(b->pieces[KING + 6 * 
		   b->side_to_move]), b->side_to_move, b))) return 0;
  Move *moves = malloc(sizeof(Move) * 8);
  int move_no = king_move_gen(b, b->side_to_move, moves);
  int i;
  for(i = 0; i < move_no; i++) {
    take_move(moves[i], b);
    if(!attacked(get_to(moves[i]), !b->side_to_move, b)) { // Because
      // we made an extra move, the side counter will be in the wrong 
      // position
      untake_move(moves[i], b);
      free(moves);
      return 0;
    }
    untake_move(moves[i], b);
  }
  free(moves);
  if(!(attackers & (attackers - 1))) { // Only one attacker
    int pos = bit_scan_forwards(attackers);
    if(attacked(pos, !b->side_to_move, b)) { 
     // printf("%s", sqs[pos]);
      return 0;
    } else {
      Bitboard k = b->pieces[KING + 6 * b->side_to_move];
      int piece = b->superbp[bit_scan_forwards(attackers)];
      switch(piece) {
        Bitboard s, j;
        case PAWN:
          return 1;
          break;
        case KNIGHT:
          return 1;
          break;
        case BISHOP:
          if(get_ray_attacks(b, NW, pos, bit_scan_forwards) & 
              b->pieces[KING + 6 * b->side_to_move]) {
             // Iterate through each bit, see if the square is attacked
            s = get_ray_attacks(b, NW, pos, bit_scan_forwards); 
          } else if (get_ray_attacks(b, NE, pos, bit_scan_forwards) &
                       b->pieces[KING + 6 * b->side_to_move]) {
            s = get_ray_attacks(b, NE, pos, bit_scan_forwards);
          } else if(get_ray_attacks(b, SE, pos, bit_scan_backwards) &
                      b->pieces[KING + 6 * b->side_to_move]) {
            s = get_ray_attacks(b, SE, pos, bit_scan_backwards);
          } else if(get_ray_attacks(b, SW, pos, bit_scan_backwards) &
                      b->pieces[KING + 6 * b->side_to_move]) {
            s = get_ray_attacks(b, SW, pos, bit_scan_backwards);
          }
          while(s)  
          #define T  if((j = attacked(pop_lsb(&s), !b->side_to_move, b) & \
                ~(k | k << 8 | k >> 8 | ((k & ~file[0]) << 7) |\
                 ((k & ~file[0]) >> 9) | ((k & ~file[7]) << 9) |\
                 ((k & ~file[7]) >> 7) | (k << 1 & ~file[0]) |\
                 (k >> 1 & ~file[7])))){\
                   return 0;\
                   printf("foo");\
                  }
              T
          return 1;
            break;
          case ROOK:
            if(get_ray_attacks(b, N, pos, bit_scan_forwards) & 
               b->pieces[KING + 6 * b->side_to_move]) {
             // Iterate through each bit, see if the square is attacked
             s = get_ray_attacks(b, N, pos, bit_scan_forwards); 
            } else if (get_ray_attacks(b, E, pos, bit_scan_forwards) &
                       b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, E, pos, bit_scan_forwards);
            } else if(get_ray_attacks(b, S,pos, bit_scan_backwards) &
                      b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, S, pos, bit_scan_backwards);
            } else if(get_ray_attacks(b, W, pos, bit_scan_backwards) &
                      b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, W, pos, bit_scan_backwards);
            }
            while(s) T
            return 1;
            break;
          case QUEEN:
            if(get_ray_attacks(b, NW, pos, bit_scan_forwards) & 
               b->pieces[KING + 6 * b->side_to_move]) {
             s = get_ray_attacks(b, NW, pos, bit_scan_forwards); 
            } else if (get_ray_attacks(b, NE, pos, bit_scan_forwards) &
                       b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, NE, pos, bit_scan_forwards);
            } else if(get_ray_attacks(b, SE, pos, bit_scan_backwards) &
                      b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, SE, pos, bit_scan_backwards);
            } else if(get_ray_attacks(b, SW, pos, bit_scan_backwards) &
                      b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, SW, pos, bit_scan_backwards);
            } else if(get_ray_attacks(b, N, pos, bit_scan_forwards) & 
               b->pieces[KING + 6 * b->side_to_move]) {
             s = get_ray_attacks(b, N, pos, bit_scan_forwards); 
            } else if (get_ray_attacks(b, E, pos, bit_scan_forwards) &
                       b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, E, pos, bit_scan_forwards);
            } else if(get_ray_attacks(b, S, pos, bit_scan_backwards) &
                      b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, S, pos, bit_scan_backwards);
            } else if(get_ray_attacks(b, W, pos, bit_scan_backwards) &
                      b->pieces[KING + 6 * b->side_to_move]) {
              s = get_ray_attacks(b, W, pos, bit_scan_backwards);
            }
            while(s) T
            return 1;
            break;
          case KING:
            return 1;
            break;
          default:
            break;
        }
      }
  }