Darwin Project ve Bölgeler
January 12, 2021Son 2-3 gündür Darwin Project adında battle royale tipinde bir oyun oynuyorum. Bilmeyenler için açıklamak gerekirse haritada oyuna diğer oyuncularla birlikle başlıyorsunuz. Gördüğünüz adamları vuruyorsunuz veya onlar sizi vuruyor. Çatışma çıkıyor. En son hayatta kalan kazanıyor. Oyun yapımcıları oyuncuların haritada birbirinden kaçmasını önlemek için haritayı rastgele bölgeleri kapatarak daraltıyor.
Daha önce oynadığım battle royale oyunlarında harita kare veya çember şeklinde daralıyordu. Nasıl bir şeçim yaparsanız yapın oyuncuların erişelemeyecek alanda olmamasını garanti ediyordu. Bu oyunda ise harita 7 tane altıgen bölgeden oluşuyor. Merkezde bir altıgen ve kenarlarına bitişik şekilde başka altıgenler var.Desen olarak bal peteği şeklinde.
Şeklinde bir yerleşim var. Soldan sağa, yukarıdan aşağıya 0 dan 6 ya doğru numaralandırdığımızı düşünelim. Paintte çizmeme gerek yok sanırım.
Eğer 0, 3, 6(y = -x denklemi doğrultusu) bolgelerini kapatırsanız 2 numaralı bölgedeki adamla 4 numaralı bölgedeki adam birbiri ile çatışma şansını kaybediyor. Tabiki bu durumu istemiyoruz.
Oyun programcısı ben olsam oyundaki haritayı nasıl daraltırım diye düşündüm. 2 tane yöntem buldum
- Tarjan connected components algoritması ile o anki bridgeleri bulabiliriz. Bridge olmayan bir vertexi seçip graphtan sileriz.
- Rastgele bir vertex seçip onu ortadan kaldırırız ve connected componentları sayarız. Eğer component sayısı birden fazla harita segmente olmuş demektir. Aslında ilk yöntemin aynısı ama implement etmesi daha kolay.
Ben 2. seçeğini seçtim. Aşağıda python implementasyonunu bulabilirsiniz.
Çözüm
|
|
Olası İyileştirmeler
Oyunu geliştiren ekipte olsam bunu muhtemelen hardcoded olarak kaynak kodun içinde tutardım. Her maç başlangıcında bir tane sıralama seçip daha sonra oyun içinde hesaplamakla uğraşmazdım.
0..6 arasındaki sayıları 4 bitle ifade edelim. Bit compression yapması kolay olur. 7 tane bölge için 7 tane sayıya ihtiyacımız var. Her oyun için 2160 tane geçerli konfigurasyon olduğunu bildiğimize göre 4 * 7 * 2160 / (8bit * 1024bytes) ~ 7.4 KB bellek karşılığında böyle bir hesaplama yapma zahmetinde kurtuluruz.
Düzeltme
Kodu inceleyen bir arkadaşım daha basit bir yöntem önerdi. Açık alan sayısı ile bir tek dfs-visit ile gezdiğimiz eleman sayısı eşitse haritada sadece 1 tane connected component vardır. Bu durumda aşağıdaki gibi düzeltme yapabiliriz.
|
|
hidden
AI: Where in the Loop Should Humans Go?
This is a re-publishing of a blog post I originally wrote for work, but wanted on my own blog as well.AI is everywhere, and its impressive claims are leading to rapid adoption. At this stage, I’d qualify it as charismatic technology—someth…
via Ferd.caMore Good Programming Quotes, Part 6
Here are more good programming quotes I have found since my last post. Programming “Configuration is coding in a poorly designed programming language without tests, version control, or documentation.”Gregor Hohpe “It’s the developers misunderstanding, not…
via Henrik Warne's blogHOWTO: Change your behavior
In theory, behavior change should be easy. At first glance, it seems like you control your behavior. So, if you desire different behavior, why doesn’t your behavior change as instantly as your desire to change it? In short, lasting change of habitual behavio…
via Matt Might's blog