@XerimHD

Консоль игра, попадает в бесконечный цикл,что тут не так?

вот пример кода
r_placed =false;
if (!r_placed)
    {

        int room_num = rand() % 5 + 5; // число комнат
        // коридоры
        int r_old_center_y, r_old_center_x, r_center_y, r_center_x;

        /// база даных
        for (int y = 0; y < rows; y++)
        {
            for (int x = 0; x < cols; x++)
            {

                if (y == 0 || y == rows - 2 || x == 0 || x == cols - 1)
                {
                    map[y][x] = '%'; // записываем  барьер в базу
                }
                else
                {
                    map[y][x] = '#'; // записываем  стену в базу
                }
            }
        }
        int try_counter = 0; //  изменяряет попытки генерации комнат

        while (r_placed < room_num)
        {

            do
            {
                collision = false;
                // делаем кординаты комнате
                ry = rand() % (rows - 4) + 1;
                rx = rand() % (cols - 4) + 1;
                r_size_y = rand() % 5 + 4;
                r_size_x = rand() % 10 + 8;
                for (int y = ry; y < ry + r_size_y; y++)
                {

                    for (int x = rx; x < rx + r_size_x; x++)
                    {
                        if (map[y][x] == '%' || map[y][x] == '  ' || map[y + 2][x] == '  ' || map[y - 2][x] == '  ' || map[y][x + 2] == '  ' || map[y][x - 2] == '  ')
                        {
                            y = ry + r_size_y;
                            collision = true;
                            break;
                        }
                    }
                }
                try_counter++;
                if (try_counter > 100)
                {
                    r_placed = room_num;
                }

Програма входит в бесконечный цикл когда пытаеться создать >5
когда <5 тоже иногда может войти ну очень редко
я вроде поставил поставил try_counter чтоб измерять сколько попыток,и если больше выйти,програма должна была отрисовать сколько смог записать(Например надо было создать 10 комант,а получилось записать только 3,тогда 3 надо вывести),ну она так не роботате как было задумано.
Обясните что не так роботает.
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вы случайным образом генерируете координаты комнаты в цикле, пока вам не повезет выбрать полностью пустое место (while (collision == true);).

Но, чем больше заполнено поле, тем меньше вероятность найти пустое место. Может вообще быть так, что комната заданного размера просто не помещается на поле, потому что вы неудачно запихали предыдущие комнаты по середине, перекрыв все пространство. В итоге, если вам невезет, программа или очень долго ищет пустое место, или виснет, потому что его вообще нет.

Вам надо полностью переделать подход к генерации комнат. Или разрешите им пересекаться, или требуйте чтобы комнаты по прощади занимали сильно меньше всего пространства. Далее, если у вас очень много попыток было сделано, а вы так и не нашли пустое место для комнаты - надо перезапустить всю генерацию заново. Вы там try_counter уже считаете, но никак на него не реагируете.

Еще можно сделать немного по другому - вместо случайного выбора места и потом проверки на пересечение, найдите все места, куда комнату можно впихнуть и из их списка выбирайте случайное одним rand(). Тут уже не будет цикла, завершающегося только когда вам повезло. Но тут тоже может быть проблема, что мест для размещения новой комнаты вообще нет. Или перезапускайте с нуля расстановку комнат, или требуйте, чтобы они были маленькие. Еще можно их ставить в порядке от больших к маленьким.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы