Java - Ayuda con mazo de cartas

 
Vista:
sin imagen de perfil

Ayuda con mazo de cartas

Publicado por Ru (21 intervenciones) el 02/07/2020 19:46:28
Hola! buenas tardes, tengo un problema con un juego de cartas que estoy haciendo,
cuando quiero repartir las cartas a los jugadores reparte bien, pero luego de que no haya mas cartas en el mazo sigue repartiendo igual, nose como hacer para solucionarlo, si alguien me podría dar una ayuda se lo agradecería. Les dejo el código:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//palos
public enum Palos {
      ORO,
      COPA,
      BASTO,
      ESPADA
 
   }
 
 
 
 
//la clase cartas
public class Cartas {
 
 
   public int numero;
   public Palos palo;
   public int valor;
 
 
   public Cartas(Palos palo, int numero, int valor) {
      this.palo = palo;
      this.numero = numero;
      this.valor = valor;
   }
 
 
 
   public String toString() {
      return numero + " de " + palo;
   }
 
   public int getValor() {
      return valor;
   }
}
 
 
 
//la clase mazo
public class Mazo {
   public  boolean mano=true;
   private Cartas[] cartas = new Cartas[40];
   public static int cartaActual = 0;
   public Mazo() {
      Palos[] palos = new Palos[4];
      palos = Palos.values();
      int carta = 0;
      for(int palo = 0; palo < palos.length; palo ++) {
         for(int valor = 1; valor <= 12; valor ++) {
            if (!(valor==8 || valor==9 )){
            cartas[carta++] = new Cartas(palos[palo],
                  valor,
                  getFigura(valor));
         }
      }
      }
      mezclar();
 
   }
 
   private int getFigura(int valor) {
      int respuesta = 0;
      switch(valor) {
      case 1: respuesta=1;
      break;
      case 2: respuesta=2;
      break;
      case 3: respuesta=3;
      break;
      case 4: respuesta=4;
      break;
      case 5: respuesta=5;
      break;
      case 6: respuesta=6;
      break;
      case 7: respuesta=7;
      break;
      case 10:
         respuesta = 8;
         break;
      case 11:
         respuesta = 9;
         break;
      case 12:
         respuesta = 10;
         break;
      }
      return respuesta;
   }
 
   public void mezclar() {
      Random r = new Random();
      for(int i = 0; i < cartas.length; i ++) {
         int pos = r.nextInt(40);
         Cartas aux = cartas;
         cartas = cartas[pos];
         cartas[pos] = aux;
      }
      cartaActual = 0;
   }
 
   public Cartas getCarta() {
      Cartas c=null;
      if (cartaActual >= cartas.length) {
         System.out.println("No hay mas cartas");
      }else {
         c= cartas[cartaActual ++];
 
   }
 
      return c;
}
 
//El metodo para repartir las cartas a los jugadores de la clase juego
 
   public void repartirJugadores() {
        // Paso 1. Repartir cartas a jugadores
      for (int i = 0; i < 3; i++) {
         for (Jugador j: jugadores) {
            j.agregarCarta(mazoCarta.getCarta());
 
         }
 
      }
 
 
 
   }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con mazo de cartas

Publicado por Kabuto (1381 intervenciones) el 02/07/2020 21:03:58
A primera vista, lo que veo es que el método getCarta() cuando no quedan cartas devuelve valor null.

Eso no está mal, pero en el método repartirJugadores() estás aceptando esos valores null.

Podrías poner un if para solo agregar la carta, si no es null:

1
2
3
4
5
6
7
8
9
10
11
12
13
public void repartirJugadores() {
		// Paso 1. Repartir cartas a jugadores
		for (int i = 0; i < 3; i++) {
			for (Jugador j: jugadores) {
				Cartas c = mazoCarta.getCarta();
				if (c != null)
					j.agregarCarta(c);
 
			}
 
		}
 
	}

Pero esto viene a ser un parche, en realidad lo ideal sería que todo este proceso solo se llevara a cabo, si sabemos que quedan cartas en el mazo.

Como sabemos que no hay más de 40 cartas, podemos consultar el valor del atributo cartaActual de la clase Mazo antes de empezar a repartir.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void repartirJugadores() {
		// Paso 1. Repartir cartas a jugadores
 
		if (mazoCarta.cartaActual >= 40) {
			System.out.println("No quedan cartas en el mazo para repartir");
		}
		else {
			for (int i = 0; i < 3; i++) {
				for (Jugador j: jugadores) {
					Cartas c = mazoCarta.getCarta();
					if (c != null)
						j.agregarCarta(mazoCarta.getCarta());
				}
			}
		}
 
	}

Por cierto, ese atributo cartaActual, lo has declarado como static y no se por qué.
No creo que necesites que sea static e incluso puede que para el método repartirJugadores() el compilador lance un warning porque, aunque es aceptable, no le va parecer adecuado que estemos accediendo a una variable estática para un objeto (mazoCarta) que está instanciado (y por tanto no es estático)

Las variables estáticas están diseñadas para poder acceder a ellas nombrando la clase a la que pertenecen y ya está, sin necesidad de instanciar un objeto de dicha clase. Por tanto, dicha variable no es un atributo, porque no está asociado a un objeto concreto.
En este caso, nos interesa que esa variable sí funcione como un atributo, queremos que esté asociada a un objeto concreto (nuestro mazo de cartas) y al ser estática, aunque podemos usarla como si fuera un atributo, técnicamente no lo es y por eso el compilador y/o el IDE que estés usando posiblemente lance un warning.
No un error, porque el programa va a funcionar igual.
Pero sí un aviso de que lo que estamos haciendo no es lo ideal.

A no ser que tengas un motivo real de peso, yo le quitaría lo de static a esa variable.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar