Генерация случайного пути в игре - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу сделать 2D-игру, которая генерирует частые случайные пути между двумя точками на 2D-экране. Я прочитал алгоритм A * + генерация случайных препятствий для создания путей, но этот алгоритм кажется трудоемким для изучения.

Мой вопрос: «Какие другие типы алгоритмов генерации случайных путей подходятдля моей ситуации? (Генерация случайных путей между 2 фиксированными точками)

1 Ответ

3 голосов
/ 06 ноября 2019

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

Например,

using System.Linq;
public class Waypoint : MonoBehaviour{
    public Waypoint[] Connections;

    public Waypoint Next( Waypoint previous, Waypoint finalDestination) {

        if (this == finalDestination) return null; // You have arrived

        var possibleNext = Connections.Where(m => m != previous && CheckHeuristic(m, finalDestination)); // Dont go backwards, and apply heuristic

        if (possibleNext.Count() == 0) throw new System.ApplicationException("No exitable paths from Waypoint"); // Error if no paths available

        possibleNext = possibleNext.OrderBy( m => Random.Range(0f, 1f)); // 'shuffle'

        return possibleNext.First(); // Grab first 'random' possible path
    }

    private bool CheckHeuristic(Waypoint candidate, Waypoint finalDestination) {
        // Basic 'is not farther' check
        return Vector3.Distance(candidate.transform.position, finalDestination.transform.position) <= Vector3.Distance(this.transform.position, finalDestination.transform.position);
    }
}

Кроме того, здесь не существует понятия «бесплатный обед». Всегда есть затраты на создание подобных вещей. Вы либо потратите время на изучение A *, либо потратите время на создание путей вручную ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...