void * rd_median_of_three(void *base, size_t nmemb, size_t size, int (*cmp)(const void *, const void *)) { void * med = (void*)((uint8_t *)base + (nmemb / 2) * size); const void * last = (void*)((uint8_t *)base + (nmemb - 1) * size); if (cmp(last, base) < 0) { rd_swap(last, base, size); } if (cmp(med, base) < 0) { rd_swap(med, base, size); } if (cmp(last, med) < 0) { rd_swap(last, med, size); } return med; }
void CMap::Init() { m_vecBackLine.reserve((GRID_X_NUM + 1) * 2 + (GRID_Y_NUM + 1) * 2); //back line x for (int i = 0; i < GRID_X_NUM + 1; ++i) { Vec2F pt; pt.x = i * GRID_WIDTH; pt.y = 0; m_vecBackLine.push_back(pt); pt.x = i * GRID_WIDTH; pt.y = GRID_Y_NUM * GRID_HEIGHT; m_vecBackLine.push_back(pt); } //back line y for (int i = 0; i < GRID_Y_NUM + 1; ++i) { Vec2F pt; pt.x = 0; pt.y = i * GRID_HEIGHT; m_vecBackLine.push_back(pt); pt.x = GRID_X_NUM * GRID_WIDTH; pt.y = i * GRID_HEIGHT ; m_vecBackLine.push_back(pt); } m_vecGrid.reserve(GRID_X_NUM * GRID_Y_NUM); m_vecRect.reserve(GRID_X_NUM * GRID_Y_NUM); // grid for (int i = 0; i < GRID_X_NUM; ++i) { for (int j = 0; j < GRID_Y_NUM; ++j) { stGrid grid; grid.pt.Set(i, j); grid.bBlock = false; m_vecGrid.push_back(grid); RectF rect; rect.SetRect(i * GRID_WIDTH, j * GRID_HEIGHT, (i + 1) * GRID_WIDTH, (j + 1) * GRID_HEIGHT); m_vecRect.push_back(rect); } } // block grid m_vecBlock.reserve(BLOCK_NUM); // BLOCK_NUM 个随机数,范围 num = [1 - GRID_X_NUM * GRID_Y_NUM) // 输出到坐标:row = num / GRID_X_NUM, col = num % GRID_X_NUM int grid_num[GRID_X_NUM * GRID_Y_NUM]; int size = count_of(grid_num); for (int i = 0; i < size; ++i) { grid_num[i] = i; } // 打乱前BLOCK_NUM数 for (int i = 0; i < BLOCK_NUM; ++i) { int index = random<int>(i, size - 1); rd_swap(grid_num[i], grid_num[index]); int num = grid_num[i]; int row = num / GRID_X_NUM; int col = num % GRID_X_NUM; m_vecGrid[num].bBlock = true; RectF rect; rect.SetRect(col * GRID_WIDTH, row * GRID_HEIGHT, (col + 1) * GRID_WIDTH, (row + 1) * GRID_HEIGHT); m_vecBlock.push_back(rect); } //随机生成人物的位置,在红色格子上 while (true) { int index = rand() % m_vecGrid.size(); if (! m_vecGrid[index].bBlock) { m_pos = m_vecGrid[index].pt; m_rect.SetRect(m_pos.x * GRID_WIDTH, m_pos.y * GRID_HEIGHT, (m_pos.x + 1) * GRID_WIDTH, (m_pos.y + 1) * GRID_HEIGHT); break; } } m_Astar.SetTileJudge(this); }