RatingSistemaElo.java

Publicado por Edson G. de Lima (śltima atualizaēćo em 07/05/2012)

[ Hits: 3.633 ]

Download RatingSistemaElo.java




Pode ser utilizado para atualizar o rating dos participantes de um torneio de xadrez utilizando o Sistema Elo.

  



Esconder código-fonte

import java.util.Scanner;
import java.lang.Math;
public class RatingSistemaElo {
   public static void main (String args[]) {

      System.out.println ("\n--------------------------------------------");
      System.out.println ("Cįlculo de rating de xadrez pelo Sistema Elo");
      System.out.println ("--------------------------------------------\n");

      double ratingAtualJogadorA = 0;
      double ratingAtualJogadorB = 0;
      double ratingNovoJogadorA = 0;
      double ratingNovoJogadorB = 0;
      double pontosObtidosJogadorA = 0;
      double pontosObtidosJogadorB = 0;
      double pontosEsperadosJogadorA = 0;
      double pontosEsperadosJogadorB = 0;
      double diferencaDePontosAB = 0;
      double diferencaDePontosBA = 0;
      Scanner leia = new Scanner (System.in);
      Scanner leia2 = new Scanner (System.in);

      System.out.println ("Digite \"0\" para sair.");
      System.out.println ("-----------------------");

      do {
         System.out.println ("\nEntre com o rating atual do Jogador A: ");
         ratingAtualJogadorA = leia.nextDouble ();
         if (ratingAtualJogadorA == 0) {
            System.out.println ("Ok, saindo...");
            System.exit (0);
         }
         System.out.println ("\nEntre com o rating atual do Jogador B: ");
         ratingAtualJogadorB = leia.nextDouble ();

         System.out.println ("\nEntre com a pontuaēćo do Jogador A (1 para vitória, 0,5 para empate e 0 para derrota): ");
         pontosObtidosJogadorA = leia2.nextDouble ();

         if (pontosObtidosJogadorA == 1) {
            pontosObtidosJogadorB = 0;
         }else if (pontosObtidosJogadorA == 0.5) {
            pontosObtidosJogadorB = 0.5;
         }else{
            pontosObtidosJogadorB = 1;
         }

         // Tabela de pontos esperados:
         //----------------------------
         // Se o rating de A for MAIOR que de B:
         if (ratingAtualJogadorA >= ratingAtualJogadorB) {
            diferencaDePontosAB = (ratingAtualJogadorA - ratingAtualJogadorB);
            if (diferencaDePontosAB <= 3) {
               pontosEsperadosJogadorA = 0.50;
               pontosEsperadosJogadorB = 0.50;
            }else if ((diferencaDePontosAB>=4) && (diferencaDePontosAB<=10)) {
               pontosEsperadosJogadorA = 0.51;
               pontosEsperadosJogadorB = 0.49;
            }else if ((diferencaDePontosAB>=11) && (diferencaDePontosAB<=17)) {
               pontosEsperadosJogadorA = 0.52;
               pontosEsperadosJogadorB = 0.48;
            }else if ((diferencaDePontosAB>=18) && (diferencaDePontosAB<=25)) {
               pontosEsperadosJogadorA = 0.53;
               pontosEsperadosJogadorB = 0.47;
            }else if ((diferencaDePontosAB>=26) && (diferencaDePontosAB<=32)) {
               pontosEsperadosJogadorA = 0.54;
               pontosEsperadosJogadorB = 0.46;
            }else if ((diferencaDePontosAB>=33) && (diferencaDePontosAB<=39)) {
               pontosEsperadosJogadorA = 0.55;
               pontosEsperadosJogadorB = 0.45;
            }else if ((diferencaDePontosAB>=40) && (diferencaDePontosAB<=46)) {
               pontosEsperadosJogadorA = 0.56;
               pontosEsperadosJogadorB = 0.44;
            }else if ((diferencaDePontosAB>=47) && (diferencaDePontosAB<=53)) {
               pontosEsperadosJogadorA = 0.57;
               pontosEsperadosJogadorB = 0.43;
            }else if ((diferencaDePontosAB>=54) && (diferencaDePontosAB<=61)) {
               pontosEsperadosJogadorA = 0.58;
               pontosEsperadosJogadorB = 0.42;
            }else if ((diferencaDePontosAB>=62) && (diferencaDePontosAB<=68)) {
               pontosEsperadosJogadorA = 0.59;
               pontosEsperadosJogadorB = 0.41;
            }else if ((diferencaDePontosAB>=69) && (diferencaDePontosAB<=76)) {
               pontosEsperadosJogadorA = 0.60;
               pontosEsperadosJogadorB = 0.40;
            }else if ((diferencaDePontosAB>=77) && (diferencaDePontosAB<=83)) {
               pontosEsperadosJogadorA = 0.61;
               pontosEsperadosJogadorB = 0.39;
            }else if ((diferencaDePontosAB>=84) && (diferencaDePontosAB<=91)) {
               pontosEsperadosJogadorA = 0.62;
               pontosEsperadosJogadorB = 0.38;
            }else if ((diferencaDePontosAB>=92) && (diferencaDePontosAB<=98)) {
               pontosEsperadosJogadorA = 0.63;
               pontosEsperadosJogadorB = 0.37;
            }else if ((diferencaDePontosAB>=99) && (diferencaDePontosAB<=106)) {
               pontosEsperadosJogadorA = 0.64;
               pontosEsperadosJogadorB = 0.36;
            }else if ((diferencaDePontosAB>=107) && (diferencaDePontosAB<=113)) {
               pontosEsperadosJogadorA = 0.65;
               pontosEsperadosJogadorB = 0.35;
            }else if ((diferencaDePontosAB>=114) && (diferencaDePontosAB<=121)) {
               pontosEsperadosJogadorA = 0.66;
               pontosEsperadosJogadorB = 0.34;
            }else if ((diferencaDePontosAB>=122) && (diferencaDePontosAB<=129)) {
               pontosEsperadosJogadorA = 0.67;
               pontosEsperadosJogadorB = 0.33;
            }else if ((diferencaDePontosAB>=130) && (diferencaDePontosAB<=137)) {
               pontosEsperadosJogadorA = 0.68;
               pontosEsperadosJogadorB = 0.32;
            }else if ((diferencaDePontosAB>=138) && (diferencaDePontosAB<=145)) {
               pontosEsperadosJogadorA = 0.69;
               pontosEsperadosJogadorB = 0.31;
            }else if ((diferencaDePontosAB>=146) && (diferencaDePontosAB<=153)) {
               pontosEsperadosJogadorA = 0.70;
               pontosEsperadosJogadorB = 0.30;
            }else if ((diferencaDePontosAB>=154) && (diferencaDePontosAB<=162)) {
               pontosEsperadosJogadorA = 0.71;
               pontosEsperadosJogadorB = 0.29;
            }else if ((diferencaDePontosAB>=163) && (diferencaDePontosAB<=170)) {
               pontosEsperadosJogadorA = 0.72;
               pontosEsperadosJogadorB = 0.28;
            }else if ((diferencaDePontosAB>=171) && (diferencaDePontosAB<=179)) {
               pontosEsperadosJogadorA = 0.73;
               pontosEsperadosJogadorB = 0.27;
            }else if ((diferencaDePontosAB>=180) && (diferencaDePontosAB<=188)) {
               pontosEsperadosJogadorA = 0.74;
               pontosEsperadosJogadorB = 0.26;
            }else if ((diferencaDePontosAB>=189) && (diferencaDePontosAB<=197)) {
               pontosEsperadosJogadorA = 0.75;
               pontosEsperadosJogadorB = 0.25;
            }else if ((diferencaDePontosAB>=198) && (diferencaDePontosAB<=206)) {
               pontosEsperadosJogadorA = 0.76;
               pontosEsperadosJogadorB = 0.24;
            }else if ((diferencaDePontosAB>=207) && (diferencaDePontosAB<=215)) {
               pontosEsperadosJogadorA = 0.77;
               pontosEsperadosJogadorB = 0.23;
            }else if ((diferencaDePontosAB>=216) && (diferencaDePontosAB<=225)) {
               pontosEsperadosJogadorA = 0.78;
               pontosEsperadosJogadorB = 0.22;
            }else if ((diferencaDePontosAB>=226) && (diferencaDePontosAB<=235)) {
               pontosEsperadosJogadorA = 0.79;
               pontosEsperadosJogadorB = 0.21;
            }else if ((diferencaDePontosAB>=236) && (diferencaDePontosAB<=245)) {
               pontosEsperadosJogadorA = 0.80;
               pontosEsperadosJogadorB = 0.20;
            }else if ((diferencaDePontosAB>=246) && (diferencaDePontosAB<=256)) {
               pontosEsperadosJogadorA = 0.81;
               pontosEsperadosJogadorB = 0.19;
            }else if ((diferencaDePontosAB>=257) && (diferencaDePontosAB<=267)) {
               pontosEsperadosJogadorA = 0.82;
               pontosEsperadosJogadorB = 0.18;
            }else if ((diferencaDePontosAB>=268) && (diferencaDePontosAB<=278)) {
               pontosEsperadosJogadorA = 0.83;
               pontosEsperadosJogadorB = 0.17;
            }else if ((diferencaDePontosAB>=279) && (diferencaDePontosAB<=290)) {
               pontosEsperadosJogadorA = 0.84;
               pontosEsperadosJogadorB = 0.16;
            }else if ((diferencaDePontosAB>=291) && (diferencaDePontosAB<=302)) {
               pontosEsperadosJogadorA = 0.85;
               pontosEsperadosJogadorB = 0.15;
            }else if ((diferencaDePontosAB>=303) && (diferencaDePontosAB<=315)) {
               pontosEsperadosJogadorA = 0.86;
               pontosEsperadosJogadorB = 0.14;
            }else if ((diferencaDePontosAB>=316) && (diferencaDePontosAB<=328)) {
               pontosEsperadosJogadorA = 0.87;
               pontosEsperadosJogadorB = 0.13;
            }else if ((diferencaDePontosAB>=329) && (diferencaDePontosAB<=344)) {
               pontosEsperadosJogadorA = 0.88;
               pontosEsperadosJogadorB = 0.12;
            }else if ((diferencaDePontosAB>=345) && (diferencaDePontosAB<=357)) {
               pontosEsperadosJogadorA = 0.89;
               pontosEsperadosJogadorB = 0.11;
            }else if ((diferencaDePontosAB>=358) && (diferencaDePontosAB<=374)) {
               pontosEsperadosJogadorA = 0.90;
               pontosEsperadosJogadorB = 0.10;
            }else if ((diferencaDePontosAB>=375) && (diferencaDePontosAB<=391)) {
               pontosEsperadosJogadorA = 0.91;
               pontosEsperadosJogadorB = 0.09;
            }else if ((diferencaDePontosAB>=392) && (diferencaDePontosAB<=411)) {
               pontosEsperadosJogadorA = 0.92;
               pontosEsperadosJogadorB = 0.08;
            }else if ((diferencaDePontosAB>=412) && (diferencaDePontosAB<=432)) {
               pontosEsperadosJogadorA = 0.93;
               pontosEsperadosJogadorB = 0.07;
            }else if ((diferencaDePontosAB>=433) && (diferencaDePontosAB<=456)) {
               pontosEsperadosJogadorA = 0.94;
               pontosEsperadosJogadorB = 0.06;
            }else if ((diferencaDePontosAB>=457) && (diferencaDePontosAB<=484)) {
               pontosEsperadosJogadorA = 0.95;
               pontosEsperadosJogadorB = 0.05;
            }else if  ((diferencaDePontosAB>=485) && (diferencaDePontosAB<=517)) {
               pontosEsperadosJogadorA = 0.96;
               pontosEsperadosJogadorB = 0.04;
            }else if ((diferencaDePontosAB>=518) && (diferencaDePontosAB<=559)) {
               pontosEsperadosJogadorA = 0.97;
               pontosEsperadosJogadorB = 0.03;
            }else if ((diferencaDePontosAB>=560) && (diferencaDePontosAB<=619)) {
               pontosEsperadosJogadorA = 0.98;
               pontosEsperadosJogadorB = 0.02;
            }else if ((diferencaDePontosAB>=620) && (diferencaDePontosAB<=735)) {
               pontosEsperadosJogadorA = 0.99;
               pontosEsperadosJogadorB = 0.01;
            }else{
               pontosEsperadosJogadorA = 1.00;
               pontosEsperadosJogadorB = 0.00;
            }
         // Se rating de A for MENOR que de B:
         }else if (ratingAtualJogadorA < ratingAtualJogadorB) {
            diferencaDePontosBA = (ratingAtualJogadorB - ratingAtualJogadorA);
            if (diferencaDePontosBA <= 3) {
               pontosEsperadosJogadorB = 0.50;
               pontosEsperadosJogadorA = 0.50;
            }else if ((diferencaDePontosBA>=4) && (diferencaDePontosBA<=10)) {
               pontosEsperadosJogadorB = 0.51;
               pontosEsperadosJogadorA = 0.49;
            }else if ((diferencaDePontosBA>=11) && (diferencaDePontosBA<=17)) {
               pontosEsperadosJogadorB = 0.52;
               pontosEsperadosJogadorA = 0.48;
            }else if ((diferencaDePontosBA>=18) && (diferencaDePontosBA<=25)) {
               pontosEsperadosJogadorB = 0.53;
               pontosEsperadosJogadorA = 0.47;
            }else if ((diferencaDePontosBA>=26) && (diferencaDePontosBA<=32)) {
               pontosEsperadosJogadorB = 0.54;
               pontosEsperadosJogadorA = 0.46;
            }else if ((diferencaDePontosBA>=33) && (diferencaDePontosBA<=39)) {
               pontosEsperadosJogadorB = 0.55;
               pontosEsperadosJogadorA = 0.45;
            }else if ((diferencaDePontosBA>=40) && (diferencaDePontosBA<=46)) {
               pontosEsperadosJogadorB = 0.56;
               pontosEsperadosJogadorA = 0.44;
            }else if ((diferencaDePontosBA>=47) && (diferencaDePontosBA<=53)) {
               pontosEsperadosJogadorB = 0.57;
               pontosEsperadosJogadorA = 0.43;
            }else if ((diferencaDePontosBA>=54) && (diferencaDePontosBA<=61)) {
               pontosEsperadosJogadorB = 0.58;
               pontosEsperadosJogadorA = 0.42;
            }else if ((diferencaDePontosBA>=62) && (diferencaDePontosBA<=68)) {
               pontosEsperadosJogadorB = 0.59;
               pontosEsperadosJogadorA = 0.41;
            }else if ((diferencaDePontosBA>=69) && (diferencaDePontosBA<=76)) {
               pontosEsperadosJogadorB = 0.60;
               pontosEsperadosJogadorA = 0.40;
            }else if ((diferencaDePontosBA>=77) && (diferencaDePontosBA<=83)) {
               pontosEsperadosJogadorB = 0.61;
               pontosEsperadosJogadorA = 0.39;
            }else if ((diferencaDePontosBA>=84) && (diferencaDePontosBA<=91)) {
               pontosEsperadosJogadorB = 0.62;
               pontosEsperadosJogadorA = 0.38;
            }else if ((diferencaDePontosBA>=92) && (diferencaDePontosBA<=98)) {
               pontosEsperadosJogadorB = 0.63;
               pontosEsperadosJogadorA = 0.37;
            }else if ((diferencaDePontosBA>=99) && (diferencaDePontosBA<=106)) {
               pontosEsperadosJogadorB = 0.64;
               pontosEsperadosJogadorA = 0.36;
            }else if ((diferencaDePontosBA>=107) && (diferencaDePontosBA<=113)) {
               pontosEsperadosJogadorB = 0.65;
               pontosEsperadosJogadorA = 0.35;
            }else if ((diferencaDePontosBA>=114) && (diferencaDePontosBA<=121)) {
               pontosEsperadosJogadorB = 0.66;
               pontosEsperadosJogadorA = 0.34;
            }else if ((diferencaDePontosBA>=122) && (diferencaDePontosBA<=129)) {
               pontosEsperadosJogadorB = 0.67;
               pontosEsperadosJogadorA = 0.33;
            }else if ((diferencaDePontosBA>=130) && (diferencaDePontosBA<=137)) {
               pontosEsperadosJogadorB = 0.68;
               pontosEsperadosJogadorA = 0.32;
            }else if ((diferencaDePontosBA>=138) && (diferencaDePontosBA<=145)) {
               pontosEsperadosJogadorB = 0.69;
               pontosEsperadosJogadorA = 0.31;
            }else if ((diferencaDePontosBA>=146) && (diferencaDePontosBA<=153)) {
               pontosEsperadosJogadorB = 0.70;
               pontosEsperadosJogadorA = 0.30;
            }else if ((diferencaDePontosBA>=154) && (diferencaDePontosBA<=162)) {
               pontosEsperadosJogadorB = 0.71;
               pontosEsperadosJogadorA = 0.29;
            }else if ((diferencaDePontosBA>=163) && (diferencaDePontosBA<=170)) {
               pontosEsperadosJogadorB = 0.72;
               pontosEsperadosJogadorA = 0.28;
            }else if ((diferencaDePontosBA>=171) && (diferencaDePontosBA<=179)) {
               pontosEsperadosJogadorB = 0.73;
               pontosEsperadosJogadorA = 0.27;
            }else if ((diferencaDePontosBA>=180) && (diferencaDePontosBA<=188)) {
               pontosEsperadosJogadorB = 0.74;
               pontosEsperadosJogadorA = 0.26;
            }else if ((diferencaDePontosBA>=189) && (diferencaDePontosBA<=197)) {
               pontosEsperadosJogadorB = 0.75;
               pontosEsperadosJogadorA = 0.25;
            }else if ((diferencaDePontosBA>=198) && (diferencaDePontosBA<=206)) {
               pontosEsperadosJogadorB = 0.76;
               pontosEsperadosJogadorA = 0.24;
            }else if ((diferencaDePontosBA>=207) && (diferencaDePontosBA<=215)) {
               pontosEsperadosJogadorB = 0.77;
               pontosEsperadosJogadorA = 0.23;
            }else if ((diferencaDePontosBA>=216) && (diferencaDePontosBA<=225)) {
               pontosEsperadosJogadorB = 0.78;
               pontosEsperadosJogadorA = 0.22;
            }else if ((diferencaDePontosBA>=226) && (diferencaDePontosBA<=235)) {
               pontosEsperadosJogadorB = 0.79;
               pontosEsperadosJogadorA = 0.21;
            }else if ((diferencaDePontosBA>=236) && (diferencaDePontosBA<=245)) {
               pontosEsperadosJogadorB = 0.80;
               pontosEsperadosJogadorA = 0.20;
            }else if ((diferencaDePontosBA>=246) && (diferencaDePontosBA<=256)) {
               pontosEsperadosJogadorB = 0.81;
               pontosEsperadosJogadorA = 0.19;
            }else if ((diferencaDePontosBA>=257) && (diferencaDePontosBA<=267)) {
               pontosEsperadosJogadorB = 0.82;
               pontosEsperadosJogadorA = 0.18;
            }else if ((diferencaDePontosBA>=268) && (diferencaDePontosBA<=278)) {
               pontosEsperadosJogadorB = 0.83;
               pontosEsperadosJogadorA = 0.17;
            }else if ((diferencaDePontosBA>=279) && (diferencaDePontosBA<=290)) {
               pontosEsperadosJogadorB = 0.84;
               pontosEsperadosJogadorA = 0.16;
            }else if ((diferencaDePontosBA>=291) && (diferencaDePontosBA<=302)) {
               pontosEsperadosJogadorB = 0.85;
               pontosEsperadosJogadorA = 0.15;
            }else if ((diferencaDePontosBA>=303) && (diferencaDePontosBA<=315)) {
               pontosEsperadosJogadorB = 0.86;
               pontosEsperadosJogadorA = 0.14;
            }else if ((diferencaDePontosBA>=316) && (diferencaDePontosBA<=328)) {
               pontosEsperadosJogadorB = 0.87;
               pontosEsperadosJogadorA = 0.13;
            }else if ((diferencaDePontosBA>=329) && (diferencaDePontosBA<=344)) {
               pontosEsperadosJogadorB = 0.88;
               pontosEsperadosJogadorA = 0.12;
            }else if ((diferencaDePontosBA>=345) && (diferencaDePontosBA<=357)) {
               pontosEsperadosJogadorB = 0.89;
               pontosEsperadosJogadorA = 0.11;
            }else if ((diferencaDePontosBA>=358) && (diferencaDePontosBA<=374)) {
               pontosEsperadosJogadorB = 0.90;
               pontosEsperadosJogadorA = 0.10;
            }else if ((diferencaDePontosBA>=375) && (diferencaDePontosBA<=391)) {
               pontosEsperadosJogadorB = 0.91;
               pontosEsperadosJogadorA = 0.09;
            }else if ((diferencaDePontosBA>=392) && (diferencaDePontosBA<=411)) {
               pontosEsperadosJogadorB = 0.92;
               pontosEsperadosJogadorA = 0.08;
            }else if ((diferencaDePontosBA>=412) && (diferencaDePontosBA<=432)) {
               pontosEsperadosJogadorB = 0.93;
               pontosEsperadosJogadorA = 0.07;
            }else if ((diferencaDePontosBA>=433) && (diferencaDePontosBA<=456)) {
               pontosEsperadosJogadorB = 0.94;
               pontosEsperadosJogadorA = 0.06;
            }else if ((diferencaDePontosBA>=457) && (diferencaDePontosBA<=484)) {
               pontosEsperadosJogadorB = 0.95;
               pontosEsperadosJogadorA = 0.05;
            }else if  ((diferencaDePontosBA>=485) && (diferencaDePontosBA<=517)) {
               pontosEsperadosJogadorB = 0.96;
               pontosEsperadosJogadorA = 0.04;
            }else if ((diferencaDePontosBA>=518) && (diferencaDePontosBA<=559)) {
               pontosEsperadosJogadorB = 0.97;
               pontosEsperadosJogadorA = 0.03;
            }else if ((diferencaDePontosBA>=560) && (diferencaDePontosBA<=619)) {
               pontosEsperadosJogadorB = 0.98;
               pontosEsperadosJogadorA = 0.02;
            }else if ((diferencaDePontosBA>=620) && (diferencaDePontosBA<=735)) {
               pontosEsperadosJogadorB = 0.99;
               pontosEsperadosJogadorA = 0.01;
            }else{
               pontosEsperadosJogadorB = 1.00;
               pontosEsperadosJogadorA = 0.00;
            }
         }
         // *** Fórmula ***
         ratingNovoJogadorA = ratingAtualJogadorA + 10 * (pontosObtidosJogadorA - pontosEsperadosJogadorA);
         ratingNovoJogadorB = ratingAtualJogadorB + 10 * (pontosObtidosJogadorB - pontosEsperadosJogadorB);
         // ***************

         System.out.println ("\n--------------------------------");
         System.out.println (" Novo rating do Jogador A: "+(int)ratingNovoJogadorA);
         System.out.println ("--------------------------------");
         System.out.println (" Novo rating do Jogador B: "+(int)ratingNovoJogadorB);
         System.out.println ("--------------------------------\n");

      } while (ratingAtualJogadorA != 0);
   }
}

Scripts recomendados

Calcular ritmo de corrida de rua

Algoritmo para Gerar um Sudoku NxN vįlido

Calcula as chances de se ganhar na mega-sena.

Diferenca entre meses - um método de busca simples

Pesquisa Ternįria em um vetor ordenado


  

Comentįrios
[1] Comentįrio enviado por felipe300194 em 07/05/2012 - 12:58h

eu queria saber, pq nos else if a diferenēa entre os valores a serem comparados com as variįveis sćo tćo diferentes?
pq nćo de x em x?

[2] Comentįrio enviado por xxoin em 07/05/2012 - 17:46h

Esses valores sćo extraķdos de uma tabela adotada pelo próprio Sistema. O Sistema parte de uma lógica de que quanto maior for a diferenēa de forēas entre os jogadores, maiores sćo as probabilidades do mais forte vencer, por isso, se o mais forte vence um adversįrio que tenha ranking "muito" inferior, leva menos pontos do que se vencesse um adversįrio com rating semelhante ou melhor ranqueado.


Contribuir com comentįrio




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts