İki ordunun savaş çıktısını hesaplamak


20

Flash kullanarak stratejik bir oyun programlıyorum. Oyun ünlü oyun "Travian" çok benzer çalışır.

Benim sorunum şu: İki ordu arasındaki bir kavga sonucu kaybedilen birliklerin hesaplanmasını yapmaya çalışıyorum. İki ordunun farklı birimleri vardır. Bazıları diğer bazı birimlere karşı daha güçlü, diğer tiplere karşı daha zayıftır.

Bu farklılıkların etkisini, mücadele denklemine nasıl koyabilirim?

Sadece att ve def noktalarına sahip olmaları kolay gibi görünüyor, ancak birimlerin tip bağımlılığına gelince kayboldum.


6
Savaşlarınızın sonucu tamamen deterministik olmalı mı yoksa bir çeşit rastgelelik mi kullanmak istiyorsunuz?
sum1stolemyname

4
OP tarafından verilmediği için çok oyunculu bir oyun olarak etiketlenmesi gerektiğini düşünmüyorum. Ve 'tip bağımlılığı' ile klasik rock-> makas-> kağıt-> rock tipi şeyden mi bahsediyoruz?
Komünist Ördek

Yanıtlar:


10

Amit'in Lanchester denklemlerine bakma önerisini desteklemenin yanı sıra, bunun bir oyun tasarımı kararı olduğunu eklemek istiyorum, size verebileceğimiz ampirik bir gerçek değil. Birim türünü dikkate almak istiyorsanız, bunun ne anlama geldiğine karar vermelisiniz. Bu, oyununuzun dahil etmesini istediğiniz tüm faktörleri içeren bir denklem seçmek anlamına gelir. Piyadelerin süvariden daha iyi olmasını istiyorsanız, bunun ne anlama geleceğine karar vermelisiniz - örn. 100 piyadeye eşit kaç süvariye ihtiyacınız var? Kimin kime saldırdığı önemli mi? Sadece piyade ve süvarilere farklı saldırı ve savunma değerlerinin verilmesinin yeterince iyi olmadığını ima ediyor gibisiniz - neden böyle? Sadece bu değerlerle yakalanamayan başka neler temsil etmeye çalışıyorsunuz?

Oyununuzda hangi faktörlerin modellenmesini istediğinize karar vermelisiniz, çünkü oyuncular ona yaklaşma şeklini etkiler. Bunlar arasında birim boyutu / miktarı, birim tipi, birim deneyimi (örneğin gazi durum), arazi ve çevresel etkiler, varsa saldırı ve savunma arasındaki farklar, hasar ve yıpranma modellenip modellenmemesi, zamanın geçtiği zamanın modellenip modellenmemesi sayılabilir. mücadele, geri çekilme veya kaçma yeteneği (muhtemelen moralin modellenmesi dahil), denklemde ne kadar rasgelelik istediğinizi vb.

Tüm bunları öğrendikten sonra, alabileceğiniz birkaç temel matematiksel yaklaşım vardır. Sen-ebilmek yapmak gibi bir yuvarlak "birçok vurmak için şans" sistemi gibi birçok RPG var. d20 savaş sistemi. Orijinal Uygarlık oyunu gibi tek yönlü bir "savunma vs savunma" ağırlıklı para atma sistemi yapabilirsiniz. Her bir tarafın rastgele bir sayıya nitelikler ekleyerek bir puan üretmesini ve en yüksek değeri kimin kazandığını kazanabilirsiniz. Ve bu sistemlerin her bir aşamada çalışmasına ya da isabet puanları, moral puanları ya da her neyse düşmesine izin verebilirsiniz. Herhangi bir sistem çalışabilir, ancak oynatmak istediğiniz şekilde dengelemeniz gerekir. Nihayetinde savaşın nasıl modelleneceği seçimi oyun tasarımının önemli bir parçası ve diğer insanların size verebileceği bir şey değil.


