Kaynaklar tükendiğinde kaynakları fabrikalar arasında nasıl adil bir şekilde dağıtabilirim?


12

Oyunumdaki ana kaynak, zaman içinde değişen bir kayan nokta sayısı olarak depolanan kütledir . Kaynak düğümleri kütleyi arttırır ve fabrikalar onu boşaltır. Örneğin, saniyede 5 kütle veren bir kaynak düğümüm varsa, 5 * deltaTher oyun adımında kütle kazanacağım . Kütle en yakın tamsayıya yuvarlanmış olarak gösterilir ve kazanç / kayıp göstergeleri onda biri ile gösterilir.

Kütle sıfıra isabetle nasıl başa çıkmalıyım? Bu, birden fazla fabrika aynı anda inşa etmeye çalışıyorsa bir yarış koşulu yaratır: Sırada ilk sırada bulunan veya daha az kaynak tüketen ve daha fazla kaynak geldikten sonra diğerlerinden daha hızlı inşa edilen fabrikalar öncelik kazanır.

Bununla nasıl başa çıkabilirim? Adımı tamamen atlamalı mıyım?


Bah, yorumum kaydedilmedi. Daha iyi bir açıklamam vardı. Temelde her nesne tarafından her adımda erişilen bir kaynak var. Her nesne kaynağa ekleme veya çıkarma yapar. Benim sorunum kaynak 0 vurursa ne yapacağımı bilmiyorum. Bir tür kuyruk yapmalı mıyım? Bir nesnenin adımını atlamalı mıyım? Ne?
Mafya

3
Yuvarlak Robin. Sorun çözüldü.
Patrick Hughes

Aşağıdaki Roy'un cevabı, yorum ile birleştiğinde, iyi, bakımı kolay ve yuvarlak bir robin sistemi tanımlamaktadır. Derhal tasarım probleminiz çözüldüğü sürece hepsi iyi =)
Patrick Hughes

Yanıtlar:


9

Petr ile hemfikirim: Bunu yapmanın belirli bir yolu yok. Bunu nasıl yapmak istediğiniz, oyununuzu nasıl tasarlamak istediğinizle ilgilidir.

Bununla birlikte, bu durumda, elde etmeye çalıştığınız türden bir tamircinin hemen belli olduğunu düşünüyorum: Sadece mevcut kütle miktarı dahilinde, şeylerin olabildiğince hızlı üretilmesini istiyorsunuz.

Kapasite dahilinde üretim

Yüce Komutan'ın kitabından bir yaprak çıkaracağım, çünkü onlarınkine çok benzeyen bir sistem yapıyorsunuz: Kapasitenin üzerinde üretim yapıyorsanız, bununla başa çıkmanın en iyi yolu üretimin yavaşlaması. Üretim kapasitesini düşürmek aslında oldukça basittir.

Üretim hızı tamircisi

Her güncelleme adımı, fabrikalarınız sadece belirli bir miktar üretmez: her bir adımda ne kadar ilerleme kaydettiklerini ve ne kadar kütle kullandıklarını belirleyen bir üretim hızı ile çalışırlar . % 75 kapasiteyle üretim yaparken, fabrikalarınız her adımda% 75 daha fazla ilerleme kaydeder ve% 100 kapasiteye kıyasla% 75 kütle kullanır.

Üretim hızını hesaplamak için, herhangi bir şey inşa etmeden önce, bu adımı tam kapasitede kullanılacak toplam kaynakları belirlemek için fabrikalarınızı sorgulamanız gerekir. Sonra basit bir hesaplama yaparsınız:

production speed = (total mass capacity / mass required this step)
if (production speed > 1.0) production speed = 1.0

