Kapaklı Basit Azalan Dönüş


19

Sorun

Oyuncu seviye başına 80'e kadar maksimum 400 ile 5 puan alır. Dağıtılacak 5 istatistik vardır ve bir statüye ne kadar ekleyebileceğiniz konusunda maksimum sınır yoktur.

  • kuvvet
  • Dayanıklılık
  • Zeka
  • Çeviklik
  • Şans - Kritik şans ve kritik hasar verir

Diyelim ki Luck üzerinde azalan bir dönüş denklemi uygulamak istiyorum. Kritik şans için, oyuncunun% 100 kritik şansa çarpmasını istemiyorum.

Giderek azalan büyüme eklenen puan başına 0'a ulaştığında ulaşacağı bir tavan olacaktır.

Örneğin, oyuncunun sahip olmasını istediğim maksimum kritik şans% 40 ise, şanstaki her puan kritik şans% 40'a ulaşıncaya kadar kritik şansı daha az ve daha az artıracaktır. Bu sayede 1 şans çok küçük bir miktar verecektir.

Herhangi bir çözüm var mı? Teşekkür ederim ve yardımınız büyük beğeni topluyor!


Olası yinelenen RPG Hasar Formüller nasıl geliştirilir? - tl; dr Aradığınız anahtar kelime sigmoid eğrisidir
BlueRaja - Danny Pflughoeft

@BlueRaja Bence bu bir kopya değil. Bu soru genellikle azalan getiri işlevleri ile ilgilidir - biri hasar hesaplamasıyla ilgilidir. Olduğu gibi, bunun cevapları çoğunlukla azalan geri dönüş işlevlerini tartıştı, ancak soruların hala açıkça farklı olduğunu düşünüyorum.
Anko

Yanıtlar:


30

Asimptotik bir işlevle başlamak istiyorsunuz. Yani, bir sayıdan başlar ave başka bir sayıya yaklaşır b, ama asla ona ulaşmaz. Muhtemelen en kolay olacak a = 0ve b = 1. Bu denklemi alır, karakterin sahip olduğu stat noktalarının sayısını (Şans puanları) girer ve çıktı olarak gerçek stat değerini (Kritik Şans) alırsınız.

Çok basit bir örnek , bazı pozitif sabitlerin y = x / (x + n)nerede nolduğudur. Burada x, istatistik noktalarının sayısını girdiğiniz girdiniz ve yçıktınız, son istatistik değerini aldığınız yer.

İçin n = 5neye benzediğini göz atın:

[0,100] 'de x için y = x / (x + 5)

Eğer beslemek x = 0zaman olsun y = 0, ama ne kadar büyük bir xkoymak ne olursa olsun , yasla oldukça ulaşır 1. Mükemmel.

Şimdi, bunu kalplerinizin arzusuna göre ayarlayabilirsiniz. 'Başlığı' istediğiniz gibi ayarlamak için bir ölçek faktörü ile çarpabilirsiniz. y = a * x / (x + 5). Başlığın% 40 olmasını istiyorsanız, .4 ile çarpın. y = .4 * x / (x + n). İçinde beslemek Şimdi ne zaman xs', yartacak ama oldukça .4 ulaşmak asla.

nDenklemin ne kadar hızlı veya yavaş yükseleceğini ayarlamak için ayarlayın. n = 100şundan çok daha yavaş artacak n = 5:

[0,400] 'de x için y = x / (x + 100) çizim

nBelirli bir sayı stat noktasında ulaşmak istediğiniz stat değerine sahip olmak istediğinizi biliyorsanız, bu denklemi çözebilirsiniz . Karakterin 100 Şans noktasında% 35 Krit Şansına sahip olması gerektiğini varsayalım. Çözme .35 = .4 * 100 / (100 + n)için nverim n = 14.29.

Bu sayıların da ham sabitler olması gerekmez. Belki diğer istatistikler değerlerini hesaplamaya girer n. Belki bazı karakterlerin farklı karakterleri vardır, nbu yüzden 'tercih edilen' statülerinde daha iyi ölçeklenirler.

Farklı şekilli veya daha karmaşık bir eğri istiyorsanız, kullanabileceğiniz asimptotik işlevlerin başka örnekleri de vardır. Bunu dilediğiniz gibi keşfetmeniz için bırakacağım.


