MaxWatson 0 Posted March 25, 2023 Всем привет! На форме есть тема в которой рассказывается о формуле WN8 Там используются вот такие переменные: expDmg - ожидаемый нанесенный урон, expSpot - ожидаемое количество обнаруженных, expFrag - ожидаемое количество уничтоженных, expDef - ожидаемое количество очков защиты, expWinRate - ожидаемое количество побед. И дана ссылка на таблицу ожидаемых значений. Все огонь. Если я правильно понимаю, то эта таблица работает для каждого танка. Вот пример из этой таблицы: {"IDNum":49,"expDef":0.905,"expFrag":0.887,"expSpot":1.573,"expDamage":1121.611,"expWinRate":51.585},{"IDNum":81,"expDef":1.303,"expFrag":1.662,"expSpot":0.927,"expDamage":222.675,"expWinRate":57.593}, .. Мой вопрос: Как посчитать ожидаемые значения для аккаунта в целом? Чтобы посчитать общий WN8 для аккаунта. Quote Share this post Link to post Short link Share on other sites
yepev 287 #533567 Posted March 25, 2023 @MaxWatson ожидаемых значений для аккаунта не существует, на то они и ожидаемые)) Нужно по формуле WN8 подставить статистику аккаунта и актуальные ожидаемые значения, так и получится WN8 аккаунта. Quote Share this post Link to post Short link Share on other sites
MaxWatson 0 #533568 Posted March 25, 2023 Только что, yepev сказал: @MaxWatson ожидаемых значений для аккаунта не существует, на то они и ожидаемые)) Нужно по формуле WN8 подставить статистику аккаунта и актуальные ожидаемые значения, так и получится WN8 аккаунта. Подставить статистику аккаунта - Это понятно как сделать и где их поулчить Актуальные ожидаемые значения - Вот это как сделать? И как получить? Quote Share this post Link to post Short link Share on other sites
yepev 287 #533570 Posted March 25, 2023 (edited) 1 минуту назад, MaxWatson сказал: Актуальные ожидаемые значения - Вот это как сделать? И как получить? Так вот же они: https://modxvm.com/ru/таблица-ожидаемых-значений-wn8/ Edited March 25, 2023 by yepev Quote Share this post Link to post Short link Share on other sites
MaxWatson 0 #533571 Posted March 25, 2023 (edited) 6 минут назад, yepev сказал: Так вот же они: https://modxvm.com/ru/таблица-ожидаемых-значений-wn8/ Окей, но это большая таблица с танками. Как мне подставить их в формулу для подсчета wn8 для всего аккаунта? Или мне нужно сперва посчитать WN8 ко всем танкам на аккаунте, потом это сложить и разделить на количество боев? $sumWM8 = 22 000; $batles = 15 000; $accountWN8 = $sumWM8 / $batles Вот так это получается? Edited March 25, 2023 by MaxWatson Quote Share this post Link to post Short link Share on other sites
yepev 287 #533578 Posted March 25, 2023 3 часа назад, MaxWatson сказал: Как мне подставить их в формулу для подсчета wn8 для всего аккаунта? В этой теме всё расписано по шагам: 3 часа назад, MaxWatson сказал: На форме есть тема в которой рассказывается о формуле WN8 Quote Share this post Link to post Short link Share on other sites
MaxWatson 0 #533580 Posted March 26, 2023 14 часов назад, yepev сказал: В этой теме всё расписано по шагам: Да это я знаю, можно было и не повторять. Все-таки WN8 для аккаунта в целом - это среднее значение. Которое является суммой всех wn8 по танкам, деленных на количество танков. Quote Share this post Link to post Short link Share on other sites
yepev 287 #533585 Posted March 26, 2023 /** * Calculate account WN8. * * @return int * * @throws Exception */ public function calculate(): int { // If WN8 was not calculated yet if (is_null($this->wn8)) { // Get account_id $account_id = $this->account_id; // Get summary values $summary = $this->api->get('wot/account/info', [ 'fields' => 'statistics.all.battles,statistics.all.frags,statistics.all.damage_dealt,statistics.all.dropped_capture_points,statistics.all.spotted,statistics.all.wins', 'account_id' => $account_id ])->$account_id->statistics->all; // Get tanks values $tanks = $this->api->get('wot/account/tanks', ['fields' => 'tank_id,statistics.battles', 'account_id' => $account_id])->$account_id; // If this account has no tanks data skip calculation and return 0 if (empty($tanks)) { $this->wn8 = 0; return $this->wn8; } // WN8 expected calculation $expectedTankValues = $this->getExpectedTankValues(); $expDAMAGE = $expFRAGS = $expSPOT = $expDEF = $expWIN = 0; // Tanks missing in expected tank values but existing in account $missing = array(); // Calculated account expected values foreach ($tanks AS $tank) { // Tank exists in expected tank values if (array_key_exists($tank->tank_id, $expectedTankValues)) { // Expected values for current tank $expected = $expectedTankValues[$tank->tank_id]; // Battles on current tank $tank_battles = $tank->statistics->battles; // Calculate expected values for current tank $expDAMAGE += $expected->expDamage * $tank_battles; $expSPOT += $expected->expSpot * $tank_battles; $expFRAGS += $expected->expFrag * $tank_battles; $expDEF += $expected->expDef * $tank_battles; $expWIN += 0.01 * $expected->expWinRate * $tank_battles; // Tank missing in expected tank values so add it to the list } else { $missing [] = $tank->tank_id; } } // User want accurate calculation if ($this->accurate_calculation && !empty($missing)) { // Get missing tanks stats from API server $missing_tanks = $this->api->get('wot/tanks/stats', ['tank_id' => implode(',', $missing), 'fields' => 'tank_id,all.battles,all.frags,all.damage_dealt,all.dropped_capture_points,all.spotted,all.wins', 'account_id' => $account_id])->$account_id; // Reduce account summary data foreach ($missing_tanks AS $tank) { $summary->damage_dealt -= $tank->all->damage_dealt; $summary->spotted -= $tank->all->spotted; $summary->frags -= $tank->all->frags; $summary->dropped_capture_points -= $tank->all->dropped_capture_points; $summary->wins -= $tank->all->wins; } } // If there are missing tanks and searching for info is set to TRUE, get those values if (!empty($missing) && $this->search_missing_tanks) { $this->missing_tanks = $this->api->get('wot/encyclopedia/tankinfo', ['tank_id' => implode(',', $missing), 'fields' => 'localized_name']); } // Calculate WN8 $rDAMAGE = $summary->damage_dealt / $expDAMAGE; $rSPOT = $summary->spotted / $expSPOT; $rFRAG = $summary->frags / $expFRAGS; $rDEF = $summary->dropped_capture_points / $expDEF; $rWIN = $summary->wins / $expWIN; $rWINc = max(0, ($rWIN - 0.71) / (1 - 0.71)); $rDAMAGEc = max(0, ($rDAMAGE - 0.22) / (1 - 0.22)); $rFRAGc = max(0, min($rDAMAGEc + 0.2, ($rFRAG - 0.12) / (1 - 0.12))); $rSPOTc = max(0, min($rDAMAGEc + 0.1, ($rSPOT - 0.38) / (1 - 0.38))); $rDEFc = max(0, min($rDAMAGEc + 0.1, ($rDEF - 0.10) / (1 - 0.10))); $wn8 = 980 * $rDAMAGEc + 210 * $rDAMAGEc * $rFRAGc + 155 * $rFRAGc * $rSPOTc + 75 * $rDEFc * $rFRAGc + 145 * MIN(1.8, $rWINc); // Ok we have WN8, store it $this->wn8 = round($wn8, 2); } // Return our mighty number return $this->wn8; } Отсюда 1 Quote Share this post Link to post Short link Share on other sites
Kurzdor 450 #533678 Posted March 30, 2023 @yepev о, спасибо за наводочку. Себе забрал) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #533693 Posted March 30, 2023 3 часа назад, Kurzdor сказал: @yepev о, спасибо за наводочку. Себе забрал) тыц и тыц и тыц 1 Quote Share this post Link to post Short link Share on other sites
Kurzdor 450 #533695 Posted March 30, 2023 @StranikS_Scan само собой знаем) Всё ровно спасибо тоже) Quote Share this post Link to post Short link Share on other sites