Tamamen haklısın Kylotan. Oyunun tasarımına başlamadan önce kavga hakkında bazı fikirlerim vardı. Bununla birlikte, bu soruyu tasarlamanın daha iyi bir yolu olup olmadığını ve onu uygulamanın en iyi yolunun ne olduğunu bulmak için gönderdim. Sanırım her iki amacı da kazandım :) Arkadaşım, Lütfen bana bu Matematiksel yaklaşımlar hakkında daha fazla bilgiyi nerede bulabileceğimi söyler misiniz? Ayrıca, sistemi seçmeyle ilgili sorduğunuz tüm soruları yanıtlarsam, benim durumum için hangisinin en iyi sonucu verdiğini bana tavsiye eder misiniz? Zaman ayırdığınız için çok teşekkür ederim :)
Ali Albahrani

Hangisinin en iyi olacağını söyleyemem, ancak muhtemelen basit bir şekilde başlamalı ve gerekirse bunu geliştirmelisiniz. Travian, basit bir saldırıya karşı savunma sistemine sahip gibi görünüyor, buna göre 2 birim tipi (piyade ve süvari) ve birim başına 2 savunma puanı var. Uygarlık 1'de kullanıldığı gibi bir savaşı çözmenin kolay bir yolu, saldırganların saldırı puanını toplamın artı savunucunun savunma puanına bölmektir. Bu size bir yüzde verir. Şimdi yüzde 0 ile 100 arasında rastgele bir sayı seçin. Saldırganın saldırı skorundan düşükse, saldırganlar kazanır. Aksi takdirde savunucular kazanır.
Kylotan

15

Solar Realms Elite için savaş modelleme konusunda Lanchester'ın Denklemlerinden ilham aldım . Her savaş turunda aynı anda birkaç kavga yaşadım.

İlk kavgada herkes askerlere saldırdı. SRE'de askerler askerlere karşı en iyisidir (taş kağıt makas değil, piyade, hava saldırısı ve derin uzay). Askerlerin en iyi saldırıyı gerçekleştirdiği bir saldırı ve savunma gücü kurdum:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

İkinci dövüşte herkes savunma istasyonlarına saldırdı. SRE'de avcılar (hava) en iyi savunma istasyonlarına karşıdır (örn. Uçaksavar):

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

Üçüncü savaşta herkes ağır kruvazörlere saldırdı. SRE'de ağır kruvazörler uzaydadır ve diğer ağır kruvazörlere karşı en iyisidir:

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(Hangi sabitleri kullandığımı hatırlamıyorum; bunlar sadece örnektir.) Saldırganlar savunma gücünün bir kısmını kaybeder ve savunucular saldırı gücünün bir kısmını kaybeder. Bunun Lanchester'ın Kare Yasasına ( buradaki denklemler ) karşılık geldiğine inanıyorum . Rasgelelik ekledim ama tam olarak nerede olduğunu hatırlamıyorum. Her savaş turundan sonra ordular daha küçük olurdu. Mermi sayısına maksimum bir limit koydum; bundan sonra kaybeden taraf geri çekilirdi.

Piyadeyi yerde ateşe götürmek gerçekçi değildi, ancak oyun birimlerinde tüm birimlerin diğer tüm birimlerle savaşabilmesi (daha düşük etkinlikle) için daha iyi çalıştı.


12

'Açık bir çözüm bulamazsanız, açık bir çözüm arayın' demeye meyilliyim. Bir ordu silinene veya geri çekilinceye kadar (oyununuzun olası sonuçlarına bağlı olarak) savaşı dahili olarak simüle edebilirsiniz.

Ben böyle bir şey kullanırdım:

Savaşın her bir tekrarı için, tüm birimler fırsatçıdır, bu yüzden ellerinden gelenin en fazla hasarını vermeye çalışırlar. Her birim, bilinen avantajlara / dezavantajlara dayanarak bu raunta saldıracağı bir düşman birimini seçer.

