Como armazenar valor da Carta?

9 respostas
I

Estou tentando desenvolver o Jogo Blackjack (Famoso 21). Qual a melhor maneira de se armazenar o valor da carta?
Pensei em utilizar Strings e na sequência utilizar o parseInt por exemplo, mas iria ficar muito extenso o código apenas para armazenar o valor. Pensei em outra alternativa mas não consegui encontrar…
Existe uma melhor maneira de se fazer isso?

9 Respostas

charleston10

Tambem estava querendo cria o Blackjack, mas em rede com varios jogadores, mas sem tempo…
Use Vetores no seu caso seria vetor multidimensional, ou seja, array.

//------- matriz -> 1 coluna e 4 linhas (1 carta e 4 nipes)
int cartas [][] = new int [1][4];

http://www.tiexpert.net/programacao/java/array.php

renanjp

Talvez você poderia criar a classe Carta…

Acho que a melhor maneira seria explorar a Orientação a objetos…

Na classe Carta, você poderia ter dois Enums (Enumeration), um referindo-se a numeração da carta e o outro ao nipe;

Eu faria assim pelo menos AHEHAE
Espero ter ajudado…

Att

I

charleston10:
Tambem estava querendo cria o Blackjack, mas em rede com varios jogadores, mas sem tempo…
Use Vetores no seu caso seria vetor multidimensional, ou seja, array.

//------- matriz -> 1 coluna e 4 linhas (1 carta e 4 nipes)
int cartas [][] = new int [1][4];

http://www.tiexpert.net/programacao/java/array.php

Mas eu pensei também na hora de imprimir pro usuário a carta… não teria uma forma mais “geral” de se fazer isso?
Por exemplo, se eu utilizar uma matriz como proposto por você, como seria feita a impressão disso de acordo com o valor da carta?

EDIT.: renanjp, o problema é que não estudei OO ainda… acho que vai ficar um pouco difícil, pelo menos por agora…

renanjp

Entendi, então aqui vai um exemplinho com matriz…

public static void main(String[] args) {
		
		// Conjunto de 10 cartas..
		int[][] cartas = new int [10][2];
		
		cartas[0][0] = 1; // Ais
		cartas[0][1] = 4; // Paus
		
		for (int i = 0; i < cartas.length; i++) {
			System.out.println(i+1 + "° - carta: " + cartas[i][0] + " nipe:" + cartas[i][1]);
		}
		
	}

Agora para você imprimir isso corretamente, digo…
“Carta: Ais de Copas”

é só você fazer uma relação dos valores das cartas com o nome e o nipe…
você pode usar metodos para isso…
ou simples estruturas condicionais (if, switch)…

Espero ter ajudado

I
renanjp:
Entendi, então aqui vai um exemplinho com matriz...
public static void main(String[] args) {
		
		// Conjunto de 10 cartas..
		int[][] cartas = new int [10][2];
		
		cartas[0][0] = 1; // Ais
		cartas[0][1] = 4; // Paus
		
		for (int i = 0; i < cartas.length; i++) {
			System.out.println(i+1 + "° - carta: " + cartas[i][0] + " nipe:" + cartas[i][1]);
		}
		
	}

Agora para você imprimir isso corretamente, digo..
"Carta: Ais de Copas"

é só você fazer uma relação dos valores das cartas com o nome e o nipe..
você pode usar metodos para isso..
ou simples estruturas condicionais (if, switch)..

Espero ter ajudado

Agora estou sem tempo de analisar, mas não sei se dessa forma funionaria com o método que eu criei para Embaralhar as cartas..
Veja:

static int embaralhar(){ 
       
        
        int carta;
        
            //Sorteia uma carta
            do {
                carta = (int)(Math.random() * (quantidadeValores * quantidadeNaipes));
            } while (!estaNoBaralho(carta)); //Verifica se ainda esta no baralho
            Baralho.retirarDoBaralho(carta); //Retira a carta do baralho
       
        return carta;
    
       }
TerraSkilll
charleston10:
Tambem estava querendo cria o Blackjack, mas em rede com varios jogadores, mas sem tempo.. Use Vetores no seu caso seria vetor multidimensional, ou seja, array. (...) EDIT.: renanjp, o problema é que não estudei OO ainda.. acho que vai ficar um pouco difícil, pelo menos por agora.. (...) Agora estou sem tempo de analisar, mas não sei se dessa forma funionaria com o método que eu criei para Embaralhar as cartas.. Veja:
Acho que é uma boa oportunidade para você aprender outras coisas. Usando alguma coleção (Colletions), você pode usar o método shuffle(), que embaralha a lista que contém as cartas ([url]http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle%28java.util.List%29[/url]). Veja : [url]http://www.java-examples.com/shuffle-elements-java-arraylist-example[/url].

Um exemplo (não otimizado nem testado):

class Carta{
  String naipe;
  String nome;

  public Carta(String nome, String naipe){
    this.nome = nome;
    this.naipe = naipe;
  }

  public String imprimir(){
    return nome + " de " + naipe;
  }
}

