Pular para o conteúdo

RatingSistemaElo.java

Pode ser utilizado para atualizar o rating dos participantes de um torneio de xadrez utilizando o Sistema Elo.
Edson G. de Lima xxoin
Hits: 4.076 Categoria: Java Subcategoria: Miscelânea
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Pode ser utilizado para atualizar o rating dos participantes de um torneio de xadrez utilizando o Sistema Elo.
Download RatingSistemaElo.java Enviar nova versão

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);
   }
}

Calculadora simples

Agenda eletrônica

Login gráfico em java

Matemática discreta

Conectando 2 Maquinas no Java

#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

Entre na sua conta para comentar.