INTRODUÇÃO A OBJETOS COM JAVA

DEFINIÇÃO DE CLASSES (CONT)


/****************************************************
** Uma carta de um baralho
** @author Jacques P. Sauvé
** @since 10/04/1999
****************************************************/

public class Carta {
   public static final int AS = 1;
   public static final int VALETE = 11;
   public static final int DAMA = 12;
   public static final int REI = 13;

   public static final int PAUS = 1;
   public static final int OURO = 2;
   public static final int COPAS = 3;
   public static final int ESPADA = 4;

   private int	valor;
   private int	naipe;

   public Carta(int valor, int naipe) {
      this.valor = valor;
      this.naipe = naipe;
   }

   public int getValor() {
      return valor;
   }

   public int getNaipe() {
      return naipe;
   }

   public int compareTo(Carta outra) {
      if(this.valor < outra.valor) return -1;
      // posso acessar outra.valor mesmo que seja private
      else if(this.valor > outra.valor) return 1;
      return 0;
   }

   private static final String[] nomeDeCarta = {
      "",
      "AS",
      "DOIS",
      "TRES",
      "QUATRO",
      "CINCO",
      "SEIS",
      "SETE",
      "OITO",
      "NOVE",
      "DEZ",
      "VALETE",
      "DAMA",
      "REI",
   };

   private static final String[] nomeDeNaipe = {
      "",
      "PAUS",
      "OURO",
      "COPAS",
      "ESPADA",
   };
 
   public String toString() {
	return nomeDeCarta[valor] + " de " +
          nomeDeNaipe[naipe];
   }
}

/****************************************************
** Um baralho inteiro
** @author Jacques P. Sauvé
** @since 08/04/1999
****************************************************/

import java.util.*;
import java.lang.Math.*;

public class Baralho {
   private Carta[] baralho;
   private int numeroDeCartas;

   public Baralho() {
      baralho = new Carta[52];
      // enche o baralho
      numeroDeCartas = 0;
      /* poderiamos fazer laços aninhados aqui
       * mas teríamos que depender de conhecimento
       * dos inteiros que representam naipes.
       * Não queremos este acoplamento entre
       * classes para termos a liberdade de mudar
       * uma classe sem afetar a outra
       */
      for(int valor = Carta.AS; valor <= Carta.REI; valor++) {
         baralho[numeroDeCartas++] =
                  new Carta(valor, Carta.PAUS);
         baralho[numeroDeCartas++] =
                  new Carta(valor, Carta.OURO);
         baralho[numeroDeCartas++] =
                  new Carta(valor, Carta.COPAS);
         baralho[numeroDeCartas++] =
                  new Carta(valor, Carta.ESPADA);
      }
   }

   public void baralhar() {
      int posição;
      for(posição = 0;
          posição < numeroDeCartas - 1;
          posição++) {
         // escolhe uma posição aleatória
         // entre posição e numeroDeCartas-1
         int posAleatória = posição +
             (int)((numeroDeCartas - posição) * Math.random());
         // troca as cartas em posição e posAleatória
         Carta temp = baralho[posição];
         baralho[posição] = baralho[posAleatória];
         baralho[posAleatória] = temp;
      }
   }

   public Carta pegaCarta() {
      if(numeroDeCartas == 0) return null;
      return baralho[--numeroDeCartas];
   }
}


/****************************************************
** Um jogo de cartas simples
** @author Jacques P. Sauvé
** @since 08/04/1999
****************************************************/

import java.util.*;
import corejava.*;

public class JogoDeCartas {
   private int suasVitórias;   // pontuação
   private int minhasVitórias;

   public JogoDeCartas() {
      suasVitórias = 0;
      minhasVitórias = 0;
   }

   public void joga(Baralho baralho, int rodadas) {
      for(int i = 0; i < rodadas; i++) {
         Carta suaCarta = baralho.pegaCarta();
         System.out.print("Sua carta: " + suaCarta + " ");
         Carta minhaCarta = baralho.pegaCarta();
         System.out.print("Minha carta: " + minhaCarta + " ");
         int comp = minhaCarta.compareTo(suaCarta);
         if(comp < 0) {
            System.out.println("Voce ganha.");
            suasVitórias++;
         } else if(comp > 0) {
            System.out.println("Eu ganho.");
            minhasVitórias++;
         } else {
            System.out.println("Empate.");
         }
      }
      System.out.println("Voce ganhou " + suasVitórias +
            " vezes, eu ganhei " + minhasVitórias + " vezes, " +
            (rodadas-suasVitórias-minhasVitórias) + " empates.");
   }

   public static void main(String[] args) {
      int rodadas;
      while((rodadas = Console.readInt(
            "Quantas rodadas quer jogar?")) <= 0) {
         System.err.println(
            "Forneca um numero positivo, por favor.");
      }

      JogoDeCartas jogo = new JogoDeCartas();
      // Seria melhor criar o baralho e misturar
      // as cartas no construtor do jogo
      // mas queremos mostrar a passagem
      // de um objeto como parametro
      Baralho baralho = new Baralho();
      baralho.baralhar();
      // passando baralho como parâmetro
      jogo.joga(baralho, rodadas);
   }
}


/****************************************************
** Um jogo de cartas simples (versão com métodos estáticos)
** @author Jacques P. Sauvé
** @since 08/04/1999
****************************************************/

import corejava.*;

public class Jogo2 {
   // método estatico
   public static void joga(Baralho baralho, int rodadas) {
      // ja que nao vamos criar o objeto,
      // nao podem ser atributos
      int   suasRodadas = 0;
      int   minhasRodadas = 0;

      for(int i = 0; i < rodadas; i++) {
         Carta suaCarta = baralho.pegaCarta();
         System.out.print("Sua carta: " + suaCarta + " ");
         Carta minhaCarta = baralho.pegaCarta();
         System.out.print("Minha carta: " + minhaCarta + " ");
         int comp = minhaCarta.compareTo(suaCarta);
         if(comp < 0) {
            System.out.println("Voce ganha.");
            suasVitórias++;
         } else if(comp > 0) {
            System.out.println("Eu ganho.");
            minhasVitórias++;
         } else {
            System.out.println("Empate.");
         }
      }
      System.out.println("Voce ganhou " + suasVitórias +
            " vezes, eu ganhei " + minhasVitórias + " vezes, " +
            (rodadas-suasVitórias-minhasVitórias) + " empates.");
   }

   public static void main(String[] args) {
      int rodadas;
      while((rodadas = Console.readInt(
            "Quantas rodadas quer jogar?")) <= 0) {
         System.err.println(
            "Forneca um numero positivo, por favor.");
      }

      Baralho baralho = new Baralho();
      baralho.baralhar();
      // método não associado a um objeto: deve ser estático
      joga(baralho, rodadas);
   }
}

java3.htm programa próxima