3
En sevdiğim eğri üstel olan. Her seviye ile kalan havuzun sabit bir oranını almanız yeterlidir.
John Dvorak

@JanDvorak tamlık için bir örnek verebilir misiniz? Çok sayıda üstel eğri vardır ve bir okuyucu sadece önceki yorumdan önerinizi nasıl uygulayacağını bilemeyebilir.
Adam

Bu iyi bir başlangıç ​​noktasıdır ve matematik iyi açıklanmıştır, ancak sadece iyi görünen bir işlev seçemeyeceğinizi unutmayın; bu sorun, dikkatli bir değerlendirme ve çok fazla ayarlama gerektirir. Örneğin, bu yöntemin dezavantajlarından biri, uzmanlaşma cesaretini kırmasıdır. Beş istatistiğin tümü eşit derecede geçerliyse, en az gelişmiş olana harcanan puanlar en değerli (ve en az gelişmiş olanı) olacaktır. İdeal yapı, puanların eşit bir dağılımı olacaktır, bu da oyuncunun onları nasıl daha az harcayacağına dair seçimi yapar.
Marcks Thomas

@MarcksThomas Bu, özellikler arasında sinerji veya bir özelliği taktiksel olarak izole etme ve onunla "kazanma" yeteneği olmadığını varsayar. Örnek olarak, çevikliklerini düşmanlara ulaşmadan ölecek noktaya yükselten inanılmaz bir okçu hayal edin: çeviklik azalan etkinliği olsa bile, seçilen taktik diğer nitelikleri önemsiz hale getirir. Gücü içeren bir başka taktik de eşit derecede etkili olabilir, bu nedenle nitelikler "eşit değerdedir", ancak taktikler genellikle uzmanlaşmanın baskın olduğu anlamına gelir. Özellik sisteminiz de uzmanlığı ödüllendirirse, oyun farklılaşır.
Yakk

Ben buna "bir torbadan taş çekme" sistemi diyorum. Değer P = x/(x+n), n siyah taşlı ve x beyaz taşlı bir torba verildiğinde, kör torbadan beyaz bir taş çizme olasılığınızdır. Yapabileceğiniz bir yaklaşım, kümeleri X = şansınızı ve N = şanslarını ayarlamaktır. Düşmanınızla aynı şansa sahipseniz, eleştirme şansınız% 50'dir. Temel şansın% 10 olmasını istiyorsanız, biz X = şansınız, N = 9x şanslarını.
Yakk

10

İyi bir temel arctan, başlangıç ​​noktasından geçtiği ve yatay bir asimptot sergilediği için benzer bir işlev olacaktır .

arctan

İstediğiniz sınır için 40 / (pi/2)veya tarafından ölçeklendirin 80/pi. Sonra luckistediğiniz eğri dikliğini elde etmek için dönüştürün .

critical = 80/pi * arctan(f(luck))

8

Souls oyunlarının bu sorunu çözme şeklini gerçekten çok seviyorum. Her bir statünün önerildiği gibi sürekli bir fonksiyona dayalı bonuslar vermek yerine, parçalı bir lineer fonksiyonda bonuslar verir.

Kafamın üstündeki kesin sayıları hatırlayamıyorum, ancak fonksiyonlar aşağıdaki satırlar boyunca (her statın kendi sabitleri var)

{0 <= x <20: y = 4x, 20 <= x <30: y = 3x + 20, 30 <= x <40: y = 2x + 50, 40 <= x <60: y = 1x + 90 , 60 <= x: y = 0,5x + 120}

Arsa

Bu yöntem tasarımcıya ve oyuncuya birçok avantaj sağlar. Tasarımcı, bir beceri için nokta başına kesin avantajı oldukça önemsiz bir şekilde ayarlayabildiğiniz için ve oyuncu, seviyeden seviyeye ne kadar fayda göreceklerini tam olarak bildiklerinden yararlanır.

Sürekli bir fonksiyon söz konusu olduğunda, bazı seviyeler ölçüm örtüşmesi nedeniyle sayılara yansıtılmayan bir fayda sağlayabilir. Son seviyenin size bonus XYZ'de 0.9 artış sağladığından emin olun, ancak gerçek değer 23.52'den 24.42'ye gittiğinden ve göstermeden önce sayıyı yuvarladığınızdan, oyuncu bir şeyin değiştiğini fark etmez.

