RatingSistemaElo.java

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

[ Hits: 3.974 ]

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

Pilha em Java

Gerador de nśmeros aleatórios em Java

Algoritmo para Gerar um Sudoku NxN vįlido

Cadastramento de Produtos com .JOptionPane

Planilha de cįlculo para multa judicial


  

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