26 Feb 2018
wn8 klanov

Na stránkach www.fpcstat.cz používam hodnotenie klanov podľa WN8. Možno by niekoho zaujímalo ako sa také hodnotenie vypočítava a aký je postup. Zjednodušený postup je vypočítať to presne tak ako sa počíta hodnotenie WN8 pre jedného hráča. Ale viem ako dlho som ja osobne pátral, ako sa také hodnotenie vypočíta, tak som sa rozohodol napísať zopár poznámok ako sa to robí. Väčšina stránok sa venovala výpočtu WN8 pre jednotlivý tank, ale nájsť postup pre výpočet hráča bolo dosť "zapeklité".

Nebudem Vás napínať a rovno poviem, že rozdiel je hneď v kroku 1. 


Takto sa to počíta  WN8 pre tank:

rDAMAGE = avgDmg     / expDmg
rSPOT   = avgSpot    / expSpot
rFRAG   = avgFrag    / expFrag
rDEF    = avgDef     / expDef
rWIN    = avgWinRate / expWinRate


A takto sa počíta WN8 pre hráča:

expDAMAGE  = tank.battles * expDmg
expSPOT        = tank.battles * expSpot
expFRAG        = tank.battles * expFrag
expDEF           = tank.battles * expDef
expWIN            = tank.battles * expWinRate

rDMG  = player.dmg * expDAMAGE
rSPOT = player.spot * expSPOT
rFRAG = player.frag * expFRAG
rDEF    = player.def * expDEF
rWIN   = player.win * expWIN


Ešte pre istotu slovne vysvetlím ten posledný vzorec. Keď počítate WN8 pre hráča, pre získanie údajov o jeho tankoch použijete druhé API. A potom začnete iterovať (prechádzať) všetky hráčové tanky, ku ktorým máte ich počet bitiek. Takže zakaždým máte dvojicu tank_id a battles. Podľa tank_id nájdete v ETV tabuľke príslušné "exp hodnoty" a tie vynásobíte počtom bitiek hráčovho tanku. Všetky hodnoty si ukladáte do expDMG, expSPOT a tak ďalej. Týmito "exp" hodnotami následne vydelíme hráčové staty (z ) a získame "r" hodnoty. Potom už pokračujete krokom 2.

Implementacia v C++
Takto mam implementovaný "krok 1" v C++

 

Keď počítate WN8 pre jednotlivé tanky, musíte zo serveru Wargamingu stiahnuť oveľa viac údajov, ako v prípade výpočtu WN8 pre hráča. Pre výpočet WN8 tanku totiž potrebujete aj hodnoty koľko ste s ním rozdali damage, koľko ste naspotovali, koľko ste zabili nepriateľov (frags), koľko máte s tankom bodov za obranu základne (DEF) aký máte winrate (ten sa počíta ako počet víťazstiev / bitiek * 100) a počet bitiek. A keď počítate WN8 pre hráča, stačí Vám len počet bitiek s tým daným tankom. Dokonca údaje o hráčových tankoch získavate z dvoch rôznych API.

Prvé API Vám poskytne rozšírené hodnoty ktoré potrebujete pre výpočet WN8 pre tank, ale jedným dotazom získate iba údaje pre jedného hráča,  takže je to dosť náročné keď chcete spracovať čo i len jediný klan. Vtedy musíte poslať 100 dotaz aby ste získali údaje pre 100 hráčov klanu (ak je klan plný).

Cez to druhé API síce na jeden dotaz získate údaje pre všetkých hráčov klanu, ale údaje obsahujú len tank_id a počet bitiek s daným tankom. A toto druhé API sa hodí pre výpočet WN8 pre klan, lebo k jeho výpočtu potrebujete iba tank_id a počet jeho bitiek.

Teraz vieme počítať WN8 pre hráča, a idem počítať hodnotenie pre klan. Keď som sa dostal až do tejto fázy, tak som sa nevedel rozhodnúť ako budem pristupovať k údajom z ktorých to budem počítať. Sú dve možnosti.

  1. Spočítate celkový počet bitiek všetkých členov klanu, potom spočítate damage ktorý rozdali všetci členovia klanu a tak ďalej až kým nemáte všetkých päť zložiek, ktoré sú potrebné pre výpočet hodnoty WN8 (damage, winrate, frag, spot, def). Zjednodušene povedané, pristupujete ku klanu, ako keby to bol jeden človek.
  2. Tento druhý spôsob som nepoužil, aj keď som na ním dlho rozmýšľal, či nie je lepší. Urobíte si priemery týchto päť zložiek a získate priemerné WN8 klanu.

 

Článok ešte nie je komplet hotový

www.tavaricka.sk