Piyonları çalışma zamanında konumlandırmanın temel motivasyonlarından biri, her oynayışta oynanışı çeşitlendirmektir.
Piyonlar editör içinde yerleştirilirse ve her oynayışta piyonların yerleri değiştirilmezse tek bir raunt oynadıktan sonra bu piyonların her defasında tam olarak nereye yerleştirildiğini bilirsin. Fakat bunun yerine piyonları her seferinde rastgele bir şekilde yerleştirirsen birden fazla başlangıç yapılandırması olur.
Bunu netleştirmek gerekirse, 5 x 5 kareden oluşan bir tahtan ve beş piyonun olduğunda (25’in 5’li kombinasyonu), 53.130 farklı yapılandırma var demektir. Tahtayı her boyutta yalnızca 1 boşluk daha artırarak 6 x 6 yapar ve beş piyonu tutarsan bu sayı (36’nın 5’li kombinasyonu) 11.686.752’ye yükselir.
Rastgeleleştirme, değişken oynanış deneyimleri oluşturmak açısından güçlü bir araç olabilir.
Rastgele Bir Kare Koordinatı Oluştur
Bir piyonu rastgele bir şekilde yerleştirmek için tahtanın sınırları içinde rastgele bir kare koordinatı oluşturman gerekir. İki boyutlu alanda rastgele bir şekilde bir koordinat oluşturmanın birçok farklı yolu vardır. Bunlardan en yaygın olanı, bu örnek için de kullanacağın tek biçimli dağıtımdır (uniform distribution). Tek biçimli dağıtım, bir piyonun tahtadaki herhangi bir kareye konması konusunda eşit bir olasılık öngörür. Daha fazla bilgi için https://tr.wikipedia.org/wiki/Tekd%C3%BCze_da%C4%9F%C4%B1l%C4%B1m_(ayr%C4%B1k) sayfasına bakabilirsin. Bu amaçla, koordinatı hangi etki alanında oluşturacağını öğrenmek için bir sınırlar objesi alan, GenerateUniformRandomTileCoordinate adında bir işlevsellik fonksiyonu oluştur.
İki boyutlu alanda tek biçimli olarak dağıtılmış bir kare koordinatı oluşturmak için her boyutta bağımsız olarak rastgele bir şekilde bir tamsayı oluştur, ardından bunları bir kare koordinatı objesinde birleştir.
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)
Bu fonksiyon aşağıdaki adımları gerçekleştirir:
Tahtanın sol sınırları içinde rastgele bir tamsayı oluşturur.
Tahtanın ileri sınırları içinde rastgele bir tamsayı oluşturur.
Bunları bir kare koordinatı objesi altında birleştirir.
Sınırlı desteğe sahip daha ayrık dağıtımların listesi için şu tabloya bakabilirsin: https://en.wikipedia.org/wiki/List_of_probability_distributions. Bu dağıtımlardan bazılarına göre koordinatlar oluşturan kendi fonksiyonlarını oluşturmayı deneyebilir ve piyon yerleşiminin nasıl değiştiğini görebilirsin.
Yeterli Açık Alan Olduğundan Emin Ol
Piyonları tahta üzerine yerleştirmeden önce dikkat edilmesi gereken diğer bir nokta, piyon sayısı için yeterli tahta alanı olup olmadığını belirlemektir. Bu işlem, bir tahta sınırları objesi alan ve tahta üzerindeki kare sayısını yazan, NumberOfTileCoordinates adında bir işlevsellik fonksiyonu oluşturularak yapılabilir.
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)Rastgele Bir Şekilde Bir Piyon Yerleştir
Piyonları tahta üzerine rastgele bir şekilde yerleştirmek için kaç tane piyon oluşturacağını bilmen gerekir. Bunu tahta sınıfında düzenlenebilir (editable) bir değişken olarak ekle.
Tahta üzerindeki piyon sayısını belirledikten sonra piyonları yerleştirme prosedürü şu şekildedir:
NumberOfTileCoordinatesile, piyon sayısı için yeterli kare koordinatı olduğundan emin ol.GenerateUniformRandomTileCoordinateile, rastgele bir şekilde bir kare koordinatı oluştur.O koordinatta zaten bir piyon olup olmadığına karar ver.
Cevabın evet ise 1. adıma dön.
Hayır ise 4. adıma git.
Oluşturulan koordinatta
SetPawn’un başarılı olup olmadığına karar ver.Cevabın evet ise bir sonraki piyona geç.
Değilse bir hata üret.
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):
Bu fonksiyon ancak ve ancak aşağıdaki durumlarda başarılı olur:
Öngörülen sayıda piyon için yeterli tahta alanı vardır.
Her piyon, zaten bir piyon bulunmayan bir koordinata başarıyla yerleştirilmiştir.
Tahtayı Çalışma Zamanında Oluştur
Bu aşamada tahtayı çalışma zamanında oluşturmak için yapılması gereken tek şey tahtanın OnBegin fonksiyonunu geçersiz kılmak ve PlacePawns’u çağırmaktır:
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):
Özet
Özetlemek gerekirse, bu sayfada aşağıdaki adım açıklanmıştır:
Tüm piyonları tahta üzerine rastgele bir şekilde yerleştir.
Dosyalar
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):