Uma das principais motivações para posicionar pawns em tempo de execução é variar a jogabilidade a cada gravação do jogo.
Se os pawns forem colocados no editor e não forem movidos a cada gravação do jogo, depois de jogar uma única rodada, você saberá exatamente onde esses pawns são colocados todas as vezes. Se, em vez disso, você colocar os pawns aleatoriamente todas as vezes, haverá várias configurações iniciais.
Para colocar isso em perspectiva, se você tiver um tabuleiro de 5 x 5 ladrilhos e cinco pawns, existem (25 escolhe 5) 53.130 configurações distintas Se você aumentar o tabuleiro em apenas mais 1 espaço em cada dimensão para 6 x 6 e mantiver cinco pawns, esse número sobe para (36 escolha 5) 11.686.752.
A aleatoriedade pode ser uma ferramenta poderosa para criar jogabilidade variada.
Gerar uma coordenada aleatória de ladrilho
Para colocar aleatoriamente um pawn, você precisa gerar uma coordenada de ladrilho aleatória dentro das delimitações de um tabuleiro. Há muitas maneiras diferentes de gerar aleatoriamente uma coordenada no espaço bidimensional. A mais comum é a distribuição uniforme, que é o que você usará para este exemplo. Uma distribuição uniforme coloca uma probabilidade igual de um pawn ser colocado em qualquer ladrilho do tabuleiro. Para obter mais informações, consulte https://en.wikipedia.org/wiki/Discrete_uniform_distribution. Para isso, construa uma função de utilidade denominada GenerateUniformRandomTileCoordinate que recebe um objeto de delimitação para saber em qual domínio gerar a coordenada.
Para gerar uma coordenada de ladrilho uniformemente distribuída no espaço bidimensional, gere aleatoriamente um inteiro em cada dimensão de forma independente e, em seguida, combine-os em um objeto de coordenada de ladrilho.
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)
Essa função executa as seguintes etapas:
Gere um inteiro aleatório dentro das delimitações esquerdas do tabuleiro.
Gere um inteiro aleatório dentro das delimitações para a frente do tabuleiro.
Combine estes em um objeto de coordenadas de ladrilhos.
Para obter uma lista de distribuidores mais discretos com suporte finito, consulte a tabela a seguir https://en.wikipedia.org/wiki/List_of_probability_distributions. Você pode tentar criar funções próprias que geram coordenadas em relação a algumas dessas distribuições e ver como o posicionamento do pawn muda.
Garantir espaços abertos suficientes
Uma consideração adicional antes de colocar pawns no tabuleiro é determinar se há espaços suficientes disponíveis para a quantidade de pawns. Isso pode ser feito criando uma função de utilidade denominada `NumberOfTileCoordinates` que recebe um objeto de delimitações de tabuleiro e gera a saída do número de ladrilhos no tabuleiro.
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)Colocar um pawn aleatoriamente
Para colocar aleatoriamente os pawns no tabuleiro, você precisa saber quantos pawns gerar. Adicione isso como uma variável editável na classe do tabuleiro.
Depois de determinar o número de pawns no tabuleiro, o procedimento para colocar pawns é:
Certifique-se de que haja coordenadas de ladrilhos suficientes disponíveis para o número de pawns com
NumberOfTileCoordinates.Gere aleatoriamente uma coordenada de ladrilho com
GenerateUniformRandomTileCoordinate.Decida se já existe um pawn nessa coordenada.
Se sim, volte para a etapa 1.
Caso contrário, vá para a etapa 4.
Decida se
SetPawnna coordenada gerada é bem-sucedido.Se sim, passe para o próximo pawn.
Caso contrário, produza um erro.
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):
Essa função tem sucesso se, e somente se:
Há espaços de tabuleiro suficientes para o número de pawns prescrito.
Cada pawn é colocado com sucesso em uma coordenadas que ainda não tenha um pawn lá.
Gerar o tabuleiro no tempo de execução
Para gerar o tabuleiro em tempo de execução, basta substituir a função OnBegin do tabuleiro e chamar 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):
Resumo
Em suma, esta página guia você pela seguinte etapa:
Colocar aleatoriamente todos os pawns no tabuleiro.
Arquivos
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):