Geçmiş oluşturma algoritmaları nasıl çalışır?


19

Cüce Kalesi oyununu duydum, ancak şimdi Youtube'da takip ettiğim insanlardan biri hakkında bir yorum yaptı ... Cüce Kalesi'nin dünya için nasıl bir tarih oluşturduğunu fark ettiğimde çok şaşırdım!

Şimdi, bu algoritmalar nasıl çalışır? Simülasyonun uzunluğu dışında genellikle girdi olarak ne alırlar? Ne kadar spesifik olabilirler?

Ve daha da önemlisi; Javascript ile yapılabilir veya Javascript çok yavaş olabilir mi? (Sanırım bu simülasyonun derinliğine bağlıdır, ancak örnek olarak Cüce Kalesi'ni ele alalım.)


3
"Javascript'te yapılabilirler mi?" Cevap açıktır, ancak sonuçların ne kadar hızlı olmasını ve ne kadar karmaşık olmasını istediğinize bağlıdır. Cüce Kalesi de biraz zaman alır - ve dünya yaşlandıkça yavaşlar! Sığ bir tarih istediğiniz sürece, evet bunu Javascript'te yapabilirsiniz, bu yüzden tarihin ne kadar karmaşık olmasını istediğinize bağlıdır.
doppelgreener

2
Ölçekte olduğu gibi "Cüce Kalesi seviyesinde" anlamına gelir.
MichaelHouse

2
@ Evet Evet, DF'de ne kadar tarih olacağını değiştirebilirsin. Bir dünyaya başladığınızda, ilk önce rastgele bir arazi oluşturur ve daha sonra dünyayı gözlerinizin önünde yaşlandırmaya ve gittikçe tarih üretmeye başlar. Arazi değiştikçe, ormanlar büyüdükçe ve geri çekildikçe, alanlar perili hale geldiğinde (veya artık perili olmadığında) imparatorluklar genişledikçe ve küçüldüklerini izliyorsunuz. Her yıl gözlerinizin önünde her yıl ilerler (veya bir seferde birkaç yıl). Bu durmasını söyleyene kadar devam ediyor. İçiniz ne kadar ilerlerse, nesil yavaşlar (oyun mekaniği değil, CPU kullanımı nedeniyle).
doppelgreener

1
Çok açık olmak gerekirse: Dünya büyüdükçe, her yıl daha yavaş hesaplamaktır. Genç bir dünyada ilk birkaç yıl boyunca acele edecek, yüzlerce yıllık bir dünyada, gelecek yıl üretilmesi bir iki saniye sürebilir.
doppelgreener

1
Oh, biliyorum. "Derinlik" ile, yılların miktarını, gerçekleşen olayların miktarını ve simülasyonun kesinliğini kastetmiştim. Bir imparatorluğun kaç kişiyi tutabileceğini ya da aslında bir derse sahip olabilirsiniz Person, bunlar ev işleri yapar, orduya gider, vb. her askerin kendi başına savaşmasını sağlayacaktı.
jcora

Yanıtlar:


27

Öncelikle, Cüce Kalesi hakkında tarih kuşağı hakkında bazı ipuçları var . Birisi Bay12 forumlarında bir süre önce sordu ve bir konuşma metni paylaşıldı ve "bugünkü konumuz dünya üretimi ve tarih nesli" diyerek tartışmanın nerede başladığını bulabilirsiniz.


Cüce Kalesi'nin bunu nasıl yaptığını tam olarak bilmiyorum, ama oyunumda çok temel bir ilk taslak uygulamayı nasıl planladığımı açıklayacağım. Basit bir hücresel otomata kullanacağım . Bu Spore prototiplerine bakarsanız , hücre kültürü ve biyom gibi.

resim açıklamasını buraya girin

Bunlar hücresel otomasyonlara ve üretebileceklerine örnekler. Esasen farklı ırklar için kurallar oluşturacağım. Bazı kural örnekleri şöyle olabilir:

  • Diğer ırklara karşı düşmanlıkları
  • İklim tercihleri
  • Kaynak gereksinimleri
  • Doğum oranları ve yaşam süreleri
  • Arzuları (teknoloji araştırması, ticaret, barışçıl varoluş, dünya hakimiyeti)
  • Yetenekleri (yapı inşası, kaynak toplama, savaş yapma vb.)
  • Ve bunun gibi...

Yani, tüm bunların çalışması için en kritik girdi, bu ırkların içine gireceği bir dünyadır. Arazi, tercihlerini ve genişlemesini belirleyecektir. Bir dünya yarattıktan sonra, dünyada bu ırkların uygun bir şekilde yaşayacağı rastgele yerleri seçin ve gevşeyin. Şimdi ilginç şeyler olmaya başlıyor. Artık arzularınız ve yeteneklerinizle kara ve yarışlarınız olduğuna göre, bir tarih oluşturmaya başlayabilirsiniz. Bu ırklar kaynakları toplar, sonra yapılar inşa edilir:

  • Kasabalar yüksek kaynak, yüksek yaşama gücü alanlarında.
  • Yollar daha büyük kasabaları birbirine bağlar.
  • Nehirler arası köprüler .
  • Dağların üzerinden tüneller .
  • Kaleleri savaşlarda cevaben genişleme ön hatları yakınında.

Herhangi bir yapı diğer ırklar tarafından basılabilir / fethedilebilir. Tarihte ne kadar uzun bir yapı (kasaba veya kale gibi) varsa, o kadar savunmasızdır, o kadar zorlaşır. Ve daha arzu edilen, kontrol isteyen yarışlar içindir. Savaşlar, yarışların buluştuğu yerde yapılır (en az biri düşmanca). Savaşlar, yer işaretlerinden veya yakındaki yapılardan sonra adlandırılır veya savaş önemliyse veya yer işaretleri adlandırılmamışsa, yer işaretleri savaştan sonra adlandırılır.

Yollar, köprüler ve tüneller ticaret ve kaynak taşımacılığı yoluyla genişletilir. Her birinin kaynak harcamasıyla artabilecek bir maksimum verimi vardır. Çayırların ortasında bir taş kale mi inşa ediyorsunuz? Bu yollar gerekli taşı taşıyarak ağır bir şekilde kullanılacaktır. Daha büyük olacaklar ve bir isim alacaklar.

Nüfusları ve tarihin seyrini etkileyen doğal afetler meydana gelir. Depremler bir kasabayı yıkarak veya bir tüneli yıkarak azaltabilir. Bir sel yol veya köprüyü yıkayabilir.


Cüce Kalesi kadar derinlemesine değil, ama bir başlangıç. Şimdi tahmin edebileceğiniz gibi (ve Johnathan Hobbs'un bahsettiği gibi) bu ırklar ne kadar genişlerse, o kadar fazla hücre simüle ediliyor. Sadece daha fazla hücre simüle ediliyor değil, aynı zamanda inşa edilecek / sürdürülecek yapılar, ücret savaşları, ticaret ... ticaret vb. Gibi simülasyonlar daha karmaşık. Bu herhangi bir dil için ağırlaşıyor. Javascript daha erken yavaşlayabilir. Ancak, gelişmiş hız için her zaman karmaşıklığı feda edebilirsiniz.

Hepsi bir simülasyon (karmaşık da olsa), yol boyunca önemli olayları kaydediyor ve tarih olarak adlandırıyorsunuz.

Ben de sadece Cüce Kalesi dünya nesil daha hızlı yapmak için beyin fırtınası insanlar için bir Bay12 forum yazı bulundu. Bunu okumadım, ancak uygulamanızın çok yavaş olmasıyla ilgili sorun yaşarsanız bazı ipuçları verebilir.


Her zamanki gibi harika ve bilgilendirici @ Byte56. :)
jcora

1
Teşekkürler Bane. Belki her zaman değil, sadece insanlar hakkında bir şeyler bildiğimi düşündüğüm sorular soruyor. Bana daha fazla düşünme ve bir şeyler
yazılma

4

Bir yan nokta olarak, JavaScript düşündüğünüz kadar yavaş değil .

Tarayıcı geliştiricileri JavaScript motorlarını optimize etmek için çok zaman ve enerji harcadılar . Bağlandığım karşılaştırmalı değerlendirme, karşılaştırmalı görevlerin dışında, medyanda JavaScript'in C'den sadece 5 kat daha yavaş olduğunu , bu da diğer yorumlanmış diller için söylenemez. Ve alt sınır daha da etkileyici: C ile eşit .

Tabii ki, dil ölçütleri gerçekten fazla bir şey ifade etmiyor - muhtemelen farklı bir ölçüt kullanarak karşı örnekleri bulabilirsiniz. Ancak önemli olan nokta, JavaScript'in oldukça hızlı olmasıdır . Hayır, C veya C ++ değil ve olmaya çalışmıyor. Ancak, "yorumlanmış dil == yavaş" zihniyetinde takılı kalmamak iyidir, çünkü önemsiz karmaşıklığın herhangi bir görevi için, performans algoritma tasarımında daha fazla ve dil seçiminde daha az önemli olacaktır.

Aslında tüm bunları bir yorumda yazacaktım, ama yerim bitti.


1

Evet, javascript üzerine inşa edilebilir, ASM.js gibi C'den neredeyse 2 kat daha düşük hıza sahip olan proyektleri kontrol edin. , şu anda monocore.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.