RPG Hasar Formülleri nasıl geliştirilir?


117

Klasik bir 2d RPG (son fanteziye benzeyen bir damarda) geliştiriyorum ve birinin formüllere / kaynaklara / örneklere verilen bağlantılara nasıl zarar verecekleri konusunda bir tavsiyesi olup olmadığını merak ediyordum. Mevcut kurulumumu açıklayacağım. Umarım bu soruyu abartmıyorum ve sorularımın çok geniş / geniş olması durumunda özür dilerim

Karakterlerim istatistikleri aşağıdakilerden oluşur:

enum Stat
{
    HP = 0,
    MP = 1,
    SP = 2,
    Strength = 3,
    Vitality = 4,
    Magic = 5,
    Spirit = 6,
    Skill = 7,
    Speed = 8, //Speed/Agility are the same thing
    Agility = 8,
    Evasion = 9,
    MgEvasion = 10,
    Accuracy = 11,
    Luck = 12,
};

Canlılık temel olarak fiziksel saldırılara karşı savunmadır ve ruh, sihirli saldırılara karşı savunmadır.

Tüm istatistiklerin maksimum değerleri vardır (HP için 9999, MP / SP için 999 ve geri kalanı için 255). Yeteneklerle birlikte, kabiliyetlerden önce / sonra tipik değerlerle (seviye 100'de) 9999, HP / 9999, HP / 9999, HP için 9999, HP + 8000 / 20.000 olacak SP / MP için 2000, diğer istatistikler için 180/350

Geç oyun Düşman HP tipik olarak daha düşük milyonlarda olacaktır (en fazla ~ 12 milyon olan süper bir patronla).

İnsanların doğru şekilde ölçeklenen düzgün hasar formülleri geliştirdiklerini merak ediyordum. Örneğin, bu verilere dayanarak, Final Fantasy X için hasar formüllerini bir üs olarak kullanmak çok umut verici görünüyordu. Burada tam bir referans http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381 ancak hızlı bir örnek olarak: Str = 127, 'Saldırı' komutu kullanılmış, düşman Def = 34.

1. Physical Damage Calculation:
Step 1 ------------------------------------- [{(Stat^3 ÷ 32) + 32} x DmCon ÷16]
Step 2 ---------------------------------------- [{(127^3 ÷ 32) + 32} x 16 ÷ 16]
Step 3 -------------------------------------- [{(2048383 ÷ 32) + 32} x 16 ÷ 16]
Step 4 --------------------------------------------------- [{(64011) + 32} x 1]
Step 5 -------------------------------------------------------- [{(64043 x 1)}]
Step 6 ---------------------------------------------------- Base Damage = 64043
Step 7 ----------------------------------------- [{(Def - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------ [{(34 - 280.4)^2} ÷ 110] + 16
Step 9 ------------------------------------------------- [(-246)^2) ÷ 110] + 16
Step 10 ---------------------------------------------------- [60516 ÷ 110] + 16
Step 11 ------------------------------------------------------------ [550] + 16
Step 12 ---------------------------------------------------------- DefNum = 566
Step 13 ---------------------------------------------- [BaseDmg * DefNum ÷ 730]
Step 14 --------------------------------------------------- [64043 * 566 ÷ 730]
Step 15 ------------------------------------------------------ [36248338 ÷ 730]
Step 16 ------------------------------------------------- Base Damage 2 = 49655
Step 17 ------------ Base Damage 2 * {730 - (Def * 51 - Def^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ---------------------- 49655 * {730 - (34 * 51 - 34^2 ÷ 11) ÷ 10} ÷ 730
Step 19 ------------------------- 49655 * {730 - (1734 - 1156 ÷ 11) ÷ 10} ÷ 730
Step 20 ------------------------------- 49655 * {730 - (1734 - 105) ÷ 10} ÷ 730
Step 21 ------------------------------------- 49655 * {730 - (1629) ÷ 10} ÷ 730
Step 22 --------------------------------------------- 49655 * {730 - 162} ÷ 730
Step 23 ----------------------------------------------------- 49655 * 568 ÷ 730
Step 24 -------------------------------------------------- Final Damage = 38635

Bölücüler silahların saldırı derecesini ve zırh derecesini içerecek şekilde değiştirdim.

Sihirli Hasar şu şekilde hesaplanır: Mag = 255, Ultima kullanılır, düşman MDef = 1

Step 1 ----------------------------------- [DmCon * ([Stat^2 ÷ 6] + DmCon) ÷ 4]
Step 2 ------------------------------------------ [70 * ([255^2 ÷ 6] + 70) ÷ 4]
Step 3 ------------------------------------------ [70 * ([65025 ÷ 6] + 70) ÷ 4]
Step 4 ------------------------------------------------ [70 * (10837 + 70) ÷ 4]
Step 5 ----------------------------------------------------- [70 * (10907) ÷ 4]
Step 6 ------------------------------------ Base Damage = 190872 [cut to 99999]
Step 7 ---------------------------------------- [{(MDef - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------- [{(1 - 280.4)^2} ÷ 110] + 16
Step 9 ---------------------------------------------- [{(-279.4)^2} ÷ 110] + 16
Step 10 -------------------------------------------------- [(78064) ÷ 110] + 16
Step 11 ------------------------------------------------------------ [709] + 16
Step 12 --------------------------------------------------------- MDefNum = 725
Step 13 --------------------------------------------- [BaseDmg * MDefNum ÷ 730]
Step 14 --------------------------------------------------- [99999 * 725 ÷ 730]
Step 15 ------------------------------------------------- Base Damage 2 = 99314
Step 16 ---------- Base Damage 2 * {730 - (MDef * 51 - MDef^2 ÷ 11) ÷ 10} ÷ 730
Step 17 ------------------------ 99314 * {730 - (1 * 51 - 1^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ------------------------------ 99314 * {730 - (51 - 1 ÷ 11) ÷ 10} ÷ 730
Step 19 --------------------------------------- 99314 * {730 - (49) ÷ 10} ÷ 730
Step 20 ----------------------------------------------------- 99314 * 725 ÷ 730
Step 21 -------------------------------------------------- Final Damage = 98633

Sorun, istatistikler 255'in üzerine çıkmaya başladığında, formüllerin tamamen parçalanmasıdır. Özellikle 300'ün üzerindeki Savunma değerleri gerçekten garip davranışlar yaratmaya başlar. Yüksek Mukavemet + Savunma istatistikleri, örneğin büyük negatif değerlere yol açmaktadır. Kullanım durumum için doğru çalışması için formülleri değiştirebilmeme rağmen, tamamen yeni bir formülü kullanmak muhtemelen daha kolay olurdu. İnsanlar aslında nasıl hasar formülleri geliştirir? Excel'i açmayı ve formülü bu şekilde oluşturmayı deniyordum (örneğin, Saldırı İstatistikleri ile Savunma İstatistikleri eşleştiriliyordu) ama daha kolay bir yol olup olmadığını merak ediyordum. Oyunumun tam oyun mekaniğini burada aktaramazken, birisi hasar formülü oluşturmak için iyi bir başlangıç ​​yeri önerebilir mi?

Teşekkürler


1
Sanırım ilk ne tür istatistikleri istediğinizi ayarlayarak doğru şeyi yaptınız. Bu, oyuncu deneyiminin bir parçasıdır ve matematik bu değerlerin etrafına uymalıdır. Bu kadar çok istatistik olmasına rağmen, oyuncu hangi istatistiklerin büyülü, fiziksel saldırılarını vb. Etkileyeceğini sezgisel olarak bilmelidir. Bu nedenle, ilk büyük soru hangi istatistiklerin bir atağa karşılık geldiği ve bu istatistiklere karşı hangi istatistiklerin savunmakta olduğudır (Eski doktora için yalnızca karşı savunur) PhAtk).
Jonathan Connell

Muazzam şey dengedir, muhtemelen istatistikleri değiştirebileceğiniz ve ne tür sonuçlar elde edebileceğinizi görebileceğiniz etkileşimli bir program oluşturmak (C # veya hızlı bir şey demek) iyi bir fikir olabilir. Formülleri çalışma zamanında değiştirebiliyorsanız, bunun da yardımı olur :)
Jonathan Connell

4
Bunu yapmak için Excel'i kullanmayı düşünün. Görev için uygun görünüyor ve bir kod satırı yazmak zorunda kalmazsınız.
Alex Schearer

2
En önemli soru şudur: Hangi formül oyunculara en eğlenceli olanı verir ? ("eğlence" sayfasını aradı ve cevaplarının hiçbiri yoktu: P) İstatistikleri veya hasarları artarsa ​​çok hızlı oyuncular duyarsızlaşır, yavaşlarsa sıkılırlar. Oyuncular seviye kazandıklarında kendilerini mutlu hissetmeye ihtiyaç duyarlar, bu yüzden işe koyulduklarını hissetmeleri ve oyun performansı üzerinde gözle görülür bir etkisi olacağını hissetmeleri gerekir. (Bu benim 2 pence)
Annan

3
"(Def - 280.4) ^ 2" ha? Şey, Def> 255 veya Def> 300 için değil, tam olarak Def> 280.4 için tam anlamıyla garipleşmelerini beklerdim;) Bundan sonra, yüksek def, etkili bir şekilde formülün bu noktasında daha düşük bir def anlamına gelir. diğer noktalarda bekleniyor. BTW, bu şeyleri Wolfram Alpha veya benzeri ile çizebilirsiniz. Sadece iki tane tutmak için yeterli değişkenleri düzeltin ve güzel bir yüzey grafiği elde edin.
Hristiyan

Yanıtlar:


140

Bunun gibi formüller oluşturmak, temel matematiksel fonksiyonlar - Cebir ve Matematik öncesi sınıflarında öğrendikleriniz hakkında bilgi gerektirir .

Bunlara hakim olduktan sonra, kendinize sorun ("değer" i "hasar", "sağlık" veya "hız" veya başka bir şeyle değiştirin) :

Ardından , onu doğru bir hale getirene kadar çimdikleyin (şeyler ekleyin / çoğaltın, taban değerini değiştirin, vb.) . Bir grafik hesap makinesi, parametrelerde yapılan değişikliklerin işlevi nasıl etkileyeceğini görmenize yardımcı olur.


Bu arada, yaşadığınız sorunlar tam sayı taşmalarından kaynaklanıyor .

Çalıştığınız sayıları tutacak kadar büyük değişken türleri kullanın. Boyutlar C ++ 'da platforma göre farklılık gösterir, ancak 32 bit Visual Studio derleyicisini unsigned intkullanmak 32 bitken unsigned __int64 (MS'e özgü) 64 bit'dir. Ayrıca a kullanarak düşünün double.

Ek olarak, işlemlerinizi yeniden düzenlemeye çalışın, böylelikle bu kadar büyük sayılarla karşılaşmazsınız (örneğin MDef * MDef / 110, yapmak yerine (int)((float)MDef / 110 * MDef)) .


3
Tamsayı taşmalarıyla karşılaşıyorsanız, sadece 24 bit tamsayı parçasını güvenilir bir şekilde destekleyen float'a dönüşüm farklı bir doğruluk problemi setine sahip olacaktır.

@Joe: Düzenlemeni geri aldım; Özellikle seçtim __int64, uint64_tçünkü stdint.hVisual Studio 2008 ve altındaki sürümlerde mevcut değil ve zavallı çocuğu olduğundan daha fazla şaşırtmak istemedim.
BlueRaja - Danny Pflughoeft

1
@BlueRaja: Askerin Visual Studio'yu kullandığına dair hiçbir kanıt göremiyorum ve diğer tüm standart araç zincirlerinde mevcut (Visual Studio 2010 dahil).

Önemli bir değişkeni de dışarıda bıraktınız, bence: Hasarın yaklaşabileceği ancak tam olarak ulaşamayacağı bir üst sınırın olmasını istiyorsanız, bir sigmoid işlevi kullanabilirsiniz.
Martin Sojka

1
user127817: Gerçekten önemli olan, işlevin nasıl büyüdüğü. Gerisi için dengeli hissedene kadar test edin. Karakterin çok güçlü olduğunu düşünüyorsanız, hasarı azaltın. Belirli bir patronu veya düşmanı öldürmenin çok uzun sürdüğünü düşünüyorsanız, düşmanın sağlığını veya zırhını düşürün. Ve bunun gibi.
BlueRaja - Danny Pflughoeft

31

Karakterlerim istatistikleri aşağıdakilerden oluşur:

Gerçek probleminiz var: Bu istatistiklerin gerçekte ne anlama geldiğini tanımlamadan önce istatistiklerinizi tanımladınız . Arabayı attan önce koyuyorsun.

D & D'nin (masa üstü) nasıl çalıştığına bakın. "Güç" tek başına bir şey ifade etmiyor; bu sadece bir şey ifade ediyor, çünkü "Güçlü bonusunuzu yakın dövüş saldırınıza ekleyin" yazan bir kural var. Bu kural, D & D'nin mücadele kurallarının bir parçasıdır. Mücadele kuralları olmadan, "Güç" genellikle anlamsız bir miktardır.

Kendinize sormanız gereken ilk soru şudur: Karakterler arasında ne kadar farklılaşma istiyorum? Yine D & D'ye bakın. Orada, 6 temel istatistik var. Bu istatistikler karakterler için oyunun farklı boyutlarını tanımlar. Dexterity’i yüksek olan bir karakter, Dexterity’i düşük olan bir karakterden farklı seçeneklere sahip olacaktır.

Fakat bu farkın bile nedeni tümüyle kurallara dayanıyor. Yüksek Dexterity, menzilli saldırılara bonus anlamına gelir; menzilli saldırılarla daha sık vuruş yapabilirsiniz. Dolayısıyla, Strength ile Dexterity arasında, iki farklı oyun boyutuna sahipsiniz: menzilli ve yakın dövüşçü.

İstihbarat ve Bilgelik aynı zamanda bir eşleşme yaratır, ancak bunlar daha belirli sınıflarla etkileşime girer. Int, Sihirbazları ve diğer yaylı hecelemeleri daha iyi (veya bazı kurallar altında mümkün kılar ) yapar, Bilgelik, Rahipler ve diğer ilahi heceler için hayati önem taşır. İlahi ve arcane büyüleri farklı büyü listelerine sahip olduğundan, bu iki istatistik oyunun farklı boyutlarında yer alır.

Büyüme ilerletme işlevlerini ve benzerlerini tanımlayabilmeniz için önce istatistikler etrafındaki temel kuralları tanımlamanız gerekir . Spesifikasyonlara ihtiyacınız yok; "Bir yakın dövüş saldırısının çarpıp çarpmadığını belirlemek için her bir kuvvet noktasının rastgele atışlara eklendiğini" söylemenize gerek yok. İhtiyacınız olan, “el becerisi menzilli saldırganları daha iyi hale getirir” gibi meta-kurallardır. Onları daha sonra nasıl daha iyi hale getirdiğini tam olarak anlayabilirsiniz .

Karakterleri ilerletmenin farklı yolları vardır. Yaygın bir eski okul Final Fantasy numarası, karakter seviyesini hasar hesaplamalarının bir parçası olarak kullanmaktı. Bu, seviyeyi uygun stat ile çarpmak veya karakterin seviyesine bir fonksiyon uygulamak anlamına gelebilir. Diyelim ki ikinci dereceden bir ilerleme, böylece bir karakterin zararının oranı seviye başına artacaktır.

Bununla birlikte, savaş fonksiyonlarınızın çalışmasını istiyorsanız, ilerlemelerini hesaba katmaları gerekir. İşlevlerinizin ilerleme için kancalara ihtiyacı var.

D & D'nin komik bir ilerleme yolu var. Kısmen sınıf tabanlıdır; Her seviye yükseldiğinde, karakter sınıfına bağlı olarak yeni sınıf özellikleri ve vurduğun için düz bir bonus kazanırsın. Ancak, bazı sınıf özellikleri kendi başlarına daha iyi oldu. D & D’deki Büyüler, içlerinde yerleşik olarak ilerleme kaydedecekti. Bir heceleme, ilk önce bir hecelemenin 2 seviyesi için 1d4 hasar verebilir. Diğer her sihirbaz seviyesi, bu büyüyü daha iyi yapar.

D&D, ürün temelli ilerlemeyi de yoğun bir şekilde kullandı. Dördüncü baskıya kadar, maddeye dayalı ilerleme esas olarak dövüş karakterleri içindi, ancak daha eski baskılarda bile, yazımcıların kendilerine stat buff'ları ya da başka ayarlamalar yapan öğeler vardı (ya da düpedüz büyüler yaptılar).

Öyleyse öğeler, savaş işlevlerinin dikkate alması gereken başka bir şeydir. Maddeler donatıldıklarında yalnızca bir veya daha fazla istatistiği tutuyor mu, yoksa başka şeyler de yapıyorlar mı? D & D biraz garipti, bu istatistikler nadiren değişti; silahlar basitçe XdY'ye zarar verdi, muhtemelen istatistiklerinizden birine dayalı bir bonusla. Ve o buydu. Yani savaşta daha fazla hasar vermenin tek yolu daha iyi bir silah bulmaktı. Birçok video oyunu RPG'de, bir silaha ek olarak seviye göz önünde bulundurulur.


6
Gerçek problemin: istatistiklerinin gerçekte ne anlama geldiğini tanımlamadan önce istatistiklerini tanımladın. Sepeti atın önüne koyuyorsun. ”. Kesinlikle katılmıyorum; kendileri sayılar gücünün çalar, vb o bilgilendirmek için sadece bir yoludur olan oyun tasarımının bir parçası. Diğer yoldan ilerlerseniz, sonunda 147hp olan son bir patronla bitirebilirsiniz.
Jonathan Connell

8
Pekala, Sarevok (Baldurs Gate’de) sadece 135 beygir gücüne sahipti ...
Martin Sojka

12
@ 3nixios: Son patronun 147Hp olması ne fark eder? Önemli olan, son patronun zorlu, ilginç ve her şeyden önce yenmek için ödüllendirici olup olmadığıdır . Çok fazla Hp'li bir patron ilginç değil; bu zaman kaybı. Can an be an değiştirmek özel taktikler gerektirir Partine ile karışıklık, işte siz maksimum potansiyeline sahip her yeteneğine gerekir gerektirir bir patron, bu büyük bir nihai patron için kılan şeydir. Her gün ilginç 147Hp patronu Hp'nin sıkıcı bloğuna götüreceğim.
Nicol Bolas

@Nicol Bolas Size tamamen katılıyorum, neden başlangıç ​​noktasının istatistiklerden olması gerektiğine inandığımı desteklemeye çalışıyordum. Bir oyuncunun başladığı istatistikler, oyuncunun oyun sırasında oynadığı ana gösterge ve oyundur. Patronlar için büyük HP çubuklarının gerekli olmadığına katılıyorum, oyuncuya, patrona karşı en iyi kurulumun ne olduğuna, hangi silahların istatistiklerinin daha etkili olduğuna dair daha iyi bir gösterge veriyor. Elbette miktarı, hesaplama şeklinizle alakasızdır, çünkü nihai hesaplamalarınızı sadece sabit bir c ile bölüp çoğaltabilir ve bununla yapabilirsiniz.
Jonathan Connell

2
@ 3nixios: Ama bu benim açımdan bir parçası. D & D'deki Beceri, yakın dövüş uzmanı karakterleri ile değişen uzmanlar arasında bir farklılaşmaya izin vermek için var. Yakın dövüş kavramı ve menzilli saldırılar olmasaydı (ve birçok FF oyununda yoktu), o zaman bu ayrımın olması gerekmeyecekti. 6 yerine 5 istatistikten kurtulabilirsiniz. Bir Hp aralığını tanımlamak bir şeydir, fakat ne kadar temel istatistiklere sahip olduğunuzu tanımlamak . İstatistikler, onları anlamadan önce kurallar gerektirir ve bu statın olmasının iyi bir fikir olduğunu söyleyebilmeniz için önce bir stat yapmayı düşündüğünüzü bilmelisiniz.
Nicol Bolas

22

Formüllerin oldukça karmaşık görünüyor. Profesyonel RPG geliştiricilerinin bunu nasıl ele aldığından emin değilim, ancak basitliğe odaklanmayı tavsiye ederim. Hala kullanmak istediğiniz istatistik aralığını içeren mümkün olan en basit formülü bulmaya çalışın. Örneğin, hesaplama sırasında hasarı değiştirmek yerine, istatistiklerin hasar hesaplanmasından önce birbirlerini değiştirmesini sağlayabilir misiniz? Aklınıza bir formül geldiğinde, oyuncu seviyelerinde nasıl davranacağını görmek için çok çeşitli olası değerler için grafik çizmeyi denerdim. Açıkçası, sahip olduğunuz daha az değişken varsa, bu daha uygun olacaktır.

Ek olarak, BlueRaja neden daha yüksek stat seviyelerinde beklenmedik değerler gördüğünüze dair önemli bir açıklama yaptı. İmzasız türleri kullanmak ve taşmaları kontrol etmek önemli olacaktır.


10
Basit için +1. Herkes titizlikle karmaşık şeyler yapabilir, bu iyi bir oyun yapmaz.
aaaaaaaaaaaa

8
@ Apple 2 veya benzeri bir şeyle çalışmadığınız sürece, burada bir çarpma veya bölünmeyi kaldırmanız ve performansı ölçülebilir bir şekilde etkileyeceğinden şüphelisiniz.
Tetrad

8
@Randolf RPG'de büyük bir savaş saniyede 10 hasar hesaplaması gibi bir şey anlamına gelebilir, modern bir CPU saniyede birkaç milyar işlem yapabilir. Bu tür "görünür" bir matematiğin performans etkisinin önemsiz olduğunu güvenle kabul edebilirsiniz. Bu durumda basit, bilgisayar kullananlar için değil, oyunu tasarlayanlar ve oyunu oynayanlar için.
aaaaaaaaaaaa

6
@Randolf Richardson: Sadece bu durumda hedefi biraz kaçırmış olabileceğinizi düşünüyorum. Bir MMO için iyi ve hızlı bir yağsız protokol her şeyden önemlidir ve fizik gibi ağır işlerin akılda tutulacak şekilde tasarlanması gerekir. Ancak, hasar hesaplaması temel bir oyundur, oyun bölümünden ödün vermeyeceğiniz bir soruya performans kaygıları getirirseniz, oyun düşünülerek tasarlanmalıdır. Önemli olduğunda performans hakkında konuşun, bunun optimize edilmesi gereken önemli bir alan olduğu izlenimini verme riskiniz var, böylece gerçek performans günahkarlarının dikkatini çekti.
aaaaaaaaaaaa

5
@Randolf: Hiçbir şey ima etmiyorum; Ben ediyorum diyerek bir darboğaz olmayan bir şey optimize zaman kaybıdır olduğunu.
Nicol Bolas

11

Geç oyun Düşman HP tipik olarak daha düşük milyonlarda olacaktır (en fazla ~ 12 milyon olan süper bir patronla).

Bununla bir sorunum var. Patronlarını, oyuncularının idare edebileceğini düşündüğü şeyler üzerine kurmalısın. Oyuncularınızı kuruyorsunuz ve patronlarınızın nasıl olmasını istediğinize ilişkin bir formül veriyorsunuz.

Savaş mekaniğinizi ve rollerinizi oluşturduktan sonra, patronlarınızın nasıl başa çıkabileceğini / absorbe edebileceği ile oyuncuların başa çıkabileceği / emebileceği zarar arasında iyi bir denge olması gerektiği için patronlarınızı nasıl tasarlamak istediğinize karar verebilirsiniz.


4
Düşmanın sağlığını + 1 yapmak, oyuncunun tam tersi şekilde değil, bu noktada ne ile başa çıkabileceğini temel almalıdır.
BlueRaja - Danny Pflughoeft

7

Alıntı yaptığınız bu rakamlar büyük olasılıkla sadece bir kaç kez yapılan bir simülasyondan, binlerce çalıştırmadan kaynaklanmaktadır.

Öyleyse , 20. seviyede bir karakter yaratacak bir simülasyon yazmalı ve o noktada savaştığı düşünülen düşman tiplerine karşı 200 savaşa kadar ilerlediğini görmelisin. Bunu 30. seviye için tekrar yapın (muhtemelen dünyanın bir sonraki bölümünde).

Doğru olması biraz zaman alacaktır, ancak otomatik simülasyonlar yazmak kesinlikle bunu tahmin etmekten ve manuel olarak oynatmaktan çok daha kolay hale getirecektir.


5

Bence doğru bir tasarıma sahip olmadan bir formül oluşturmak istediğiniz hatayı yapıyorsunuz.

Önce bir tasarımla başlayın, sonra tasarımı formüllerde temsil etmeyi düşünmeye başlayın. Tasarımınız ne kadar net olursa, basit ve / veya kesin formüller bulmak o kadar kolay olur.

Düşmanların "türlerini" uygulamaya çalışın, örneğin "zırhlı" => fiziksel tipte bir oyuncu saldırısı% 50 oranında azaltılırsa. Özet için bir savaş akışı yapmayın, neyin alakalı olup neyin olmadığını düşünün.

Tasarımınızın "zırhlı düşmanların" sihir karşısında zayıf, fiziksel hasara karşı güçlü olduğunu söylemesi durumunda, bunu kodda belirtin. Fakat çok fazla test yaptığınızı unutmayın, çünkü değerler kodu ilk yazdığınızda sihirli bir şekilde çalışmayacaktır. Bir tasarım yaratmaya çalışın, mantığı koda yerleştirin, her zaman bunun aklınızdaki teknik temsil olup olmadığını ve değerlerin eskiye kadar değişip değişmediğini kontrol edin.


Zaten bu tür bir şeyi
içerdim

5

Tasarımım Elektronik Tablo aşamasını terketmemiş olsa da, RPG için matematiğin tasarlanması konusunda bir sonuca vardım:

Onları mümkün olduğunca basit tutun. Üzerinde çalıştığım tasarımda, yarı sınıfsız sisteme uygun çok basit formüller kullandım. Yani. Ateş topu büyüsü 30'a zarar verdi.

BaseSpellDamage * Attribute (5 * 6)

Bunun gibi değiştiriciler de ekleyebiliriz:

Result = (BaseSpellDamage * Attribute) (5*6)
Result = Result + (Result * 50%) (30 = 30 + (30 * 50%))

Sonuçta sonuç 45 olur. Precentage çarpanlarını kullanmanın çok kolay ve çalışmak için ölçeklenebilir bir çözüm olduğunu buldum. İstediğimiz sonucu bulmak için karmaşık matematik ile bazı tuhaf sayılarla gelmek yerine.

Şimdi hasar direncini hesaplayabiliriz, bu sadece belirlenmiş hasar tipine karşı savunmayı hesaplar. İki yaklaşım var ve dürüst olmak gerekirse, hangisinin daha iyi olacağına karar vermedim, ancak ikisi de basit ve uygulanabilir:

DamageResult = Resistance * Damage ( 50% * 45)

Sonuçta elde edilen sonuç 22 gün olacak (kısmi sonucu kesdim).

Diğer formül:

DamageResult = Damage - Resistnace (45 - 22).

Sonuçta sonuç 23 olacaktır. Direnç alınan hasardan daha büyük olursa, karakter herhangi bir hasar almaz. Elbette, böyle bir durumun ne zaman olacağının durumu dışında bir yerinin olmadığından emin olmak size kalmış.

Her ne kadar itham etmenin ölçeklenmesinin dengelenmesi ve ölçeklendirilmesi biraz daha kolay olduğunu kabul etmeliyim. Ancak bu aynı zamanda temel numaralarınıza da bağlıdır. Yüzde ölçeklendirme, 100 yaşından itibaren başlarsanız en iyi sonucu verir. Küçük sayılarla çalışıyorsanız (dürüst olmak gerekirse 100'ün altında bir şey), kayan nokta sonuçları almaya başlayacağınız için uyanık olabilir, dengelenmesi zor olur ve onlarla ilginç bir şeyler yapabilirsiniz.

Muhtemelen bu durumda en uygun çözüm, uygun gördüklerinde her iki yaklaşımı da kullanmaktır. Veya eğer büyük sayıların hayranıysanız, 1000'den başlar.

Ve kapanış biter. Bu sonuçlara tamamen kendi başıma gelmedim. Aslında çeşitli RPG kılavuzlarını (Hero, DnD) okumak için biraz zaman harcadım. Özellikle DnD yardımcı oldu, benzer prensiplerle çalıştığı için ama formülleri için seviyeleri kullandığı nitelikleri yerine, bazen daha karmaşık olabilirler. Burada sunduklarımdan.

Her durumda, en iyi tavsiye şudur: onları mümkün olduğunca basit tutmaya çalışın. Aynı anda 87234 başka şeyle uğraşmak zorunda kaldığınızda, gelişmiş matematik veya uzun denklemleri kullanmayın, hataya açık, fark etmesi zor olanları kullanmayın.


3

Diğerlerinin de belirttiği gibi, Final Fantasy X formülü oldukça karmaşık. Genellikle bu seri için oyun ne kadar sonra olursa, formül o kadar karmaşık olur. Hasar formülünüzü tamamen başka bir oyuna yerleştirmek muhtemelen daha kolaydır. Ancak genel olarak, dünyada ne tür bir hasar formülü bulabileceğinizi çok genel bir seviyeden ve çevrelerinde nasıl bir oyun oynayabileceğinizi tartışmaya değer olduğunu düşünüyorum. Karar vermeniz gereken ilk şey, oyunun sonunda ne kadar hasar vermeyi istediğiniz ve oyuncunun ne tür istatistikler elde etmesini istiyorsunuz? Buna sahip olduğunuzda, bir formül sistemi seçebilir ve zamanla bu aralıkları yansıtmak için formül ve silah değerlerini en iyi duruma getirebilirsiniz.

Tamamen Stat Tabanlı

Karakterlerinizin hangi düşman seviyelerinde mücadele edebilecekleri konusunda esnek olmasını istiyorsanız bu iyi bir fikirdir. Bunun gibi bir formül sadece oyuncunun istatistiklerine, ekipmanlarına ve düşmanlarının istatistiklerine bağlı olacak. Bu formüller genellikle oldukça basittir. Final Fantasy Legend II (Bkz. Http://www.shenafu.com/ffl2/weapon.php , örneğin, basit formüle dayanarak hasar veren silahlara sahiptir:

(Stat+StatBonus)*WeaponStrength - Defense*4

Beceri ve temel zayıflıklar gibi diğer faktörlere bağlı olarak hasarı değiştirmek için çok basit bir hasar yöntemi veya hızlı bir başlangıç ​​noktası istiyorsanız, bunun gibi bir formül iyidir.

Bu tür bir formülün gerçekten ne kadar genişleyebileceğini göstermek için, bir Android ve IOS oyunu olan Enflasyon RPG'nin hasar formülünü göz önünde bulundurun (Bkz. Http://inflation-rpg.wikia.com/wiki/Calculations ). Formül hem stat hem de teçhizata bağlıdır. Her ekipmanın iki istatistiği vardır - ATK stat'üne bir bonus ve bir çarpan değeri. Bazı ekipman parçalarının düşük çarpanları var, ancak yüksek bonuslar, bazılarının düşük bonusları var ama yüksek çarpanları var. Sadece 10 ATK'lık bir karakter için, 5000 ATK Bonus'lu Battle Axe ancak% 145 düşük çarpanı harika bir seçimdir. Toplam hasar (10+5000)*1.45 = 7264, ancak Estoc, 0 bonus ve% 300 çarpanı ile kötü bir seçimdir - hasar (10+0)*3 = 30. Oyunun ilerleyen saatlerinde 5000 saldırıyla bir karakter silah değiştirmeyi tercih eder.

Stat ve Seviye Tabanlı:

Buna güzel bir örnek Final Fantasy V, VI ve Final Fantasy XII'dir (bkz. Http://www.gamefaqs.com/ps2/459841-final-fantasy-xii/faqs/45900 ). FFXII’deki kılıç formülü:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+STR)/256]

ve çıtalar için verilen hasar formülü:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+MAG)/256]

Çok benzerler ancak kılıç formülünün sadece kuvvet ve seviyeye bağlı olduğunu, personel formülünün ise güç, büyü ve seviyeye bağlı olduğunu fark edin. Bu tür bir formülün avantajı, oyuncuya iki farklı büyüme alanı sağlamasıdır - istatistiklerini oluşturma veya seviyelerini oluşturma. Dezavantajı da karakterleri her iki yönde de cezalandırmasıdır. Bunun gerçekte yapması gereken, oyuncunun hasar çıktısını arttırması için seviye atlamasına izin vermek (FFXII için bu miktarları, statü kazancını hesaba kattığınızda seviye 50 civarında seviye başına ~% 4 arttırır) konfor seviyesi.

Sabit Hasar:

Sabit hasarlı formüller karakterin istatistiklerine veya seviyelerine bağlı değildir, sadece silahın kendi içindeki hasar formülüne dayanırlar. Yine de bir aralıkta değişebilirler, ancak kullanıcı ne olursa olsun (diğer özel efektleri veya karakter özelliklerini engelleyerek) aynı hasarı verir. Silah sabit hasar verecekse ve silahı kullanabilme durumu istatistiklere ve / veya seviyeye bağlıysa en iyi şekilde kullanılır. Örneğin, Diablo 2, die roll'a bağlı silahlara sahip birçok roguelikes gibi bunu yapar. Söyleniyor, 'sabit hasar' yok değil ima "tesadüfi olmayan" - ve aslında yapılması hasara rastgelelik bazı elemanı genellikle var.

Bu, karakterler arasında aktarılması kolay silahlara sahip olmak veya oyundaki belirli noktalardaki karakterlerin hangi ekipmana erişebildiğini biliyorsanız (hasarlı masalar, sandıklar aracılığıyla) yapabilecekleri hasar çıkışını dikkatle kontrol etmek istiyorsanız, iyi bir metodolojidir. ve masaları çalmak).

Buraya gireceğiniz bir başka yer de Final Fantasy'deki belirli ekipman veya eşya türleriyle. Örneğin 1000 İğneler her zaman 1000 hasar verir. Final Fantasy Legend II'de dövüş sanatları aşağıdaki formüle dayanarak hasar verir:

Damage = WeaponStrength*(90-UsesLeft) - 4*Defense

Final Fantasy XII, aynı zamanda aşağıdaki formüle göre hasar veren, silahlara da biraz zarar verdi:

DMG = [ATK x RANDOM(1~1.125)]^2

Hasar biraz rastlantısal olsa da, toplam aralığa göre yalnızca yüzde 26,5 oranında değişebildiğinden, zaman içinde ortalama olarak belirli bir düzeyde hasar almanız garanti edilir. Bu tür saldırılar, normalde hasar veren şeyleri hesaba katan oyunlarda hem düşük istatistiklere hem de düşük seviyelere sahip karakterler için faydalıdır. Ayrıca, hedefin savunmasını da görmezden geliyorlar (formül, istenirse savunmaya uyması için kolayca elden geçirilebilse de).


2

Son fantezi serisindeki tüm oyunlarda karşılaştığınız sorun nedeniyle 255 statü sınır değeri vardı. seviyede 100 istatistik 255 olur.

Yetenek ve ekipmanlarla istatistiklerin arttırılması hakkında konuşuyorsun ve bunu oyunlarda gördüğümü hatırlıyorum. yetenek ve ekipman değiştiricileri denetleyen ve istatistikler kullanıldıktan sonra bunları uygulayan ek bir adım var.

sizin durumunuzda, adım 21: yetenek değiştiricileri uygulayın, adım 22: ekipman değiştiricileri uygulayın, adım23: nihai hasar.

Son fantezi formülleri için google ile ilgileniyorsanız, oradalar. Son fantezi 4, 6, 7 ve 9 için AI da dahil olmak üzere gerçek savaş mekaniğinin kopyalarına sahibim. Yeterince sert görünüyorsanız bulmak zor değil.

Formül oluşturmak için en büyük şey sınamadır. Her iki taraftaki savaş zekâ ai'nizi çalıştırmak için bir senaryo hazırlayın ve birkaç yüz savaş çalıştırın. canavarları ve istatistikleri çeşitlendirir ve işe yarayıp yaramadığını görürsünüz ya da lv 40 her şeyi öldürürse, bir patronun lol öldürmek gerçekten imkansızdır. Bir ipucu, hiç kimsenin izlememesi durumunda AI'ların ne kadar hızlı savaşabileceği etkileyici olduğu için tüm animasyonu kapatmak olacaktır.


2

İnsanların doğru şekilde ölçeklenen düzgün hasar formülleri geliştirdiklerini merak ediyordum.

İlk 2 şey:

  • ne demek istediğinizi 'doğru' olarak karar verin - 'doğru hasar' fikriniz nedir?
  • 'ölçekle' ne demek istediğine karar ver - hangi değerlerin değişeceğine ve bu değişikliklerin hangi etkiye sahip olmasını istiyorsun?

Bunu öğrendiğinizde, BlueRaja belirtilen matematiksel formüller kullanmak için yeterli bilgiye sahip onun cevabını . Unutmayın ki 'uygun' bir hasar formülü diye bir şey yoktur - oyuncularınızın sahip olmasını istediğiniz deneyim türüne göre tasarımınızla eşleşen bir formüldür.


Bu son derece yararsız bir yorum. "Bilmiyorum" anlamına geliyor ve bu yüzden herkesin zamanını boşa harcıyor. Silmek için işaretleme.
Krythic

1

alternatif olarak, çok basit bir formül arıyorsanız, aşağıdakileri yapın:

(Bunun bir formül için benim fikrim olduğunu unutmayın.)

İlk olarak, basit bir saldırı formülü için, sadece birkaç istatistik yeterli olacaktır. Oyuncunun Saldırı statüsü (bu, hareket türüne bağlı olarak Güç veya Büyü olabilir.)

Ardından, MovePower adlı bir değişken oluşturun. Bu, harekete bağlı olacak ve daha iyi hamleler daha iyi bir MovePower'a sahip olacak. Formülüm için, genel "Attack" komutları 5 MovePower'a sahip.

Ardından, savunmayı yüzde temelli bir stat yapın (ve elbette, hasara karşı% 100 savunma yapmayı imkansız hale getirin)

Ardından, saldırı aşamasında, saldırı statünü hareket gücüyle çarpın ve düşmanın savunmasına dayalı hasarı kaldırın! basit!

Ayrıca, hareketin başka bir etkisi de varsa (Biyo, zehir veren), ve vurmak için seçmeyi seçtiyseniz (Doğruluk), yükseltme / düşürme hasarına sahipse, hareketin vuracağına (Doğruluk) İstatistikleri değiştiren hamle, vb. Bununla eğlenin!


Zırhı yüzdelik bir sorun olarak önleyen bir başka seçenek (böylece değerlerinin aynı görünmesine izin vermek) zırha karşı zarara karşı çarpan haline gelen bir karşılaştırma olarak hesaplamaktır. Baz olarak Ln (atk / def) gibi bir şey. Bu, aynı şekilde zaman geçtikçe savunma zırh istatistiklerinin ölçeklenmesini sağlar. Hasar ve zırh istatistiklerinin aynı olduğu ve oradan ekstrapolate olduğu zamanlar için istenen temel hasar aralığınızı nasıl elde edebileceğinizi öğrenin. Bu, "zırhtan kaçınma" saldırılarını yaratmak için bir numara gerektirir, ama bu yaratıcılığın ne için olduğunun bir parçası.
Aviose

1

Temelde iki şeyi çözmeniz gerekiyor.

  1. Büyük sayılarla hesaplama nasıl önceden hazırlanır?
  2. Nasıl bir saldırı hasarı istediğinizi ve beklediğinizi zayıf ve güçlü rakiplere karşı nasıl davranacağınızı.

1

Kullanıcı doubleveya büyük sayı kitaplığı olabilir. Büyük sayılarla hesaplamalar yapmak (tıklama / boşta oyunlarda olduğu gibi genellikle bu büyük sayıdaki kitaplıklara dayanır). Sizin durumunuzda, sayılar nispeten küçük olduğundan, 64 bitlik kayan nokta kullanılması gereken esnekliği sağlayacaktır.

2

Oyunun nasıl davranmasını istersin? bazı örnekler:

  • Bir yaklaşım, ATKsilaha bağlı olup olmadığına karar vermek için kullanmak ve silaha bağlı olarak bilinen hasar derecesine sahip bir kalıbı yuvarlamaktır: örneğin, uzun kılıç 1d8, iki elle kullanılan kılıç 1d10, hançer 1d4. Hp büyüyüp büyüyebilirse bu şaşırtıcı derecede iyi ölçeklenmeyecektir. Eğer kullanırsanız ATKkarakterler vurmak ya da özledim olmadığını belirlemek için, size başarılı bir hit sonra başka atışı yapabilir ATK* crits belirlemek için% 80.
  • Bir hasar formülü kullanmak istiyorsanız, hasar formülü (ATK - DEF) +/- 20%Dünya Sonu'ndaki kadar basit olabilir (bir RPG strateji oyunu). Bu, güçlü bir rakibe yapılan saldırıların DEFhiçbir zarar vermeyeceği anlamına gelecektir . İnstace için ATK = 10, ENEMY DEF = 12, (ATK - DEF) = -2ve aynı zamanda biraz daha düşük def vs yüksek saldırı, uzun HP artan savaşları yaparak potansiyel, az hasar yapabileceği anlamına gelir. İle Örneğin ATK = 1010, ENEMY DEF = 1005hasar durumunda hasar da artık önemli ölçüde artacak 5. olurdu ATKküçük bir yüzdesi artar. Örneğin ATK = 1055, ATKdeğerinde yalnızca% 5'lik bir artışla% 900 daha fazla hasar verir .
  • Bundan kaçınmak için, Şunun gibi bir şey yapabilirsiniz: ATK / DEF * WEAPON_DAMAGEBu arttığında ATKveya DEFarttırıldığında daha yavaş ölçeklenir ve zayıf bir saldırganın güçlü bir yaratığa zarar vermesine izin verir DEF.

tl; dr Sayılarınızı sorumlu bir şekilde ele almanız ve oyunun farklı durumlarda nasıl davranmasını istediğinizi çözmeniz gerekir. Kendinize sormanız gereken bazı sorular:

  1. Bu patronu / köleliği yenmek için kaç saldırı (dönüş) gerekir?
  2. Farklı beceriler, meraklılar, tartışmalar xsavaşı nasıl etkilemeli ? Umutsuz olmalı, kazanma daha y%az / daha muhtemel mi olmalı ?
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.