Bir UX perspektifinden bakıldığında, kesinlikle parçalı doğrusal bir fonksiyonla devam etmenizi öneririm. Bununla birlikte, oyuncular sürekli sabitlere bağlı olmayacağından, sürekli bir fonksiyon kullanmak çizginin ilerleyen kısımlarında daha kolay ayarlanabilir.


1
Fazla matematik gerektirmeyen ve değiştirilmesi kolay bir eğrinin yaklaşımı. Bunu sevdim. :)
Casey Kuball

> Eğer önce o görüntülemeye sayıya yuvarlamak telafi etmenin => tek yönlü olan artış miktarı eklemeden önce ve sadece istatistik seviyelerde tamsayı izin verir. veya daha sonra yumuşak kapağı üzerinden gidiyor yanlışlıkla önlemek için. ceilfloorx <= 0: x = 1
Bob

1
Yine de parçalı bir işlev yapabilmenize rağmen, burada aradığınız etkiye sahip değildir. Şans değeri en fazla 400 derece olan bir yüzdedir. Bu, her derecelendirme noktasının , % 100 şanslı doğrusal bir işlevde bile,% 1'in altında bir değer kazancı ile sonuçlanması gerektiği anlamına gelir . Hile sadece y (399) 'un y (400)' den farklı olması için yeterince ondalık nokta gösteriyor. Fonksiyonunuz y'yi çok büyüterek aynı şeyi yapar, böylece artışlar her zaman bütünleşik olabilir. X = 40'ta, y, x değerinin 4 katından fazladır.
MichaelS

@MichaelS Dark Souls'ta kullanılan fonksiyon türüne sadece bir örnek veriyordum. Uygulandığı duruma bağlı olarak farklı dengelenmesi gerekir, ancak benim açımdan, oyuncuların bir parçalı lineer fonksiyonun etkisini bir arktanjant eğri veya konik bölümden çok daha kolay anlayabilecekleri anlamına geliyor.
Kaslai

3

Jan Dvorak bir yorumda üstel fonksiyona dikkat çekiyor. Burada açıklayacağım.

Üstel (ve trig) işlemlerin, temel matematikten çok daha kötü olan karekök işlemlerinden bile çok daha hesaplamalı olarak pahalı olduğunu unutmayın, bu nedenle saniyede birçok kez bu hesaplamaları yapacaksanız, Adam'ın yaklaşımından daha iyi durumda olursunuz. . Oyuncu seviyeleri, ekipmanı vb. Değiştirdiğinde değerleri hesaplarsanız, hız önemli değildir, bu nedenle size en iyi eğriyi veren şeyi kullanın.

Bir üstel fonksiyon bir baz, B bir güç için, x , y=B^x. Matematikçiler genellikle bir e tabanı kullanırlar (~ = 2.718), ancak isterseniz 2 veya 10'u kullanamazsınız.

y=e^x buna benzer: Ye'nin = ^ x

Biz yaparak x eksenini çevirebilirsiniz Yani sol taraf 0'a asympotically taşınıyor dikkat y=e^(-x) , ama yine 1'den 0'a inen oluyor ve biz yükselmek için istiyorum. Böylece y=- ile y ekseni boyunca çevirebiliriz e^(-x). Şimdi -1'den 0'a yükseliyor. 1 elde etmek için y=1 ekleyebiliriz ve 0'dan 1'e- e^(-x) yükselir.

y = 1-i ^ (- x)

Buradan, sadece dikey ve yatay olarak ölçeklendirme meselesi. Her şeyi bir değerle çarpabiliriz, buna asimptotik limiti ayarlayan A diyelim . Ardından , sınırda ne kadar hızlı kapanacağını ayarlamak için x'i bir değişim oranı değeri ( k) ile çarpabiliriz .

Bu bize son denklemini verir y=A*(1 - e^(-k*x)). Değerlerini kullanarak k=0.012ve A=0.5biz% 50 sınırını ayarlamak ve oldukça yakın olduğu sınır civarını olsun sağlayabilirsiniz x=400.

y = 0.5 * (1-e ^ (- 0.012 * k))

Şimdi, bunun için birkaç değişiklik yapabilirsiniz. Yaptığım bir değişiklik değişiyordu A=0.5041, bu yüzden 2 ondalıklı bir yüzdeye (% 32,23 gibi) yuvarlarsak, y (399) =% 49,99 ve y (400) =% 50,00. Y (347) 'den itibaren,% 0,01'lik bir değişim elde etmek için iki puan alan birkaç yer vardır. Ancak bu mümkün olan son nokta hala (neredeyse) elle tutulur bir fayda sağlar ve bunu% 50'ye bile getirir.

Alternatif olarak, kbenzer bir etkiye sahip olmak için değeri değiştirebiliriz. Değerinde k=0.02305, değer% 49,99 y=399ve% 50,00 olarak yuvarlanır y=400. Bununla birlikte, bu grafiktir sorunu vardır çok sonunda sığ - bu (bir yüzde son yüzüncü elde edilmesi için 48 puan alan y(352)=49.99%için y(399)=49.99%için y(400)=50.00%) ve en son% 1 Crit şansı (bir kuyruklu 230 puan alır y(170)=49.01%için y(400)=50.00%) bu da getirilerde biraz fazla azalıyor.

İsterseniz, hem A hem de k'yi ayarlayabilirsiniz, böylece lineer ve üstel bozunma arasında bir şey vermek için daha düşük bir hızda biraz daha yüksek bir sınıra düşer. Yaparsanız y=0.6*(1-e^(-0.00447*x)), bununla sonuçlanırsınız: y = 0.6 * (1-e ^ (- 0,00447 * x))

Eğrinin% 50'yi aştığına dikkat edin, ancak 400 derecelik sert bir sınır olduğundan, oyuncu bu noktayı geçemez (ve bunu geçmeyi başarırsa, hala% 60 kritik bir sınır vardır). Bu denklemle, 1 ondalık basamak kullanabilir ve yine de her 2-3 puanda bir kazanç elde y(399)=49.9%edebilirsiniz y(400)=50.0%.

Matematiksel olarak, önceki denklemler aslında% 50'ye yaklaştıklarından daha iyi görünebilir, ancak kişisel olarak her çift noktanın% 0.1'lik kazanımlarının% 0.01'lik kazançlardan daha iyi olduğunu düşünüyorum. Hatta ile A=0.05041ve k=0.012bu gitmek için 102 puan alır y(298)=49.00%için y(400)=50.00%. Puanınızın% 25'i, eleştirinizin% 2'sine harcamak muhtemelen çok azalmıştır. % 60 denklemi son yüzde için sadece 20 puan alır (bu ilk yüzde için hala 4 puanın 5 katıdır).

Bu son birkaç denklemle, denklemleri bir e-tabloya ekledim ve iyi görünene kadar değerleri manuel olarak ayarladım. Farklı bir şapka istersen benzer bir şey yapmalısın.


2
Matematik işlemlerinin göreceli hızıyla ilgili not doğrudur, ancak muhtemelen oyuncu istatistikleri için ilgisizdir. Modern oyunlardaki darboğazlar genellikle kare başına binlerce öğeyi işleyen şeylerdir (örn. Fizik ve renderleme). Her kare için birkaç düzine kez çalıştırılan oyun komut dosyalarının buna göre bir bip olması pek olası değildir ve genellikle istediğiniz herhangi bir matematik yapmak için CPU'ya bolca başparmak döndürme süresi bırakacak olan önbellek özlemleriyle doludur. tl; dr: Büyük gruplar çalıştırması gereken gölgelendiriciler veya başka şeyler
yazmadıkça

-1

Çok basit bir çözüm için, karekök x 2

400'ün karekökü (mümkün olan maksimum) 20, 20 * 2 = 40'tır.


Neden aşağı oy? Sorulan soruyu çözer ve istenen basittir.
Catwood

1
Ben downvoter değilim, ama muhtemelen cevabınız aşırı spesifik olduğundan ve henüz sağlanmamış herhangi bir bilgi vermiyordu (bir kare kök sadece gücünün üssüdür 1/2) ve bunun yararlı olabilmesinin nedenleri.
Kaslai

Ben aşağı itmedim, ama bunun iyi bir cevap olduğunu düşünmüyorum çünkü çok esnek değil - kare kök asimptotik değil, bu yüzden maksimum seviye değişirse, maksimum tutmak için formülü değiştirmeniz gerekir. aynı stat.
BlueRaja - Danny Pflughoeft
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.