Diyelim ki tam kapasiteyle üretmek için bu adımda 125 kütleye ihtiyacınız var, ancak bu adımda sadece 100 kütle var. Bu denklem size 0,8 üretim hızı sağlar (% 80'in ondalık gösterimi). Fabrikalarınıza binalarını gerçekten gerçekleştirmelerini söylediğinizde, onlara hangi hızda ürettiklerini söylemek için bu değeri verirsiniz: ve şimdi üretiminiz tüm yönetimde yavaşlar.

Alternatifler

Ayrıca, üretim kapasitesi dolana kadar fabrikaları geçici olarak kapatmaya başlayabilirsiniz ve son derece düşük kapasiteyle jeneratörlerden daha uzak fabrikalara olanların olduğunu görmek çok ilginç olabilir.

Birden fazla kaynak mı?

Bunu nasıl ele aldığınıza bağlı olarak; birçok seçenek var. En basit olanı muhtemelen her kaynak için bir üretim kapasitesi hesaplamak ve sonra en düşük olanı seçmektir, böylece en zayıf kaynağınız geri kalanlar için bir darboğaz haline gelir.


Sanırım fabrikaya% 80 hızda üretim yapmasını söylemenize bile gerek yok çünkü fabrikanızın yarattığı şey sabit miktarda kütle kullanıyor. Örneğin: 100 kütle alan bir tank inşa edersiniz, normalde fabrika her döngüde 2 kütle kullanabilir. Bu, tankı tamamlamak için 50 döngü ve tankların mevcut kütlesine 2 eklediğiniz her döngü anlamına gelir. Şimdi, sadece 1 kütleniz var, bu da bu döngü anlamına gelir, tanklar şu anda kütle 2 yerine 1 artar. Her döngüden sonra, mevcut kütle ile tankın tamamen inşa edilip edilmediğini görmek için gereken toplam kütleye bakın.
Thomas

0 kütleniz varsa, sadece tanka herhangi bir kütle eklemeyin. Bu şekilde bir şey inşa etmek için gereken süre, kitlesel gelirinize bağlı olarak değişebilir. 2 kütle / döngü ve sadece 3 gelir kullanabilen 2 fabrikanız varsa, tank 1 50 döngüde, tank 2 100'de inşa edilir. Başka bir yol, onu kullanan tüm fabrikalar üzerindeki toplam kütle miktarını bölmektir ( aktif olarak bir şeyler inşa etmek). Bir fabrikanın kullanabileceği toplam kütle miktarı, fabrikaya seviyeler eklenerek yükseltilebilir. Örneğin seviye 1'de 2 kütle, seviye 2: 3 kütle vb. De harcayabilirler.
Thomas

@Tomlar Üretimde bir ürüne kütle eklemek, ürünün bir yüzdesini tamamlamaya kıyasla aşırı karmaşık bir yol gibi görünüyor. Özellikle de fabrika basit bir "üretim oranı" özelliği yerine kaynak sisteminiz hakkında her şeyi bilmek gerekir beri. Oyuncunun sonucu aynıysa, uygulamayı mümkün olduğunca basit tutun. Bu, gelecekte kaynak eklemeniz / kaldırmanız gibi gelecekte değişiklik yapmayı da kolaylaştırır.
Hackworth

@Hackworth Ben katılmıyorum, fabrika kaynak sistemi hakkında bilmek gerekmez. Fabrika sadece ne inşa ettiğini ve ne kadar uzak olduğunu bilir. Kaynak sistemi sadece fabrikaya yapıya X miktarı eklemesini söyler. Bu şekilde, bu fabrikanın sahip olduğu kaynak geliri yüzdesini hesaplamanıza gerek kalmaz ve kaynak gelirini ek tamamlanma yüzdesine çevirmeniz gerekmez.
Thomas

6

Jonathan Hobbs'un cevabını beğenmeme rağmen bir kuyruk sisteminin daha da basit olduğunu düşünüyorum:

Queue<Factory> queue = ...;
int numFactories = ...;

Update()
{
    int resources = GetAllResourcesForThisStep();
    for(int i = 0; i < numFactories; i++)
    {
        if(queue.Peak().RequiredResources <= resources)
        {
            Factory f = queue.Pop();
            resources -= f.RequiredResources;
            queue.Push(f);
        }
        else
        {
            break;
        }
    }
}

Bu muhtemelen ortalama olarak Jonathan'ın uygulamasıyla aynı şekilde çalışacaktır. Ancak Jonathan'ın çözümü, çalışma hızı çok düşük olarak ayarlanmışsa ve uygulamamın bu çerçeve için çok yüksek bir kaynak talebine sahip bir fabrikaya sahip olması, birkaç çerçeve için diğer fabrikaları engellemesini sağlayabilir.


+1 Soruda olduğu gibi ikili kaynaklara sahip bir oyun geliştiriyorum ve tedarik kilidi sorununu çözdüğümde buna benzer bir şey kullanmayı planlıyorum. Tam kod değil, arkasındaki fikir. Kaynakları bir onay işaretinde kullanabilen tüketiciler, aşağıdaki onay işaretinde daha düşük bir önceliğe sahip olacaktır. Ayrıca, bu tüketicinin yüksek önceliğe sahip olup olmadığını belirtmek için bir bayrak eklemeyi ve bu bayrağın kontrolünü kullanıcıya vermeyi de planlıyorum.
John McDonald

Onlara ayrı ayrı öncelikler verirseniz açlıktan sakının. :)
Roy T.

