Один из основных мотивов размещения пешек в среде выполнения — желание разнообразить игровой процесс при каждом прохождении.
Если пешки размещены в редакторе и не перемещаются при каждом прохождении, то уже после первого раунда вы будете точно знать, где они находятся. Если же вы будете расставлять пешки случайным образом, то получите множество начальных конфигураций.
Для сравнения: если у вас есть доска 5 × 5 с пятью пешками, то на ней возможно 53 130 различных конфигураций (число сочетаний из 25 по 5). Если вы увеличите доску всего на 1 деление в каждом измерении, до 6 x 6 и сохраните пять пешек, это число увеличится до 11 686 752 (число сочетаний из 36 по 5).
Рандомизация может стать мощным инструментом для реализации разнообразного игрового процесса.
Генерация случайной координаты плитки
Чтобы разместить пешку случайным образом, нужно сгенерировать случайную координату плитки в пределах границ доски. Существует множество различных способов сгенерировать случайную координату в двухмерном пространстве. Наиболее распространённым является равномерное распределение, и именно его мы будем использовать в этом примере. Равномерное распределение означает, что пешка может попасть на любую плитку на доске с равной вероятностью. Подробнее см. в статье по адресу https://en.wikipedia.org/wiki/Discrete_uniform_distribution. Для этого создайте служебную функцию с именем generateUniformRandomTileCoordinate, которая принимает объект границ, чтобы определить, в какой области следует генерировать координату.
Чтобы сгенерировать равномерно распределённую координату плитки в двумерном пространстве, случайным образом сгенерируйте целое число по каждой из осей независимо, а затем объедините их в объект tile_coordinate.
using { /Verse.org/Simulation }
using { /Verse.org/Random }
UtilityFunctions<public> := module:
...
GenerateUniformRandomTileCoordinate<public>(BoardBounds:board_bounds)<transacts>:tile_coordinate =
tile_coordinate:
Left := GetRandomInt(BoardBounds.LeftBounds.Low, BoardBounds.LeftBounds.High)
Эта функция выполняет следующие шаги:
генерирует случайное целое число в пределах левой границы доски;
генерирует случайное целое число в пределах правой границы доски;
объединяет их в объект tile_coordinate.
Список более дискретных распределений с конечной поддержкой приведён в таблице по адресу https://en.wikipedia.org/wiki/List_of_probability_distributions. Вы можете попробовать создать собственные функции, которые генерируют координаты с учётом некоторых из этих распределений, и посмотреть, как будет меняться положение пешки.
Убедитесь, что свободного пространства достаточно
Перед размещением пешек на доске следует также убедиться, что на ней достаточно свободных мест для их количества. Для этого можно создать служебную функцию NumberOfTileCoordinates, которая принимает объект границ доски и выдаёт количество плиток на доске.
using { /Verse.org/Simulation }
using { /Verse.org/Random }
UtilityFunctions<public> := module:
...
NumberOfTileCoordinates<public>(BoardBounds:board_bounds)<transacts>:int =
(BoardBounds.LeftBounds.High - BoardBounds.LeftBounds.Low) * (BoardBounds.ForwardBounds.High - BoardBounds.ForwardBounds.Low)Случайное размещение пешки
Чтобы случайным образом разместить пешки на доске, нужно знать, сколько пешек нужно сгенерировать. Добавьте это значение в качестве редактируемой переменной в класс доски.
После определения количества пешек на доске их можно разместить следующим образом:
убедиться, что имеется достаточное количество координат плитки для данного количества пешек, с помощью
NumberOfTileCoordinates;сгенерировать координату плитки случайным образом с помощью
GenerateUniformRandomTileCoordinate;определить, есть ли пешка в точке с этой координатой:
если да, вернуться к шагу 1;
если нет, перейти к шагу 4;
определить, завершилось ли успешно
SetPawnв сгенерированной координате:если да, перейти к следующей пешке;
если нет, сообщить об ошибке.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
Эта функция выполняется успешно тогда и только тогда, когда:
на доске достаточно места для заданного количества пешек;
каждая пешка успешно размещается в координате, где ещё нет пешки.
Генерация доски в среде выполнения
Чтобы сгенерировать доску в среде выполнения, осталось переопределить функцию OnBegin для доски и вызвать PlacePawns:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
Описание
Подведём итог. На этой странице вы выполнили следующие шаги:
разместить все пешки на доске в случайном порядке.
Файлы
using { /Verse.org/Simulation }
using { /Verse.org/Random }
DataTypes<public> := module:
tile_coordinate<public> := class<concrete>:
@editable
Left<public>:int = 0
@editable
Forward<public>:int = 0
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):