Jedną z głównych przyczyn umieszczania pionków w czasie wykonywania jest dbałość o różnorodność poszczególnych rozgrywek.
Jeśli pionki są umieszczane w edytorze i nie są przemieszczane na potrzeby każdej kolejnej rozgrywki, po rozegraniu pojedynczej rundy będziesz wiedzieć dokładnie, gdzie te pionki są za każdym razem umieszczane. Jeśli zamiast tego za każdym razem będziesz losowo rozmieszczać pionki, będzie wiele możliwych początkowych ustawień.
Wyobraź sobie, że masz planszę o wymiarach 5 x 5 pól oraz 5 pionków. Oznacza to, że istnieje 53130 różnych ustawień pionków (25 pól do wybrania dla 5 pionków). Jeśli zwiększysz planszę tylko o 1 pole więcej w każdym wymiarze (do 6 x 6 pól) i zachowasz 5 pionków, ta liczba zwiększy się do 11686752 (36 pól do wybrania dla 5 pionków).
Losowość może być potężnym narzędziem do tworzenia zróżnicowanej rozgrywki.
Generowanie losowych współrzędnych pola
Aby umieścić pionek w losowej lokalizacji, należy wygenerować losowe współrzędne pola mieszczące się w granicach planszy. Istnieje wiele różnych sposobów losowego generowania współrzędnych w przestrzeni dwuwymiarowej. Najpopularniejszy z nich opiera się na rozkładzie jednostajnym i właśnie on jest wykorzystywany w tym przykładzie. Rozkład jednostajny sprawia, że w przypadku każdego pola planszy istnieje takie same prawdopodobieństwo postawienia pionka. Aby dowiedzieć się więcej, patrz: https://en.wikipedia.org/wiki/Discrete_uniform_distribution. Utwórz funkcję narzędziową o nazwie GenerateUniformRandomTileCoordinate, która będzie przyjmować obiekt bounds, aby dowiedzieć się, w której domenie należy wygenerować współrzędne.
Aby wygenerować współrzędne pola o rozkładzie jednostajnym w przestrzeni dwuwymiarowej, wygeneruj losowe liczby całkowite (niezależnie dla każdego wymiaru), a następnie połącz je w obiekt współrzędnych pola.
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)
Ta funkcja wykonuje następujące czynności:
Generuje losową liczbę całkowitą w granicach osi w lewo planszy.
Generuje losową liczbę całkowitą w granicach osi do przodu planszy.
Łączy je, aby uzyskać obiekt współrzędnych pola.
Aby zapoznać się z listą bardziej dyskretnych rozkładów z obsługą ograniczeń, patrz: https://en.wikipedia.org/wiki/List_of_probability_distributions. Możesz utworzyć własne funkcje do generowania współrzędnych z użyciem niektórych z tych rozkładów i obserwować, jak zmienia się rozstawienie pionków.
Sprawdzanie liczby wolnych pól
Przed umieszczeniem pionków na planszy dodatkowo zastanów się, czy na planszy jest wystarczająco dużo miejsca dla podanej liczby pionków. W tym celu możesz utworzyć funkcję narzędziową o nazwie NumberOfTileCoordinates, która przyjmuje obiekt bounds planszy i wyprowadza liczbę pól planszy.
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)Losowe umieszczanie pionka
Aby losowo umieszczać pionki na planszy, musisz określić liczbę pionków do wygenerowania. Dodaj tę wartość jako edytowalną zmienną do klasy tablicy.
Po określeniu liczby pionków na planszy procedura umieszczania pionków wygląda następująco:
Przy użyciu funkcji
NumberOfTileCoordinatessprawdź, czy jest dostępna wystarczająca liczba współrzędnych pól dla określonej liczby pionków.Losowo wygeneruj współrzędne pola za pomocą funkcji
GenerateUniformRandomTileCoordinate.Sprawdź, czy na polu o podanych współrzędnych znajduje się pionek.
Jeśli tak, wróć do kroku 1.
Jeśli nie, przejdź do kroku 4.
Sprawdź, czy działanie funkcji
SetPawnna polu o wygenerowanych współrzędnych kończy się powodzeniem.Jeśli tak, przejdź do następnego pionka.
Jeśli nie, zgłoś błąd.
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):
Działanie tej funkcji kończy się powodzeniem tylko wtedy, gdy:
Na planszy jest wystarczająca liczba pól dla podanej liczby pionków.
Każdy pionek został pomyślnie umieszczony na polu, na którym jeszcze nie ma pionka.
Generowanie planszy w czasie wykonywania
Aby generować planszę w czasie wykonywania, wystarczy zastąpić funkcję OnBegin planszy i wywoływać funkcję 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):
Podsumowanie
Podsumowując, na tej stronie zaprezentowano następujący krok:
Umieść wszystkie pionki w losowych miejscach na planszy.
Pliki
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):