Yine de ayrı önceliklerle açlık, amaç olacaktır. Hiç Settlers 4 veya Knights & Merchants oynadın mı? Binaları aşırı inşa ederseniz, sınırlı kaynaklar rastgele binalara gider ve her şeyi bitirmek sonsuza kadar sürer . Ama aynı zamanda bir binanın önemli olup olmadığını seçmenize izin veriyorlar, bu durumda kaynaklar önce bu önemli binalara gidecek. Anahtar, asla mümkün olduğunca az inşa etmektir ya da yaparsanız aşırı inşa etmektir.
John McDonald

5

Kendi oyunumda benzer bir tedarik sistemi geliştiriyorum, bu yüzden arz kilidi sorununun ve favoritizmin nasıl çözüleceğini de düşünüyorum. Sorunu göstermek için basit bir örnek oluşturacağım:

Bir listeniz varsa: [yapımcı1, tüketici1, tüketici2, tüketici3] ve sipariş = 0'dan başlayarak sırayla güncelleme yaparsanız, şunları elde edersiniz:

producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer1 wants 3 mass. Success, you now have 4 mass
consumer2 wants 3 mass. Success, you now have 1 mass
consumer3 wants 3 mass. Fail
etc...

Tüketici1 tüm eğlenceyi alırken, tüketici 2 ve 3 tüketici 1 tatmin olana kadar açlıktan ölüyor. Oyununuza bağlı olarak, bu istenmeyebilir. Oyunumda biliyorum, değil. Oraya geldiğimde, bir kene ile beslenen tüketicilerin bir sonraki kene için kuyruğun arkasına geçeceği bir kuyruk oluşturacağım, ki Roy T.'nin ne olduğuna inanıyorum. Yukarıdaki örnek şöyle görünecektir:

producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass. <-- Move to end of queue
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer2 wants 3 mass. Success, you now have 4 mass  <-- Note the order change
consumer3 wants 3 mass. Success, you now have 1 mass
consumer1 wants 3 mass. Fail
etc...

Bu şekilde, herkes kaynaklardan adil bir şekilde pay alacaktır.

Ayrıca, kullanıcının kaynak önceliğine sahip belirli yapıları seçebilmesi için öncelik kuyruğu olarak kullanılacak ek bir kuyruk uygulamayı planlıyorum. Öncelik kuyruğu her zaman standart kuyruktan önce sunulur. Önce tüm üreticilerin güncellendiğinden emin olun, ardından tüm kaynakları ikinci sırada kullanın, aksi takdirde kaynakları bir onay işaretiyle kısmen ürettiğinizde ve bazı tüketiciler zaten aç bırakıldığında kuyruk bozulur.

Özetle: Üreticileri güncelleyin, ardından öncelik sırasını, beslenen tüketicileri öncelik sırasının sonuna taşıyın, ardından standart kuyruğu güncelleyin ve beslenen tüketicileri standart kuyruğun sonuna taşıyın.


Sınıra bakıldığında, her tüketici bitene kadar hiçbir tüketicinin bitiremeyeceği anlamına gelebilir. Gerçekçi bir üretim zinciri senaryosunda, bu pek olası değildir ve eğer birisi büyük bir ordu için bir inşa kuyruğuna sahip olmak isterse oldukça felaket olabilir. Ordunun inşa edildiği süre boyunca neredeyse hiç birliği kalmayacak.
Cardin

Soruyu okuduğumda bu cevap ilk düşüncemdi. Ayrıca, kene başına tüketilen kütlenin tam bir birim oluşturmak için gerekli olan kitle olmadığı, bunun yerine gerekli süre boyunca birim maliyetinin olduğu unutulmamalıdır, bu yüzden biriminiz olmadıkça @ Cardin'in endişelerinin geçerli olduğundan emin değilim tıklama başına maliyet toplam toplama oranınıza çok yakındır. Öncelik sırasının oyuncu tarafından açıkça yönetilmesini isterdim, böylece kimin açlık çekeceğine karar verir.
brice

@Cardin, oldukça haklısın, ama aynı zamanda bir oyun tamircisi olarak da kullanılabilir. Yerleşimciler 4, Şövalyeler ve Tüccarlar, Toplam Yok Etme, Yüksek Komutan bunu bildiğim oyunlardır. Hile etmektir değil bu tedarik kilidi ulaşmak ve bunu yaparsanız, emin en kısa zamanda tedarik kilit çıkmak olun. Öncelik kuyruğu eklemek, insanlara daha kolay çıkma yolu sağlar.
John McDonald

3

John'un fikrini genişleteceğim, çünkü bunu biraz sohbetle tartıştık .

edit: Bu çözüm aslında sadece consumableAmount fabrika kaynakların bir toplu almak ne sıklıkta ilgili ise tercih edilir. Eğer hepsi aynı ise, o zaman gerçekten sadece bir kuyruk kullanabilirsiniz.

