Gereksinimleri anlamak
- Tüm oyuncuların sınırlı sayıda bitişik düşmanları vardır.
Öncelikle, oyuncuların oyundaki belirli bir noktadaki konumu değil, oyuncuların ortaya çıkış noktalarından bahsediyoruz. Sadece bunu yoldan çekiliyorum.
Bitişik bir grafik hakkında konuştuğumuz zaman iyi tanımlanmıştır. Şu andan itibaren "grafikte" haritada gezinmeyi temsil eden bir harita düşünebiliriz.
Eğer düğüm en fazla bir yumurtlama noktasına sahip olabilirse, o zaman onlardan "bitişik" olmak, anlam ifade eder. Not: Düğümleri daha sonra ortaya çıkacak nedenlerden ötürü en fazla tek bir yumurtlama noktasına sahip olmaya zorlamam.
Grafiği oluşturmak için duvarlar, köprüler, merdivenler, ışınlanma noktaları gibi şeyleri göz önünde bulundurmamız veya uçabilecek oyuncu varsa uçuş alanını göz önüne almamız gerekecek. Her düğüm traversable bir konumu temsil eder; her bağlantı olası bir hareketi temsil eder.
Not: Düğümlerin boyutunu ve şeklini bilir ve gerçekte bitişik düğümlerle çalışır. Düğümleri bir nokta olarak düşünmeyin. Bağlantıları uzunluk olarak düşünmeyin. Ayrıca, dışbükey düğümleri kullanın.
Grafik önceden derlenmiş olabilirdi (harita bir tasarımcı tarafından oluşturuldu); Aksi takdirde, harita rastgele oluşturulmuşsa anında oluşturulabilir.
- Tüm oyuncuların bitişik düşmanlarla karşılaşma şansı eşit.
Düşmanların diğer oyuncular olduğunu varsayacağım. Yine, bu yoldan çekiliyorum.
Her oyuncunun rastgele bir yürüyüş yaptığını farz edersek, belirli bir noktada bir oyuncuyu bulma olasılığı - düz bir alanda, engelsiz - artık ortaya çıkan noktaya olan mesafenin (Gaussian) fonksiyonu tarafından verilecektir. işlev".
Grafik üzerinde çalıştığımız için, bunun yerine grafikteki değerleri ekleyeceğiz.
- Harita büyüklüğünün oyuncu sayısına oranla artması gerekmez.
Düğüm başına tek bir yumurtlama noktasına sahip olma sınırımız olsaydı, daha fazla oyuncu eklemek için daha küçük düğümlere ihtiyacımız olurdu. Grafiğe ne kadar oyuncumuz olacağını bilmeden karar verirsek, belirli bir oyun için düğümleri bölmek zorunda kalabiliriz.
- Bu sınırlamalar keyfi geçilmez boşluklarla uygulanmaz.
Sorunu çözmek için engel eklemeyi düşünmüyorum. Aksine , engeller etrafında çalışmam gerekiyor. Onlar orada olmasaydı uygulama daha kolay olurdu.
Çözüm
N yumurtlama noktaları yerleştirmeye çalışıyoruz, böylece tüm yumurtlama noktalarında başka bir oyuncu ile karşılaşma şansı eşit olacak.
Hatanın ölçüsünü, şansların şans ortalamasındaki toplamı olarak ölçebiliriz. Bunu en aza indirmeye çalışıyoruz (aslında, 0 yapmak istiyoruz).
Bunu yapmak için, grafiğin her bir noktasında bir oyuncu ile karşılaşma şansını bilmemiz gerekir.
Bu şansı hesaplamak için sıfır ile başlayın. Herhangi bir düğümde bir oyuncu bulma şansı olduğundan, oyuncu olmadığı zaman sıfırdır. Ve sonra, her bir ortaya çıkan nokta için, açıklanan noktaya, mevcut ortaya çıkan nokta için fonksiyonun değeri olan açıklamalı şansa ekleyen grafiği yürüyün.
Not 1: Bir sıçrama noktası eklemek veya taşımak, tüm harita için bir oyuncuya rastlama şansını etkileyecektir.
Not 2: Her bir yumurtlama noktasının şansı ne kadar etkilediğini takip etmek işleri kolaylaştırır.
Not 3: Düğümlerin boyutu olduğundan, hataya ne kadar yaklaşabileceğinizi = sıfır, düğümlerin boyutuna bağlıdır. Değer aralıklarıyla çalışarak daha kesin olabilirsiniz (düğümdeki yumurtlama noktalarının özel konumuna bağlı olarak minimum ve maksimum şans).
Yumurtlama noktalarını rastgele yerleştirin, ardından onları hataların küçüleceği şekilde hareket ettirmeye başlayın (olası bir hareketi düşünün ve hatanın düşmesine neden olursa, aksi halde geri alın). Ve daha fazla iyileştiremediğimiz sürece devam etmeye devam edin (iyileştirme olmadan çok fazla yineleme veya hata sıfırdır).
Not 4: Bir spawn noktasını taşırken, bir oyuncuya daha yakın bir oyuncuya rastlama şansına sahip olacak bir pozisyon seçmek için rastgele yeni bir pozisyon seçmek için bir oyuncuyla karşılaşma şansını (hareket ettireceğiniz spawn noktası hariç) kullanabilirsiniz. ortalama daha muhtemeldir. Size, ortaya çıkış noktasını hareket ettirmenin ortalamayı etkileyeceğini hatırlatırım.
Beklenen davranış, birbirine çok yakın olan spawn noktasının parçalara ayrılması ve çok uzaktaki spawn noktalarının yakınlaşmasıdır. Dengeye ulaşana kadar.
Herhangi bir yinelemede, bir düğümde birden fazla yumurtlama noktanız varsa (bu durum pek olası değildir, çünkü ayrılma eğilimindedirler, ancak yeterince büyük düğümleriniz varsa mümkün olabilir), düğümü ayırın ve çözmeye devam edin. Düğümün herhangi bir bölümü geçerlidir.
Yukarıdaki çözüm hataya = sıfır yaklaşacaktır ancak sıfıra ulaşması garanti edilmez. Yerel asgari seviyeye gelinceye kadar çalıştırabilirsiniz ... Teorik olarak, daha sonra sıfır yapmak için düğümleri bölebilirsiniz ... Ancak, bu ortaya çıkan nokta koordinatlarının tweaking eşdeğeri!
Yumurtlama noktasını düğüm içinde hareket ettirmek için benzetilmiş tavlamayı deneyin. Her ne kadar, dürüst olmak gerekirse, muhtemelen böyle bir ayrıntı düzeyiyle uğraşmaya değmez.
Engelsiz bir düz haritanın sonucunun düzgün dağılmış noktalar olmayacağını açıkça belirtmek isterim. Bunun yerine, haritanın kenarları varsa (yani, etrafa sarılmazsa), o zaman kenarlara daha yakın bir yumurtlama noktası olacaktır, çünkü merkezdeki noktalara daha fazla yönden ulaşılabilir, bu da karşılaşma şansını arttırır. orada diğer oyuncular. Böylece, merkeze yakın mesafeyi daha da telafi etmek için işaret eder.