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( ); }
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; } } }