void Maze::AddExit(){ for (position p = at_((m_size-1),1); p <= at_((m_size-1),(m_size-2)); p += m_size){ if (data[p - 1] == SPACE){ data[p] = SPACE; exit = p; return; } } }
void Maze::Generate(unsigned size){ m_size = size; srand((unsigned)time(0)); m_wall_list.clear(); data.clear(); //black out whole maze. for (unsigned i = 0; i < (m_size*m_size); ++i) data.push_back(BLACK_SPACE); //add first wall and space data[at_(1, (m_size - 1))] = SPACE; AddWall(at_(1, (m_size - 2))); while (m_wall_list.size() != 0){ unsigned wall_index = (m_wall_list.size() == 1)? 0:rand() % (m_wall_list.size()-1); position wall_pos = m_wall_list[wall_index]; position opp_side = get_opp_side(wall_pos); if (opp_side == 0){ m_wall_list.erase(m_wall_list.begin() + wall_index); continue; } if (data[opp_side] == BLACK_SPACE && !In_wall_list(opp_side)){ data[wall_pos] = SPACE; m_wall_list.erase(m_wall_list.begin() + wall_index); AddSpace(opp_side); if (data[opp_side] == SPACE){ AddWall(opp_side + 1); AddWall(opp_side - 1); AddWall(opp_side + m_size); AddWall(opp_side - m_size); } } else m_wall_list.erase(m_wall_list.begin() + wall_index); } AddExit(); }
/*implicit*/ constexpr small_string(const char(&lit)[N]) : buf_{ at_(lit, 0), at_(lit, 1), at_(lit, 2), at_(lit, 3), at_(lit, 4), at_(lit, 5), at_(lit, 6), at_(lit, 7), at_(lit, 8), at_(lit, 9), at_(lit, 10), at_(lit, 11), at_(lit, 12), at_(lit, 13), at_(lit, 14), at_(lit, 15), at_(lit, 16), at_(lit, 17), at_(lit, 18), at_(lit, 19), at_(lit, 20), at_(lit, 21), at_(lit, 22), at_(lit, 23) } { static_assert(N <= info::max_length, "String literal too long for small_string."); static_assert(N > 0, "Non-null-terminated string literal."); }
Y at(size_t i, size_t j) { double y = i * h_zoom_inv; double x = j * w_zoom_inv; return at_(y, x); }
constexpr auto &&at(const array<T, N> &elems, std::initializer_list<size_t> list) { return at_(elems, begin(list)); }
constexpr auto &&at_(const array<T, N> &elems, const size_t *index) { return at_(elems[*index], index + 1); }