Вы можете думать о борту примерно directedgraph. Если вы хотите проверить «Возможно ли достичь последней строки?», Вы можете использовать хорошо известные алгоритмы как DFS или BFS.
Хорошо. Оно работает. Но это медленно. Поэтому вы не должны использовать какой-либо из этих алгоритмов после создания всей доски. Используйте его после любой сгенерированной строки! И если каждый узел из нового сырья недоступен, то обновите raw.
Если вы не хотите, чтобы алгоритм «сгенерировал и проверил», вы добавляете пустое сырое пространство, проверяете, сколько узлов доступно, а число rand - это число, сколько позволит идти вперед. Тогда произвольно получим подмножество из них.
Вы также можете написать простой случайный генератор, возвращающий ядро i из [0, n). Если последняя область находится слева, вы идете влево, если справа - справа, если это так же - вниз. Это хорошо, потому что, если вы близки к концу, вы, вероятно, вернетесь в другую сторону. Таким образом, он будет иметь хорошую форму. Но для широких карт он потеряет выгоды.
Лучше, но на этой же идее разумное использование распределения чисел в случайных генераторах. (например, посмотрите на случайную библиотеку Cpp или другие генераторы языков).
код на основе этой идеи (но очень, очень просто) в c++11:
constexpr size_t width = 8, height = 15;
std::vector<std::vector<bool>> board;
board.emplace_back(width, false);
board.front().front() = true;
size_t position = 0;
std::random_device gen;
while(board.size() < height) {
std::poisson_distribution<> d(position+(position < width/2 ? 1 : -1));
const size_t random = d(gen);
if(random == position) {
board.emplace_back(width, false);
board.back()[position] = true;
continue;
}
if(random < position && board.back()[position-1] == false)
board.back()[--position] = true;
else
if(position + 1 < width)
board.back()[++position] = true;
}
Пример вывода:
- # # # # # # #
- - - - - - - -
# # # # # # # -
# # # - - - - -
# # # - # # # #
# # # - - - # #
# # # # # - - #
# # # # # - - #
# # # # # - - -
# # # - - - - -
# # # - - # # #
# # # - - # # #
# # # - - # # #
# - - - - # # #
# - # # # # # #
Вы должны уточнить, действительно ли вы хотите, чтобы это было «невозможно». Например, что, если 2-я строка со дна - это все нули? Существует возможный путь через остальные строки (справа), но если игрок может видеть только 6 строк вперед, просто удача будет или нет, они будут выбирать правильный путь. Если вы не используете один и тот же формат дорожки каждый раз (позволяя игрокам запомнить его), вам следует избегать введения такого элемента удачи, поскольку даже бесконечно квалифицированный игрок в конечном итоге ошибается. – MooseBoys
Также FWIW похоже, что игра в видео, которую вы связывали, позволяла свободно перемещаться вдоль текущей строки автомобиля, независимо от того, какие препятствия были впереди в последнем обновлении. Это позволяет избежать проблемы в целом, так что вы можете начать там. – MooseBoys
Игрок увидит около 10 строк вперед. Это не должно быть невозможно, у него всегда должен быть «правильный» путь. –