t_nodes do_perft(struct t_board *board, int depth) { struct t_move_list move_list[1]; struct t_move_list bad_move_list[1]; bad_move_list->count = 0; bad_move_list->imove = 0; struct t_undo undo[1]; t_nodes nodes = 0; int i; assert(integrity(board)); if (board->in_check) { generate_evade_check(board, move_list); if (depth == 1) return move_list->count; } else { //generate_captures(board, move_list); //generate_quiet_moves(board, move_list); generate_moves(board, move_list); //if (!equal_move_lists(move_list, xmove_list)){ // write_board(board, "board.txt"); // write_move_list(xmove_list, "all.txt"); // write_move_list(move_list, "inc.txt"); //} if (depth == 1) return legal_move_count(board, move_list); } for (i = move_list->count - 1; i >= 0; i--) { assert(lookup_move(board, move_as_str(move_list->move[i])) == move_list->move[i]); if (make_next_move(board, move_list, bad_move_list, undo)) { assert(integrity(board)); //nodes++; if (depth > 1) nodes += do_perft(board, depth - 1); else nodes++; unmake_move(board, undo); assert(integrity(board)); } else assert(integrity(board)); } return nodes; }
BOOL test_see() { t_move_record *move; BOOL ok = TRUE; set_fen(position, "2k1K3/7p/6p1/1p2RrR1/8/8/8/8 w - -"); move = lookup_move(position, "e5b5"); ok &= see(position, move, 0); move = lookup_move(position, "g5f5"); ok &= see(position, move, 0); move = lookup_move(position, "g5g6"); ok &= !see(position, move, 0); flip_board(position); move = lookup_move(position, "e4b4"); ok &= see(position, move, 0); move = lookup_move(position, "g4f4"); ok &= see(position, move, 0); move = lookup_move(position, "g4g3"); ok &= !see(position, move, 0); set_fen(position, "k7/4n3/5n2/3p4/8/2N5/6B1/K6Q w - -"); move = lookup_move(position, "c3d5"); ok &= see(position, move, 0); set_fen(position, "k7/4n3/5n2/3p4/8/2N5/6B1/K7 w - -"); move = lookup_move(position, "c3d5"); ok &= !see(position, move, 0); set_fen(position, "3k4/b7/1q6/8/3pK1RR/8/2N5/8 w - -"); move = lookup_move(position, "c2d4"); ok &= !see(position, move, 0); set_fen(position, "3k4/8/1q6/8/3p2R1/7K/2N5/8 w - -"); move = lookup_move(position, "c2d4"); ok &= see(position, move, 0); set_fen(position, "Q7/p2k4/2pq4/3B4/8/8/6PP/n2Kb3 w - -"); move = lookup_move(position, "a8c6"); ok &= !see(position, move, 0); ////-- Test SEE on a square set_fen(position, "4k3/1ppn4/p5rr/1B3p2/2p1p3/1b3P2/PPP1P1BR/3K3R w - -"); ok &= (see_safe(position, H6, 0) == FALSE); ok &= (see_safe(position, E4, 0) == FALSE); ok &= (see_safe(position, A6, 0) == TRUE); ok &= (see_safe(position, C4, 0) == TRUE); ok &= (see_safe(position, B3, 0) == FALSE); ok &= (see_safe(position, F5, 0) == TRUE); set_fen(position, "2k1K3/7p/6p1/1p2RrR1/8/8/8/8 w - -"); ok &= (see_safe(position, F5, 0) == FALSE); ok &= (see_safe(position, G6, 0) == TRUE); ok &= (see_safe(position, B5, 0) == FALSE); set_fen(position, "4k3/1ppn4/p5rr/1B3p2/2p1p3/1b3P2/PPP1P2R/3K3R w - -"); ok &= (see_safe(position, E4, 50) == FALSE); return ok; }