Kodlarla Ortalama Zarar ve Beceri Hasarı Hesaplamaları (C++)

Exatluen

Level 1
Katılım
29 Eyl 2024
Konular
78
Mesajlar
242
Beğeniler
273
GG Coin
6,426
Ticaret Değeri - 0%
0   0   0
Metin2'de "Beceri Hasarı" ve "Ortalama Zarar" efsunlarının nasıl çalıştığını hiç merak ettiniz mi?
Aslında bu iki efsunun birbiriyle bağlantılı şekilde hesaplandığını söylemek mümkün. game source/game/item_addon.cpp dosyasının içinde yer alan aşağıdaki formül, bu işleyişin temelini oluşturuyor:


C++:
int iSkillBonus = MINMAX(-30, (int) (gauss_random(0, 5) + 0.5f), 30);int iNormalHitBonus = 0;if (abs(iSkillBonus) <= 20)iNormalHitBonus = -2 * iSkillBonus + abs(number(-8, 8) + number(-8, 8)) + number(1, 4);elseiNormalHitBonus = -2 * iSkillBonus + number(1, 5);


Bu kod bloğunda:
  • iSkillBonus → "Becerili Vuruş" değerini,
  • iNormalHitBonus → "Ortalama Zarar" değerini temsil ediyor.

Formülün işleyişi şu şekilde özetlenebilir:Öncelikle rastgele bir iSkillBonus değeri üretilir, ardından bu değere bağlı olarak iNormalHitBonus değeri hesaplanır.


Şimdi bu üretim sürecine biraz daha yakından bakalım:


C++:
iSkillBonus = MINMAX(-30, (int)(gauss_random(0, 5) + 0.5f), 30);


Burada kullanılan MINMAX(-30, x, 30) fonksiyonu, değerin -30 ile +30 arasında kalmasını sağlar.
Asıl dikkat çeken ise gauss_random(0, 5) ifadesidir.


Bu fonksiyon, 0 ortalamalı ve 5 standart sapmalı Gauss dağılımına sahip rastgele bir değer üretir.
Ne anlama geliyor?
  • Ortalamanın 0 olması, üretilen değerlerin ağırlıklı olarak 0 civarında olduğunu gösterir.
  • Standart sapma arttıkça, yüksek mutlak değerli sonuçların gelme ihtimali de artar.

Aşağıdaki görseller, bu dağılımı daha net görmenizi sağlar:

ortalama 0, standart sapma 5ortalama 0, standart sapma 10
1744645519566.png
1744645534478.png


İlk örnekte (0,5):
  • iSkillBonus'un 0-5 arasında gelme ihtimali %34,13
  • 5-10 arası gelme ihtimali ise %13,59

İkinci örnekte (0,10):
  • 0-10 arası %34,13
  • 10-20 arası %13,59

Sonuç?
Standart sapma arttıkça, yüksek beceri bonusu (iSkillBonus) gelme ihtimali de yükselir.
Yani daha yüksek "becerili vuruş" değerleri görmek isterseniz, gauss_random(0, 5) fonksiyonundaki 5 değerini arttırmanız yeterli olacaktır.

Kendi testinizi yapmak ister misiniz?
Aşağıdaki küçük C++ programı ile bunu kolayca gözlemleyebilirsiniz:

C++:
#include <iostream>#include <random>#include <algorithm>#include <cmath>


double gauss_random(double mean, double stddev) {static std::random_device rd;static std::mt19937 gen(rd());std::normal_distribution<> d(mean, stddev);return d(gen);}


int number(int min, int max) {static std::random_device rd;static std::mt19937 gen(rd());std::uniform_int_distribution<> dis(min, max);return dis(gen);}


int MINMAX(int min, int value, int max) {return std::min(std::max(value, min), max);}


int main() {int iSkillBonus, iNormalHitBonus;


[code=cpp]

do {
    iSkillBonus = MINMAX(-30, (int)(gauss_random(0, 5) + 0.5f), 30);

    if (abs(iSkillBonus) <= 20)
    {
        iNormalHitBonus = -2 * iSkillBonus + abs(number(-8, 8) + number(-8, 8)) + number(1, 4);
    } else
    {
        iNormalHitBonus = -2 * iSkillBonus + number(1, 5);
    }

    std::cout << "iSkillBonus: " << iSkillBonus << ", iNormalHitBonus: " << iNormalHitBonus << std::endl;

} while (iSkillBonus >= -10);

std::cout << "-10'dan küçük bir iSkillBonus değeri üretildi: " << iSkillBonus << std::endl;

return 0;


}
 
Geri
Üst Alt