Una de las principales motivaciones para colocar peones durante el tiempo de ejecución es variar la jugabilidad en cada partida.
Si los peones se colocan dentro del editor y no se cambian de sitio en cada partida, una vez que juegues una ronda, sabrás exactamente dónde están colocados esos peones. Si, por el contrario, colocas los peones de forma aleatoria cada vez, habrá múltiples configuraciones iniciales.
Para poner esto en perspectiva, si tienes un tablero de 5 x 5 casillas y cinco peones, hay 53 130 configuraciones distintas. Si aumentas el tablero solo 1 espacio más en cada dimensión hasta 6 x 6 y mantienes cinco peones, ese número asciende a 11 686 752.
La aleatoriedad puede ser una herramienta potente para crear una jugabilidad variada.
Cómo generar una coordenada de casilla aleatoria
Para colocar un peón al azar, necesitas generar una coordenada aleatoria dentro de los límites de un tablero. Hay muchas formas diferentes de generar aleatoriamente una coordenada en un espacio bidimensional. La más común es la distribución uniforme, que es la que utilizarás para este ejemplo. Una distribución uniforme otorga la misma probabilidad de que un peón se coloque en cualquier casilla del tablero. Para obtener más información, consulta https://en.wikipedia.org/wiki/Discrete_uniform_distribution. Para ello, construye una función de utilidad con el nombre GenerateUniformRandomTileCoordinate que tome un objeto de límites para saber en qué dominio generar la coordenada.
Para generar una coordenada de casilla distribuida uniformemente en un espacio bidimensional, genera aleatoriamente un número entero en cada dimensión de forma independiente y, a continuación, combínalos en un objeto de coordenadas de casilla.
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 Left del tablero.
Genera un número entero aleatorio dentro de los límites Forward del tablero.
Combina estos resultados en un objeto de coordenadas de casilla.
Para obtener una lista de distribuciones más discretas con soporte finito, consulta esta tabla: https://en.wikipedia.org/wiki/List_of_probability_distributions. 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.
Cómo garantizar que haya suficientes espacios libres
Otra consideración adicional antes de colocar los peones en el tablero es determinar si hay suficientes casillas disponibles para el número de peones. Esto se puede hacer creando una función de utilidad con el nombre `NumberOfTileCoordinates` que tome como entrada un objeto con los límites del tablero y devuelva como salida el número de casillas del 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)Cómo colocar un peón al azar
Para colocar peones al azar en el tablero, necesitas saber cuántos peones generar. Añade esto como una variable editable en la clase del tablero.
Una vez determinado el número de peones en el tablero, el procedimiento para colocarlos es el siguiente:
Asegúrate de que haya suficientes coordenadas de casilla disponibles para el número de peones con
NumberOfTileCoordinates.Genera aleatoriamente una coordenada de casilla con
GenerateUniformRandomTileCoordinate.Determina si ya hay un peón en esa coordenada.
En caso afirmativo, vuelve al paso 1.
Si no es así, ve al paso 4.
Determina si
SetPawnen la coordenada generada tiene éxito.En caso afirmativo, pasa al siguiente peón.
Si no es así, genera 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 solo tiene éxito si se cumplen estos requisitos:
Hay suficientes espacios en el tablero para el número de peones previsto.
Cada peón se coloca correctamente en una coordenada en la que aún no hay ningún peón.
Cómo generar el tablero en tiempo de ejecución
Para generar el tablero en tiempo de ejecución, todo lo que hay que 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 ha guiado para llevar a cabo el siguiente paso:
Colocar aleatoriamente todos los peones en el tablero.
.udatasmith
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):