Bom dia a todos!
Hoje tenho um programa de exemplos de um jogo de vinte um.
Ao executá-lo me deparo com a seguinte mensagem de erro:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 52
at cartas.Baralho.proximaCarta(Baralho.java:36)
at cartas.VinteUm.main(VinteUm.java:28)
package cartas;
public class Carta {
public static final int PAUS=1, OUROS=2, ESPADAS=3, COPAS=4;
private int naipe;
private int valor;
public Carta(int n, int v){
naipe = n >= PAUS && n <= COPAS ? n : 1;
valor = v >= 1 && n <= 13 ? v : 1;
}
public int getNaipe(){
return naipe;
}
public int getValor(){
return valor;
}
public String toString(){
String tmp = null;
switch(valor){
case 1: tmp = "as"; break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10: tmp = valor +""; break;
case 11: tmp = "valete"; break;
case 12: tmp = "dama"; break;
case 13: tmp = "rei"; break;
}
switch(naipe){
case PAUS: return tmp + " de paus";
case OUROS: return tmp + " de ouros";
case ESPADAS: return tmp + " de espadas";
case COPAS: return tmp + " de copas";
}
return tmp;
}
}
package cartas;
public class Baralho {
private Carta monte[];
private int topo;
public Baralho(){
monte = new Carta[52];
topo = 0;
for(int n = 1; n < 5; n++){
for(int v = 1; v < 14; v++){
monte[topo++] = new Carta(n, v);
}
}
}
public boolean temCarta(){
return topo > 0;
}
public Carta proximaCarta(){
Carta tmp = null;
if(topo > 0)
tmp = monte[topo--];
return tmp;
}
public void embaralhar(){
for(int c = 0; c < 52; c++){
int i = (int)Math.round(Math.random()*51);
Carta tmp = monte[i];
monte[i] = monte[c];
monte[c] = tmp;
}
}
}
package cartas;
public class VinteUm {
public static void main(String[] args) {
int jogador = 0, pontosJogador = 0;
int comput = 0, pontosComput = 0;
Carta cartasJogador[] = new Carta[19];
Carta cartasComput[] = new Carta[19];
Baralho b = new Baralho();
b.embaralhar();
String resp = "N";
do{
cartasJogador[jogador++] = b.proximaCarta();
System.out.println("\n Suas cartas: ");
mostraCartas(cartasJogador);
pontosJogador = somaCartas(cartasJogador);
if(pontosJogador < 21){
System.out.println("Quer carta? (S|N");
resp = Input.readString();
}
}while(resp.equals("S") && pontosJogador < 21);
if(pontosJogador > 21){
System.out.println("Você perdeu!");
return;
}
System.out.println("\n Minhas cartas:");
while(pontosComput < pontosJogador && pontosComput != 21){
cartasComput[comput++] = b.proximaCarta();
pontosComput = somaCartas(cartasComput);
}
mostraCartas(cartasComput);
if(pontosComput >= pontosJogador && pontosComput != 21){
System.out.println("\n Você perdeu!");
}else{
System.out.println("\n Você ganhou!");
}
}
private static int somaCartas(Carta mao[]){
int i = 0, pontos = 0;
while(mao[i] != null){
if(mao[i].getValor() > 10)
pontos++;
else
pontos += mao[i].getValor();
i++;
}
return pontos;
}
private static void mostraCartas(Carta mao[]){
int i = 0;
while(mao[i] != null){
System.out.println((i != 0 ? " , " : " ")+ mao[i].toString());
i++;
}
System.out.println("\n Pontos = " + somaCartas(mao));
}
}
Não consigo ver como acertar este programa. Por favor me ajudem!!!