// Marks the path of the laser until it hits a piece or goes off the board. // Returns the number of unpinned pawns. // // p : current board state // laser_map : end result will be stored here. Every square on the // path of the laser is marked with mark_mask // c : color of king shooting laser // mark_mask: what each square is marked with int mark_laser_path(position_t *p, char *laser_map, color_t c, char mark_mask) { int pinned_pawns = 0; uint8_t total_pawns; color_t color = opp_color(c); square_t o_king_sq = p->kloc[color]; if (c == WHITE) { // opposing king pins our pawns total_pawns = p->pawn_count[BLACK]; } else { total_pawns = p->pawn_count[WHITE]; } // Fire laser, recording in laser_map square_t sq = p->kloc[c]; int bdir = ori_of(p->board[sq]); int beam = beam_of(bdir); tbassert(ptype_of(p->board[sq]) == KING, "ptype: %d\n", ptype_of(p->board[sq])); laser_map[sq] |= mark_mask; // we update h_attackable here h_attackable = h_dist(sq, o_king_sq); while (true) { sq += beam; laser_map[sq] |= mark_mask; tbassert(sq < ARR_SIZE && sq >= 0, "sq: %d\n", sq); switch (ptype_of(p->board[sq])) { case EMPTY: // empty square h_attackable += h_dist(sq, o_king_sq); break; case PAWN: // Pawn h_attackable += h_dist(sq, o_king_sq); if (color_of(p->board[sq]) == color) { pinned_pawns += 1; } bdir = reflect_of(bdir, ori_of(p->board[sq])); if (bdir < 0) { // Hit back of Pawn return total_pawns - pinned_pawns; } beam = beam_of(bdir); break; case KING: // King h_attackable += h_dist(sq, o_king_sq); return total_pawns - pinned_pawns; break; case INVALID: // Ran off edge of board return total_pawns - pinned_pawns; break; default: // Shouldna happen, man! tbassert(false, "Not cool, man. Not cool.\n"); break; } } }
// H_SQUARES_ATTACKABLE heuristic: for shooting the enemy king int h_squares_attackable(position_t *p, color_t c) { char* laser_map; if (c == WHITE) { laser_map = laser_map_white; } else { laser_map = laser_map_black; } square_t o_king_sq = p->kloc[opp_color(c)]; tbassert(ptype_of(p->board[o_king_sq]) == KING, "ptype: %d\n", ptype_of(p->board[o_king_sq])); tbassert(color_of(p->board[o_king_sq]) != c, "color: %d\n", color_of(p->board[o_king_sq])); float h_attackable_temp = 0; for (fil_t f = 0; f < BOARD_WIDTH; f++) { for (rnk_t r = 0; r < BOARD_WIDTH; r++) { square_t sq = square_of(f, r); if (laser_map[sq] != 0) { h_attackable_temp += h_dist(sq, o_king_sq); } } } return h_attackable_temp; }
static long hamm_dist(register char *p, register char *q) { return h_dist(0) + h_dist(1) + h_dist(2) + h_dist(3) + h_dist(4); }
//#line 36 "../PROTOTYPES/ladders.ch" long hamm_dist(register char *p, register char *q) //#line 327 "../ladders.w" { return h_dist(0) + h_dist(1) + h_dist(2) + h_dist(3) + h_dist(4); }