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?
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];
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
[quote=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[/quote]
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…
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
[quote=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[/quote]
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:
[code] 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;
}
[/code]
[quote=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:
[/quote]
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 (http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle%28java.util.List%29). Veja : http://www.java-examples.com/shuffle-elements-java-arraylist-example.
Um exemplo (não otimizado nem testado):
[code]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 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 baralho = montarBaralho();
for (Carta c : baralho)
c.imprimir();
}[/code]
Abraço.
[quote=TerraSkilll][quote=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:
[/quote]
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 (http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle%28java.util.List%29). Veja : http://www.java-examples.com/shuffle-elements-java-arraylist-example.
Um exemplo (não otimizado nem testado):
[code]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 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 baralho = montarBaralho();
for (Carta c : baralho)
c.imprimir();
}[/code]
Abraço.[/quote]
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…
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();
}
}
}
[quote=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:
[code]
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();
}
}
}
[/code][/quote]
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…