Расчёт рейтинга ELO

Тема в разделе "PHP", создана пользователем sasha14486, 12 май 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. sasha14486

    sasha14486 Создатель

    Регистр.:
    27 июл 2008
    Сообщения:
    24
    Симпатии:
    0
    Помогите пожалуйста сделать вот такой рейтинг Ело как на етом сайте http://fifaleague.ru/addvs/

    Порылся в инети нашол написаный скрипт ну он не полностью работает.

    PHP:
    // $pl_1  id первого игрока, $pl_2 id второго  ,
    // $score_home   счёт первого игрока,   $score_away счёт второго   ,  $koef = 20
    function addRating($pl_1 $pl_2 $score_home $score_away $koef)
    {
        global 
    $db;
         
        
    $rh $db->query("SELECT skill FROM ae_users WHERE id=".$pl_1);  //  тут получаю старый рейтинг для первого игрока
        
    $ra $db->query("SELECT skill FROM ae_users WHERE id=".$pl_2); //  тут получаю старый рейтинг для второго игрока
        
    $Ro_pl_1 $rh['skill'];
        
    $Ro_pl_2 $ra['skill'];
        if(
    $Ro_pl_1 >= $Ro_pl_2) { $difference $Ro_pl_1 $Ro_pl_2; } else { $difference $Ro_pl_2 $Ro_pl_1;  }  // высчитываю разницу в рейтинге

        
    if($score_home $score_away)  //  если выиграл первый игрок
        
    {
            
    $g $score_home $score_away//  разница в забитых мячах
            
    if($g <= 1) { $G '1'; }    if($g == 2) { $G '1.5'; } if($g == 3) { $G '1.6'; } if($g 3) { $G = (11+$g)/8; }
            
    $We =  1/(pow(10, -$difference/400)+1);   //  тут сама формула
            
    $do_pl_1 $koef*$G*($We); $do_pl_1 round($do_pl_1);
            
    $do_pl_2 $koef*$G*(- (1-$We)); $do_pl_2 round($do_pl_2);
             
            
    // вот новый рейтинг для игрока $do_pl_1  WHERE id=".$pl_1);
            // новый рейтинг для игрока 2  $do_pl_2  WHERE id=".$pl_2);
        
    }
         
                 
    //  ниже тоже самое, но уже если выиграл игрок 2   может это лишнее, я запутался .

        
    if($score_home $score_away)
        {
            
    $g $score_away $score_home;
            if(
    $g <= 1) { $G '1'; }    if($g == 2) { $G '1.5'; } if($g == 3) { $G '1.6'; } if($g 3) { $G = (11+$g)/8; }
            
    $We =  1/(pow(10, -$difference/400)+1); 
            
    $do_pl_1 $koef*$G*(- (1-$We)); $do_pl_1 round($do_pl_1);
            
    $do_pl_2 $koef*$G*($We); $do_pl_2 round($do_pl_2);
             
            
    $db->update("UPDATE ae_users SET skill=(skill+$do_pl_1)  WHERE id=".$pl_1);
            
    $db->update("UPDATE ae_users SET skill=(skill+$do_pl_2)  WHERE id=".$pl_2);
             
             
        }
         
        if(
    $score_home == $score_away)
        {
            
    $g $score_away $score_home;
            if(
    $g <= 1) { $G '1'; }    if($g == 2) { $G '1.5'; } if($g == 3) { $G '1.6'; } if($g 3) { $G = (11+$g)/8; }
            
    $We =  1/(pow(10, -$difference/400)+1); 
            
    $do_pl_1 $koef*$G*(0.5 $We); $do_pl_1 round($do_pl_1);
            
    $do_pl_2 $koef*$G*(0.5 - (1-$We)); $do_pl_2 round($do_pl_2);
             
         
            
    $db->update("UPDATE ae_users SET skill=(skill+$do_pl_1)  WHERE id=".$pl_1);
            
    $db->update("UPDATE ae_users SET skill=(skill+$do_pl_2)  WHERE id=".$pl_2);
             
        }

    }
    Вообщем при каких то случаях это всё работает правильно, но если выигрывает игрок с малым рейтингом у игрока с большим, то всё равно ему дают мало, это неправильно.

    Сама формула и суть рейтинга написано вот http://ru.wikipedia.org/wiki/Рейтинг_Эло
    и вот http://www.eloratings.net/system.html
    Помогите пожалуйста сделать вот такой рейтинг.Если не сложно напишите обьяснения еще.Спасибо всем кто поможет.Спасибо всегда скажу. :ay:
     
Статус темы:
Закрыта.