INTRODUÇÃO A OBJETOS COM JAVA
DEFINIÇÃO DE CLASSES (CONT)
PASSANDO OBJETOS COMO PARÂMETRO
EXEMPLO: JOGO DE CARTAS
/****************************************************
** 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