elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ayuda con mazo de cartas!!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con mazo de cartas!!  (Leído 3,256 veces)
Ruusa

Desconectado Desconectado

Mensajes: 32


Ver Perfil
Ayuda con mazo de cartas!!
« en: 2 Julio 2020, 18:59 pm »

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:


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

MOD: Etiqueta GeSHi.


« Última modificación: 2 Julio 2020, 23:05 pm por MCKSys Argentina » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Ayuda con mazo de cartas!!
« Respuesta #1 en: 3 Julio 2020, 00:29 am »


Código
  1. public void mezclar() {
  2. Random r = new Random();
  3. for(int i = 0; i < cartas.length; i ++) {
  4. int pos = r.nextInt(40);
  5. Cartas aux = cartas[i];
  6. cartas[i] = cartas[pos];
  7. cartas[pos] = aux;
  8. }
  9. cartaActual = 0;
  10. }
  11.  
Esta función está mal.
No garantiza un reparto aleatorio.
El bucle debe empezar desde atrás hasta el comienzo... (por sencillez), pero sobre todo porque el rango aleatorio debe reducirse en cada iteración.

Código:
MAX_CARTAS = 40
...
Funcion Barajar
    Bucle para i desde MAX_CARTAS-1 hasta 1 retrocediendo
        pos = random(0 a i)
        aux = cartas(i)
        cartas(i) = cartas(pos)
        cartas(pos) = aux
    Siguiente

    cartaActual =MAX_CARTAS
Fin funcion
 

Así en la primera iteración se elige un valar entre 0 y 39, en la segunda entre 0 y 38, en la 3ª entre 0 y 37... pero la posición 39, ya fue depositado en la 1ª iteración, la 38º en la 2ª y el 37 en la 3ª, etc...
y cuando solo queda 1 elemento (en la posición 0), no es preciso barajarlo consigo mismo, se deja el valor que resta, por eso basta llegar hasta 1...

Si lo miras bien, de esta manera absolutamente todas las posiciones son cambiadas, salgan o no en el generador aleatorio...
del modo que tu lo haces, si la posición 20 (por ejemplo), sale elegido 3 veces, se puede afirmar que habrá 3 cartas que no cambiarán su posición de antes de barajar.

Una vez que las cartas están barajadas, se pueden tomar en orden correlativo  (no importa tanto si de arriba abajo o de abajo hacia arriba), pero igual que en la realidad e spreferible tomar la de más arriba e ir descendiendo hasta llegar a 0, favorece posteriores barajados...  luego necesitas cambiar tu función 'GetCarta'

Código:
carta = funcion GetSiguienteCarta
    si (cartaActual = 0)
         mensaje "no quedan cartas"
         // más abajo comento de cambiar este caso...
   Si no
        cartaActual  -=1
        devolver cartas(CartaActual)
   fin si
fin funcion
La función no es muy distinta a la que tienes, pero es preferible hacerlo de forma regresiva, pués empezamos, descontando cartaactual y luego devolvemos la carta en dicha posición... paramos cuando el valor llega a 0 y se reclama otra.

Según de que típo de juego se trate, pueden repartirse todas la comienzo, algo que solo será posible si el número de jugadores es congruente con el número de cartas. Opuedne repartirse una cantidad fija.
También dependeindo del juego pued ehaber descartes de cartas a medida que se juega... con ese descarte, se van amontonando juntas, y cuando el mazo está vacío se trasladan estas al mazo (sean la cantidad que sean (pero debe llevarse la cuenta)  y se barajan, ahora cartaActual  valdrá esa cantidad y por tanto en vez de decir 'no quedan cartas' , se invoca esa función que recoje el mazo de cartas descartadas, y se barajan como el mazo, al término devuelve la última. ...pero como digo, depende del tipo de juego y las reglas que tenga...
Sería más  o menos:
Código:
carta = funcion GetSiguienteCarta
    si (cartaActual = 0) // no quedan cartas"
         PasarDescarteAMazo
   fin si

   cartaActual  -=1
   devolver cartas(CartaActual)
fin funcion

// tomar mazo de descarte , pasarlo al mazo de cartas y barajarlo
funcion PasarDescarteAMazo
    entero k
    
    bucle para k desde 0 hasta DescarteActual -1      
        Cartas(k) = Descarte(k)     // Descarte es otra instancia de 'Cartas'.
    siguiente

    Barajar(DescarteActual )   // exige modificar la función barajar para que reciba el parámetro de cuantas tiene en tal momento.
fin funcion

// Una función para que un jugador pueda descartarse de alguna carta...
// se amontona en otro mazo de cartas, del que s elleva la cuenta.
funcion Descartar(carta)
    Descarte(DescarteActual ) = carta
    DescarteActual +=1
fin funcion

// una constande de la clase 'Cartas'
MAX_CARTAS = 40
...
funcion NuevaPartida
   Barajar(MAX_CARTAS)
   ...
fin funcion

Funcion Barajar(cantidad)  // ahora se recibe un parámetro que es la cantidad a barajar hasta 1.
    Bucle para i desde cantidad-1 hasta 1 retrocediendo
        pos = random(0 a i)
        aux = cartas(i)
        cartas(i) = cartas(pos)
        cartas(pos) = aux
    Siguiente

    cartaActual = cantidad
    descarteActual = 0    // el mazo de descarte ahora está vací...
Fin funcion
 

Luego en el bucle ese de asignar las cartas... el siguiente bucle:
Código
  1. for(int valor = 1; valor <= 12; valor ++)
sería más sencillo, claro y eficiente, separarlo en dos bucles:
Código:
bucle desde 1 hasta 7
 ...
bucle desde 10 hasta 12
 ...

Finalmente, al repartir en la función 'repartirJugadores', repartes cada vez 4 cartas a cada jugador... dependerá de cuantos jugadores sean, no podrá servir 4 cartas a cada jugador todas las veces que se llame. Mira si el juego permite descartarse... y si en el juego siempre hay cartas de descarte o si el juego puede completarse sin necsidad de tomar más cartas... las reglas del juego definirán ciertos aspectos.


« Última modificación: 3 Julio 2020, 00:38 am por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Generador de cartas
Programación Visual Basic
aaronduran2 8 4,358 Último mensaje 21 Octubre 2008, 18:01 pm
por el_c0c0
AYUDA y EJERCICIO - Truco de cartas en C#
.NET (C#, VB.NET, ASP)
Edu 5 7,403 Último mensaje 22 Diciembre 2010, 20:44 pm
por Edu
AYUDA CON CODIGO DE JUEGO DE CARTAS
Ejercicios
kasidy 2 8,150 Último mensaje 26 Noviembre 2013, 16:00 pm
por kasidy
Necesito ayuda con este programa quiero que me imprima las cartas que almacene
Programación C/C++
Shaitan Nasser 1 4,062 Último mensaje 23 Noviembre 2017, 03:19 am
por Serapis
Problema mazo de cartas
Programación C/C++
makul 9 4,038 Último mensaje 5 Septiembre 2019, 21:15 pm
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines