Una de las principales motivaciones para posicionar los peones en el tiempo de ejecución es variar el juego en cada partida.
Si los peones se colocan dentro del editor y no se mueven en cada partida, una vez que juegues una sola ronda, sabrás exactamente dónde están colocados. En cambio, si los colocas de forma aleatoria cada vez, habrá múltiples configuraciones iniciales.
Para poner esto en perspectiva, si tienes un tablero de 5 x 5 cuadros y cinco peones, hay 53 130 configuraciones distintas. Si aumentas el tablero en solo 1 casilla más en cada dimensión hasta 6 x 6 y conservas cinco peones, ese número sube a 11 686 752.
La aleatorización puede ser una herramienta poderosa para crear un juego variado.
Generación de una coordenada de cuadro aleatoria
Para colocar de forma aleatoria un peón, debes generar una coordenada de cuadro aleatoria dentro de los límites de un tablero. Hay muchas maneras diferentes de generar de forma aleatoria una coordenada en un espacio bidimensional. La más común es la distribución uniforme, que es la que usarás para este ejemplo. Una distribución uniforme establece la misma probabilidad de que un peón se coloque en cualquier cuadro del tablero. Consulta https://en.wikipedia.org/wiki/Discrete_uniform_distribution para obtener más información. Con este fin, construye una función de utilidad denominada GenerateUniformRandomTileCoordinate que tome un objeto de límites para saber en qué dominio generar la coordenada.
Para generar una coordenada de cuadro distribuida uniformemente en un espacio bidimensional, genera aleatoriamente un número entero en cada dimensión de forma independiente y, luego, combínalos en un objeto de coordenadas de cuadro.
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)
Esta función realiza los siguientes pasos:
Genera un número entero aleatorio dentro de los límites horizontales del tablero.
Genera un número entero aleatorio dentro de los límites verticales del tablero.
Combina estos resultados en un objeto de coordenadas de cuadro.
Consulta la siguiente tabla https://en.wikipedia.org/wiki/List_of_probability_distributions para obtener una lista de distribuciones más discretas con soporte finito. Puedes intentar crear tus propias funciones que generen coordenadas con respecto a algunas de estas distribuciones y ver cómo cambia la colocación de los peones.
Verificación de espacios abiertos disponibles
Una consideración adicional antes de colocar peones en el tablero es determinar si hay suficientes espacios de tablero disponibles para la cantidad de peones. Esto se puede hacer mediante la creación de una función de utilidad llamada `NumberOfTileCoordinates` que tome un objeto de límites de tablero y muestre la cantidad de cuadros en el tablero.
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)Colocación al azar de un peón
Para colocar de forma aleatoria los peones en el tablero, necesitas saber cuántos peones generar. Añade esto como una variable editable en la clase de tablero.
Después de determinar el número de peones en el tablero, el procedimiento para colocar peones es el siguiente:
Asegúrate de que haya suficientes coordenadas de cuadro disponibles para la cantidad de peones con
NumberOfTileCoordinates.Genera de forma aleatoria una coordenada de cuadro con
GenerateUniformRandomTileCoordinate.Decide si ya hay un peón en esa coordenada.
En caso afirmativo, vuelve al paso 1.
De lo contrario, ve al paso 4.
Decide si
SetPawnen la coordenada generada se ejecuta correctamente.Si es así, pasa al siguiente peón.
De lo contrario, produce un error.
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):
Esta función se ejecuta correctamente si, y solo si, se dan las siguientes condiciones:
Hay suficientes espacios en el tablero para el número prescrito de peones.
Cada peón se coloca correctamente en una coordenada que no tenga ya un peón allí.
Generación del tablero en tiempo de ejecución
Para generar el tablero en tiempo de ejecución, todo lo que queda por hacer es anular la función OnBegin del tablero y llamar a 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):
Resumen
En resumen, esta página te guió a través del siguiente paso:
Colocar aleatoriamente todos los peones en el tablero.
Archivos
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):