2014-10-29 4 views
2

Я работаю над игрой для iOS, и я застрял на чем-то.путь генератор видеоигры алгоритм

Идея проста: у меня есть игрок, который должен идти вперед, чтобы выиграть очки (и избежать желтых кирпичей). Здесь (на зеленом) идеальный путь, чтобы идти вперед внутри прямоугольника (снизу вверх).

Я добавляю новую строку каждый раз, поэтому каждая новая строка должна позволять игроку двигаться вперед (он может перемещаться влево, вправо и вправо, без диагонали).

Идея заключается в том, чтобы иметь некоторые «паразит» пустые места, так что пользователь должен думать о своем следующем move.`

Итак, мой вопрос: как генерировать что-то вроде этого (для любого числа столбцов) enter image description here

Спасибо.

C.C.

+0

Вы должны уточнить, действительно ли вы хотите, чтобы это было «невозможно». Например, что, если 2-я строка со дна - это все нули? Существует возможный путь через остальные строки (справа), но если игрок может видеть только 6 строк вперед, просто удача будет или нет, они будут выбирать правильный путь. Если вы не используете один и тот же формат дорожки каждый раз (позволяя игрокам запомнить его), вам следует избегать введения такого элемента удачи, поскольку даже бесконечно квалифицированный игрок в конечном итоге ошибается. – MooseBoys

+0

Также FWIW похоже, что игра в видео, которую вы связывали, позволяла свободно перемещаться вдоль текущей строки автомобиля, независимо от того, какие препятствия были впереди в последнем обновлении. Это позволяет избежать проблемы в целом, так что вы можете начать там. – MooseBoys

+0

Игрок увидит около 10 строк вперед. Это не должно быть невозможно, у него всегда должен быть «правильный» путь. –

ответ

1

Лично я хотел бы решить эту назад:

Сформировать «правильный» путь, то рандомизации оставшиеся клетки с некоторой эвристики, что предотвращает его от генерации «неправильный» путь.

Эвристический может быть что-то похожее на это:

Пусть линия 1 будет ближайшая строка и строка 10 дальше всего.

Пусть путь будет рядом смежных 0s.

Если строка 1 содержит только «правый» путь, а все строки от 2 до 9 содержат по крайней мере один «неправильный» путь, строка 10 содержит только «правый» путь.

Эта эвристика может быть не идеальной, это всего лишь идея с головы.

+0

Неплохая идея. Это может быть проще. –

0

Вы можете думать о борту примерно directedgraph. Если вы хотите проверить «Возможно ли достичь последней строки?», Вы можете использовать хорошо известные алгоритмы как DFS или BFS.

Хорошо. Оно работает. Но это медленно. Поэтому вы не должны использовать какой-либо из этих алгоритмов после создания всей доски. Используйте его после любой сгенерированной строки! И если каждый узел из нового сырья недоступен, то обновите raw.

Если вы не хотите, чтобы алгоритм «сгенерировал и проверил», вы добавляете пустое сырое пространство, проверяете, сколько узлов доступно, а число rand - это число, сколько позволит идти вперед. Тогда произвольно получим подмножество из них.

Вы также можете написать простой случайный генератор, возвращающий ядро ​​i из [0, n). Если последняя область находится слева, вы идете влево, если справа - справа, если это так же - вниз. Это хорошо, потому что, если вы близки к концу, вы, вероятно, вернетесь в другую сторону. Таким образом, он будет иметь хорошую форму. Но для широких карт он потеряет выгоды.

Лучше, но на этой же идее разумное использование распределения чисел в случайных генераторах. (например, посмотрите на случайную библиотеку Cpp или другие генераторы языков).

код на основе этой идеи (но очень, очень просто) в :

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; 
} 

Пример вывода:

- # # # # # # # 
- - - - - - - - 
# # # # # # # - 
# # # - - - - - 
# # # - # # # # 
# # # - - - # # 
# # # # # - - # 
# # # # # - - # 
# # # # # - - - 
# # # - - - - - 
# # # - - # # # 
# # # - - # # # 
# # # - - # # # 
# - - - - # # # 
# - # # # # # # 
0

Вы можете сохранить список ложных путей, каждый из которых с (X) и отсчет вниз (C), который начинается со случайного числа, меньшего количества видимых строк.

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

На каждом шаге дорога и пути приманки могут каждый увеличивать, уменьшать или поддерживать свою позицию X. Если два пути касаются, они сливаются. Когда они объединяются, вы сохраняете самое низкое значение C, чтобы убедиться, что вы не можете иметь ветку на ветке, которая выходит за пределы количества видимых строк.

Этот подход не требует предварительного планирования или создания графика.

Смежные вопросы