Ardından, tüm alt dövüşler gerçekleştirilir. Bir örnek:

Mızrakçıların korsanlığa karşı etkili olmasına, okçulara karşı etkili kavalaya ve mızrakçıya karşı etkili okçulara izin verin.

Bu temel birimlerin her iki tipinden oluşan iki ordu arasındaki bir kavgada, tüm mızrakçı süvarilere saldırır, tüm süvari birimleri okçulara saldırır ve tüm okçular mızrakçılara saldırırdı. Örneğin bir tarafta okçu yoksa, diğer taraflardaki süvari bir sonraki en iyi hedef türünü seçer (düşman süvari birimleri olarak)

Her birim-saldırı-birim olayı, kaybeden birim hasar görmüş veya imha edilmiş olarak işaretlenmiş olarak ayrı ayrı çözülür.

Tüm bireysel dövüşler çözüldükten sonra, kritik hasar görmüş veya imha edilmiş tüm birimleri kaldırın.

Bir sonraki yineleme şimdi azaltılmış orduları kullanmaya başlar.


Bu gönderiye gerçekten katılıyorum. Tek bir denkleme indirgemek yerine savaşta tekrarlamak daha iyidir. Ve kesinlikle biraz rastgelelik eklerdim. Zayıf savunmacının yuvarlanması ve kritik bir puan alması için o kadar küçük bir şans olmalı. Yinelemenin bir başka avantajı, oyuncuya göstermek için olayların bir anlatımını oluşturabilmenizdir. "Kılıçlılar saldırdı ve kısa süre sonra ayak adamlarını reddetti, ama sonra calvary geldi ve ..."
Tim Holt

Cevabınızı çok beğendim ve rastgele bir şekilde uygulayacağımı düşünüyorum :)
Ali Albahrani

3

Şu anda Solar Realms ( Star Empire Elite ) ' in basit bir sürümü olan bir oyunu beta test ediyorum ve Amit'in denklemlerine (yukarıda) benzer bir şey kullanarak başladım. Özellikle, üç aşamadan ikisini kazanmak zorunda kaldığınız savaşta üç aşamaya sahip olma fikrini sevdim. Ama aynı zamanda savaşa bir rastgelelik unsuru eklemek istedim ve bunun için bazı masa üstü oyunlarından etkilendim.

Oyun ölçeklendirilecekse işlem bir endişe kaynağıdır, bu nedenle yukarıdaki sum1stolemyname tarafından önerilen yöntemi takip etmek istemedim, ancak oyununuz bir sunucunun aksine sonuçları işlemek için istemciyi kullanıyorsa, bu bir Iyi bir yaklaşım.

Savaşı iki aşamaya ayırmaya karar verdim (Amit'in modelindeki üçe benzer): hava ve yer. Saldırıyı hesaplayıp gücü savunuyorum ve saldırı gücünü bir kesirle ayarlıyorum (savunana avantaj sağlamak için). Bu noktada, eğer saldırı gücü ve savunma gücü eşitse, saldırı% 50 zafer şansına sahiptir. Oradan, zafer yüzdesini, saldırganın savunucuya kıyasla ne kadar fazla (veya daha az) güce bağlı olarak yukarı veya aşağı ayarlıyorum. İşte hava için bazı basitleştirilmiş denklemler:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

Chance_of_victory'nin asla 80'den daha büyük veya 5'ten daha az olamayacağını belirtiyorum. Oradan, 100'den rastgele bir sayı üretiyorum ve sonra bu sonucu kara savaşına taşıyorum.

Memnuniyetimi çözemediğim bir şey de kaza oranları. Ama bunu anlamanın iyi bir yolunun, şansı_yüksek_sayıyı üretilen rasgele sayı ile karşılaştırmak ve saldırgan savunma güçlerinin bir kısmını zayiat olarak almak olduğunu düşünüyorum.

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.