Benim çözümüm: Tüm fabrikalar öncelik sırasına göre listelenmiştir. Fabrika açlık çektiği için öncelik artar. Açlık, öncelik, fabrika kaynakları tükettiğinde sıfıra ayarlanır. En büyük öncelik her zaman bir sonraki kaynak grubunu elde etmektir.

Hangi fabrikanın hangi kaynakları alacağını belirlerken, bir tür sahte kodla:

iterator i = factoryqueue.start()
bool starvation = false
while(i.next())
  if(i.ready)
    if (!starvation) 
      if (i.consumeAmount < resource.count) starvation = true
      else 
        i.consume(resource)
        i.priority = 0
    if (starvation)
      i.priority += 1

Bu şekilde fabrikalarınız sırayla 1 ürün yapacak, eğer daha ucuz ürünlerin daha sık yapılması için consumeAmount'u hesaba katarak ayarlamak isterseniz, önceliği 1 / consumeAmount kadar artırabilirsiniz.


Bunu kaldırmak istiyorum, ancak bunun ne anlama geldiğinden emin değilim - açlık izler, ancak aksi takdirde (muhtemelen) kuyrukta normal olarak döner ve hem açlık hem de öncelik asla ortaya çıkmaz hiçbir şey yapmamak.
doppelgreener

önceliği + = 1 / miktar arttırırsanız fark görünür hale gelirBuFactoryConsumes, o zaman bir ürün oluşturmak için daha fazla kaynağa ihtiyaç duyanlar biraz geride kalarak daha az pahalı olanların orantılı olarak daha fazla kaynak grubu almasına izin verir. Bu, fabrika başına kaynak oranını bile ortadan kaldırır. Bununla birlikte, kaynakların fabrika tarafından her kullanımında açlık numarası 0 sihirli değerine ayarlandığından, bu tam olarak aptalca bir kanıt değildir, bu nedenle kaynak yenilemesi flört ederken tam olarak eşit olarak dağıtılacak şekilde kavranmayacaktır.
Toni

Aslında, aslında garanti edilmediğinden emin değilim. Emin olmak için bazı grafikler çizip test etmem gerekecekti.
Toni

oh ve öncelik, öncelik sırasının kendisinin bir kalitesidir. Nasıl yapılacağını açıklamayacağım. Öncelik sırasının kendisi her zaman üyelerinin öncelik değerine göre sıralanır.
Toni

+1 Bunun öncelikli bir kuyruk olduğunu anlayarak, çalışmaları artık basit görünüyor: kuyruğu aşağı doğru kaydır ve kaynakları tüketebilecek en kısa şeyi seç. Kapasite büyük ölçüde bölünmüşse (Bu kene 1.000 kaynağınız var, ancak 100 kaynak oluşturuyor) bu bir sorun olmamalı ve işler oldukça iyi besleniyor. Kaynaklarınızda bu işaretin üzerinde bir şey olsa bile, sonunda biraz ilerleme kaydedecek kadar tasarruf edebilir - bu da onu yavaşlatma veya büyük şeyleri tamamen küçük şeyler lehine kapatma etkisi olan iyi bir şeydir. Bunu çok beğendim. :)
doppelgreener

2

Garip soru.

Benim sorunum kaynak 0 vurursa ne yapacağımı bilmiyorum. Bir tür kuyruk yapmalı mıyım? Bir nesnenin adımını atlamalı mıyım? Ne?

Yapmanız gereken şey, bir oyun mantığı bağlıdır sen oluşturun. Bir kuyruk yapabilir, atlayabilirsiniz. Oyununuzun nasıl davranması gerektiğini düşündüğünüze bağlıdır. Sorunu yanlış yaparsam beni düzeltin.


1

Tüm konstrüksiyonlar için kene başına toplam kaynak talebinin bir kısmını tutabilirsiniz. Bir kaynak depolama alanı bu gerekli miktardan daha az isabet ederse, depolama en az 1 üretim sayısını destekleyecek kadar toplanana kadar tüm inşaat tamamen durur. Sonra üretim devam edebilir.

Dolayısıyla üretim hızını bir şamandıra olarak depolamak yerine ikiliktir - ya fabrikanız tam hızda üretir ya da üretmez.

Bununla birlikte, bu yaklaşım esas olarak Jonathan'ın cevabı ile aynıdır, üretim oranı özel durumlar 0.0 ve 1.0 için - 0.0 <= f <= 1.0 olan rastgele bir şamandıra f, sarsıntılı depolama miktarı hareketleri almadığınız için muhtemelen daha zariftir , ancak mantık biraz daha basit olmalıdır.

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.