 /* -----------------------------------------------------------------
    Alunos = Igor Betim de Freitas, Celso Alves, Germano Cunha Diogo
    Turma  = Paradigmas de Programacao - 71
    Prof.  = Gerson Cavalheiro
    ------------------------------------------------------------------*/

class principal{
   public static void main( String args[] ){
    /* ------------------------------------------
        Declaracao das referencias aos objetos
       ------------------------------------------ */
      segmento    obj_lama;
      segmento    obj_areia;
      segmento    obj_grama;
      segmento    obj_paralelepipedo;
      segmento    obj_asfalto;
      competidor  obj_cavalo; 
      competidor  obj_moto;
      competidor  obj_jeep;
      competidor  obj_carro;
      banca       obj_banca; 

      int opcao = 0;

      Bloco_Corrida:
      do{  // Cada iteracao deste bloco representa uma corrida

      /* --------------------------------------------
         Para cada corrida instancia os objetos
         --------------------------------------------*/
         obj_lama           = new segmento();
         obj_areia          = new segmento();
         obj_grama          = new segmento();
         obj_paralelepipedo = new segmento();
         obj_asfalto        = new segmento();
         obj_cavalo         = new competidor(4,4,5,3,1); // Inicializa os potenciais
         obj_moto           = new competidor(5,4,1,3,5);  // para cada Segmento
         obj_jeep           = new competidor(5,4,2,3,2);
         obj_carro          = new competidor(1,1,1,4,5); 
         obj_banca          = new banca();          

         obj_banca.apostar(); // Banca recebe os apostadores      
    
      /* ---------------------------------------------------------
         Agora, randomicamente gera o tamanho dos segmentos
         ----------------------------------------------------------*/
         pista.tam_pista = 0;  // acumulara o tamanho total da pista
         obj_lama.Gera_Tamanho();
         obj_areia.Gera_Tamanho();
         obj_grama.Gera_Tamanho();
         obj_paralelepipedo.Gera_Tamanho();
         obj_asfalto.Gera_Tamanho();

      /* -------------------------------------------------------------
         Cria uma especie de uma ligacao entre Pista e Competidor para
         que cada Competidor saiba onde vai correr.
         -------------------------------------------------------------*/
         competidor.Segmento_Percorrer("Lama",    obj_lama.Tamanho_Segmento());
         competidor.Segmento_Percorrer("Areia",   obj_areia.Tamanho_Segmento());
         competidor.Segmento_Percorrer("Grama",   obj_grama.Tamanho_Segmento());
         competidor.Segmento_Percorrer("Paralelepipedo", obj_paralelepipedo.Tamanho_Segmento());
         competidor.Segmento_Percorrer("Asfalto", obj_asfalto.Tamanho_Segmento()); 

      /* ----------------------------------------------------------------
         Agora iremos gerar um numero randomico diferente para cada com-
         petidor e chamar o metodo que fara o Caminhamento ate que um deles
         termine a corrida. O intervalo do numero randomico gerado sera
         entre 1 e 20.
         ----------------------------------------------------------------- */
         boolean terminou = false;
         String ganhador  = "";
         int cod_ganhador = 0;
         int dist_ganhador= 0;

         do{
            for(int i = 1; i <= 4; i++){
               int passos = 1 + ((int) (Math.random() * 20));
               switch(i){
                  case 1:
                     obj_cavalo.Caminha(passos);
                     break;
                  case 2:
                     obj_moto.Caminha(passos);
                     break;
                  case 3:
                     obj_jeep.Caminha(passos);
                     break;
                  case 4:
                      obj_carro.Caminha(passos);
                      break;
               }
            }
            System.out.println("Observe o andamento da corrida:");
            System.out.println("Distancia a ser percorrida: " + pista.tam_pista);
            System.out.println("Posicao do Cavalo: " + obj_cavalo.Retorna_Posicao());
            System.out.println("Posicao da Moto: "   + obj_moto.Retorna_Posicao());
            System.out.println("Posicao do Jeep: "   + obj_jeep.Retorna_Posicao());
            System.out.println("Posicao do Carro: "  + obj_carro.Retorna_Posicao());
            System.out.println("Pressione algo para continuar.");
            String continuar = KBItf.gets();
         /* -------------------------------------------------
             Agora verificamos se alguem terminou a corrida
            --------------------------------------------------*/
            if (obj_cavalo.Retorna_Posicao() > pista.tam_pista){
               terminou      = true;
               cod_ganhador  = 1;
               ganhador      = "Cavalo";
               dist_ganhador = obj_cavalo.Retorna_Posicao();
            }

            if (obj_moto.Retorna_Posicao() > pista.tam_pista){
               if (obj_moto.Retorna_Posicao() > dist_ganhador){
                  terminou      = true;
                  cod_ganhador  = 2;
                  ganhador      = "Moto";
                  dist_ganhador = obj_moto.Retorna_Posicao();
               }
            }
            if (obj_jeep.Retorna_Posicao() > pista.tam_pista){
               if (obj_jeep.Retorna_Posicao() > dist_ganhador){
                  terminou      = true;
                  cod_ganhador  = 3;
                  ganhador      = "Jeep";
                  dist_ganhador = obj_jeep.Retorna_Posicao();
               }
            }

            if (obj_carro.Retorna_Posicao() > pista.tam_pista){
               if (obj_carro.Retorna_Posicao() > dist_ganhador){
                  terminou      = true;
                  cod_ganhador  = 4;
                  ganhador      = "Carro";
                  dist_ganhador = obj_carro.Retorna_Posicao();
               }
            }    
         } while(terminou == false);

         System.out.println("O vencedor da corrida foi: " + ganhador);
         System.out.println("Pressione algo para continuar.");
         String continuar = KBItf.gets();

         obj_banca.apurar_ganhadores(cod_ganhador);
         if (obj_banca.existe_saldo() == false){
            opcao = 99;
         }
         else{
            System.out.println("[1]  - Jogar novamente");
            System.out.println("[99] - Sair do Programa");
            do{
               opcao = KBItf.geti();
               if (opcao != 1 & opcao != 99){
                  System.out.println("Opcao Invalida. Digite novamente.");
               }
            } while(opcao != 1 & opcao != 99);
         } 
      } while (opcao != 99);
   } // Fim do metodo main
}   // Fim da classe principal