private List<Carta> montarBaralho(){
  String[] naipes = {"Espadas", "Copas", "Paus", "Ouros"};
  String[] nomes = {"Rei", "Dama", "Valete", "Ás", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};

  ArrayList lista = new ArrayList();

  for (int i=0; i < nomes.length; i++)
    for (int j=0; < naipes.length; i++)
      lista.add(new Carta(nomes[i], naipes[j]));


  Collections.shuffle(lista);

  return lista;
}

public static void main(String args[]){
  List<Carta> baralho = montarBaralho();
  for (Carta c : baralho)
    c.imprimir();
}

Abraço.

I
TerraSkilll:
charleston10:
Tambem estava querendo cria o Blackjack, mas em rede com varios jogadores, mas sem tempo.. Use Vetores no seu caso seria vetor multidimensional, ou seja, array. (...) EDIT.: renanjp, o problema é que não estudei OO ainda.. acho que vai ficar um pouco difícil, pelo menos por agora.. (...) Agora estou sem tempo de analisar, mas não sei se dessa forma funionaria com o método que eu criei para Embaralhar as cartas.. Veja:
Acho que é uma boa oportunidade para você aprender outras coisas. Usando alguma coleção (Colletions), você pode usar o método shuffle(), que embaralha a lista que contém as cartas ([url]http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle%28java.util.List%29[/url]). Veja : [url]http://www.java-examples.com/shuffle-elements-java-arraylist-example[/url].

Um exemplo (não otimizado nem testado):

class Carta{
  String naipe;
  String nome;

  public Carta(String nome, String naipe){
    this.nome = nome;
    this.naipe = naipe;
  }

  public String imprimir(){
    return nome + " de " + naipe;
  }
}

private List<Carta> montarBaralho(){
  String[] naipes = {"Espadas", "Copas", "Paus", "Ouros"};
  String[] nomes = {"Rei", "Dama", "Valete", "Ás", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};

  ArrayList lista = new ArrayList();

  for (int i=0; i < nomes.length; i++)
    for (int j=0; < naipes.length; i++)
      lista.add(new Carta(nomes[i], naipes[j]));


  Collections.shuffle(lista);

  return lista;
}

public static void main(String args[]){
  List<Carta> baralho = montarBaralho();
  for (Carta c : baralho)
    c.imprimir();
}

Abraço.

Concordo, só que nessa aplicação não vou mudar a lógica até aqui desenvolvida por se tratar de uma atividade da faculdade.. posso propor ao professor esse novo método de "Embaralharar", vamos ver o que ele diz..

Realmente está difícil eu achar uma maneira de atribuir valores as cartas..
Para ficar mais claro o que eu digo, nós estamos tratando as cartas como um array de String, veja:

String valores[] = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};

Eu pensei na hipótese de se achar a posição da carta e somar 2, por exemplo :

String "4" = Posição [2] + 2 = Valor 4
E para as "J", "Q", "K" atribuir valor 10 para essas posições, já no caso o "A" eu trabalharia ele depois, por se tratar de um caso especial, onde pode valer 11 ou 1.

Acho que a lógica é essa, só não estou conseguindo transformar isso em Linhas de Código...

Acho que agora ficou mais claro..

B

Tente usar um enum no lugar de Strings. Ele já vem com suporte para você fazer algo como DEZ+1=VALETE,

ex: http://www.coderanch.com/t/524748/java/java/shifting-next-enum-list:

public class ProximaCartaTest
{
    public enum Carta {
        AS, DOIS, TRES, QUATRO, CINCO, SEIS, SETE, OITO, NOVE, DEZ, VALETE, DAMA, REI;
        
        public Carta prox()
        {
            Carta cartas[] = Carta.values();
            int ordinal = this.ordinal();
            ordinal = ++ordinal % cartas.length;
            return cartas[ordinal];
        }
    }

    public static void main(String[] args)
   {
        Carta[] cartas = Carta.values();
        for (Carta carta : cartas)
        {
            System.out.println("carta = " + carta.toString());
            carta = carta.prox();
            System.out.println("carta.prox() = " + carta.toString());
            System.out.println();
        }
    }
}
I
Bruno Laturner:
Tente usar um enum no lugar de Strings. Ele já vem com suporte para você fazer algo como DEZ+1=VALETE, ex: http://www.coderanch.com/t/524748/java/java/shifting-next-enum-list:
public class ProximaCartaTest
{
    public enum Carta {
        AS, DOIS, TRES, QUATRO, CINCO, SEIS, SETE, OITO, NOVE, DEZ, VALETE, DAMA, REI;
        
        public Carta prox()
        {
            Carta cartas[] = Carta.values();
            int ordinal = this.ordinal();
            ordinal = ++ordinal % cartas.length;
            return cartas[ordinal];
        }
    }

    public static void main(String[] args)
   {
        Carta[] cartas = Carta.values();
        for (Carta carta : cartas)
        {
            System.out.println("carta = " + carta.toString());
            carta = carta.prox();
            System.out.println("carta.prox() = " + carta.toString());
            System.out.println();
        }
    }
}
Não conhecia o Enum, interessante.. mas não pude usá-lo, por opção do Professor.. Fiz com String mesmo.. Obrigado a todos que ajudaram..
Criado 8 de novembro de 2012
Ultima resposta 16 de nov. de 2012
Respostas 9
Participantes 5