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
John von Neumann – The Man from the Future
Before I read The Man from the Future by Ananyo Bhattacharya, I only knew about John von Neumann in two contexts: that computers use the von Neumann architecture, and that he appeared in a story about a mathematical problem I … Continue reading →
via Henrik Warne's blogThe Review Is the Action Item
2024/05/30The Review Is the Action ItemI like to consider running an incident review to be its own action item. Other follow-ups emerging from it are a plus, but the point is to learn from incidents, and the review gives room for that to happen.This is no…
via Ferd.caHOWTO: 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