Foros del Web » Programación para mayores de 30 ;) » Java »

Problema java principante

Estas en el tema de Problema java principante en el foro de Java en Foros del Web. Hola, Tengo que hacer un juego de dominó en el que al comienzo de la partida se creen las 28 fichas y se den 7 ...
  #1 (permalink)  
Antiguo 29/04/2015, 13:42
 
Fecha de Ingreso: abril-2015
Mensajes: 6
Antigüedad: 9 años
Puntos: 0
Problema java principante

Hola,

Tengo que hacer un juego de dominó en el que al comienzo de la partida se creen las 28 fichas y se den 7 a cada jugador (son 2 jugadores). Las fichas se representarían así:

[5|3] [3|1]

El caso es que no sé cómo crearlas sin que se repitan ni como asignarlas a los jugadores, si cada ficha fuera una sola variable creo que sabría pero al tener cada ficha dos números no tengo ni idea...

Un saludo y gracias de antemano
  #2 (permalink)  
Antiguo 30/04/2015, 01:50
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema java principante

Buenas,

Puedes guardar la informacion de cada ficha en un array de dos posiciones

Código Java:
Ver original
  1. int[] ficha1 = new int[]{5, 3};
  2. int[] ficha2 = new int[]{3, 1};

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 30/04/2015, 02:37
 
Fecha de Ingreso: abril-2015
Mensajes: 6
Antigüedad: 9 años
Puntos: 0
Respuesta: Problema java principante

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

Puedes guardar la informacion de cada ficha en un array de dos posiciones

Código Java:
Ver original
  1. int[] ficha1 = new int[]{5, 3};
  2. int[] ficha2 = new int[]{3, 1};

Un saludo
¿Sería ese código igual que este?


Código:
String array[][];
array = new array[28][28];

array[0][0] = ficha1;
array[0][1] = ficha2;
array[0][2] = ficha3;
....
array[1][0]
array[1][1]
....
....
array[6][6] = ficha28;
Y si así sería válido, ¿cómo podría repartir 7 a cada jugador habiendo dos jugadores?
  #4 (permalink)  
Antiguo 30/04/2015, 03:52
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema java principante

Buenas,

No, lo que tu haces no tiene nada que ver.

Yo estoy creando arrays unidimensionales con dos valores.

Tu estas creando arrays bidimensionales vacios.

Para repartir lo mejor es que te crees un arraylist de fichas y despues hagas un:
Código Java:
Ver original
  1. Collections.shuffle(arrayList);
Esto va a "barajar" las fichas.

Posteriormente solo tienes que hacer un bucle y asignar cada ficha a cada jugador.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 30/04/2015, 05:57
 
Fecha de Ingreso: abril-2015
Mensajes: 6
Antigüedad: 9 años
Puntos: 0
Respuesta: Problema java principante

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

No, lo que tu haces no tiene nada que ver.

Yo estoy creando arrays unidimensionales con dos valores.

Tu estas creando arrays bidimensionales vacios.

Para repartir lo mejor es que te crees un arraylist de fichas y despues hagas un:
Código Java:
Ver original
  1. Collections.shuffle(arrayList);
Esto va a "barajar" las fichas.

Posteriormente solo tienes que hacer un bucle y asignar cada ficha a cada jugador.


Un saludo
Vale, entonces tengo esto:

Código:
int[] ficha1 = new int[]{0, 0};
        int[] ficha2 = new int[]{0, 1};
        int[] ficha3 = new int[]{0, 2};
        int[] ficha4 = new int[]{0, 3};
        int[] ficha5 = new int[]{0, 4};
        int[] ficha6 = new int[]{0, 5};
        int[] ficha7 = new int[]{0, 6};
        int[] ficha8 = new int[]{1, 1};
        int[] ficha9 = new int[]{1, 2};
        int[] ficha10 = new int[]{1, 3};
        int[] ficha11 = new int[]{1, 4};
        int[] ficha12 = new int[]{1, 5};
        int[] ficha13 = new int[]{1, 6};
        int[] ficha14 = new int[]{2, 2};
        int[] ficha15 = new int[]{2, 3};
        int[] ficha16 = new int[]{2, 4};
        int[] ficha17 = new int[]{2, 5};
        int[] ficha18 = new int[]{2, 6};
        int[] ficha19 = new int[]{3, 3};
        int[] ficha20 = new int[]{3, 4};
        int[] ficha21 = new int[]{3, 5};
        int[] ficha22 = new int[]{3, 6};
        int[] ficha23 = new int[]{4, 4};
        int[] ficha24 = new int[]{4, 5};
        int[] ficha25 = new int[]{4, 6};
        int[] ficha26 = new int[]{5, 5};
        int[] ficha27 = new int[]{5, 6};
        int[] ficha28 = new int[]{6, 6};
Y luego para crear el arraylist sería algo así? Porque me sale error

Código:
char barajar[];
        barajar = new char[28];
        
        barajar[0] = 'ficha1';
        barajar[1] = 'ficha2';
Siento estas dudas de novato
  #6 (permalink)  
Antiguo 30/04/2015, 07:59
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Problema java principante

Si estamos hablando de Java, que es un lenguaje orientado a objetos, que mínimo que representar las fichas como un objeto propio y no como un array de enteros?
__________________
Aviso: No se resuelven dudas por MP!
  #7 (permalink)  
Antiguo 30/04/2015, 08:33
 
Fecha de Ingreso: abril-2015
Mensajes: 6
Antigüedad: 9 años
Puntos: 0
Respuesta: Problema java principante

Cita:
Iniciado por Malenko Ver Mensaje
Si estamos hablando de Java, que es un lenguaje orientado a objetos, que mínimo que representar las fichas como un objeto propio y no como un array de enteros?
Agradezco cualquier ayuda, estoy muy verde y no me veo capaz de hacerlo
  #8 (permalink)  
Antiguo 30/04/2015, 09:18
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema java principante

Cita:
Iniciado por Malenko Ver Mensaje
Si estamos hablando de Java, que es un lenguaje orientado a objetos, que mínimo que representar las fichas como un objeto propio y no como un array de enteros?
Siguiendo la misma argumentacion, si Java permite crear arrays... por qué no utilizarlos?

Si un array permite representar perfectamente el objecto deseado y le resulta mas facil de entender a KRPH a su nivel, no veo nada malo en utilizarlo.

Por otro lado, no hemos de olvidar que en Java un array tambien es tecnicamente un objecto, por lo que esto es perfectamente valido hacer:

Código Java:
Ver original
  1. Object o = new int[] { 1,2 };


@KRPH
Cita:
Y luego para crear el arraylist sería algo así?
No, crear un arraylist seria mas bien:
Código Java:
Ver original
  1. List<int[]> fichas= new ArrayList<>();
  2. fichas.add(ficha1);
  3. fichas.add(ficha2);
  4. fichas.add(ficha3);
  5. ....
  6. Collections.suffle(fichas);
  7. ...
  8.  
  9. for (final int[] ficha : fichas) {
  10. // Repartes
  11. }

Si lo quieres hacer creando objetos, como bien indica Malenko

Ficha.java

Código Java:
Ver original
  1. public class Ficha {
  2.     private int num1;
  3.     private int num2;
  4.    
  5.     public Ficha(int num1, int num2) {
  6.         this.num1 = num1;
  7.         this.num2 = num2;
  8.     }
  9.  
  10.     public int getNum1() {
  11.         return num1;
  12.     }
  13.  
  14.     public int getNum2() {
  15.         return num2;
  16.     }    
  17. }


Código Java:
Ver original
  1. ......
  2.  
  3. Ficha ficha1 = new Ficha1(0, 1);
  4. Ficha ficha2 = new Ficha1(1,3);
  5. Ficha ficha3 = new Ficha1(3, 2);
  6. etc etc
  7.  
  8. ......
  9.  
  10. List<Ficha> fichas= new ArrayList<>();
  11. fichas.add(ficha1);
  12. fichas.add(ficha2);
  13. fichas.add(ficha3);
  14. ....
  15. Collections.suffle(fichas);
  16. ...
  17.  
  18. for (final Ficha  ficha : fichas) {
  19. // Repartes
  20. }

Espero que a partir de aqui sepas ya hacerlo.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #9 (permalink)  
Antiguo 30/04/2015, 12:16
 
Fecha de Ingreso: abril-2015
Mensajes: 6
Antigüedad: 9 años
Puntos: 0
Respuesta: Problema java principante

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Siguiendo la misma argumentacion, si Java permite crear arrays... por qué no utilizarlos?

Si un array permite representar perfectamente el objecto deseado y le resulta mas facil de entender a KRPH a su nivel, no veo nada malo en utilizarlo.

Por otro lado, no hemos de olvidar que en Java un array tambien es tecnicamente un objecto, por lo que esto es perfectamente valido hacer:

Código Java:
Ver original
  1. Object o = new int[] { 1,2 };


@KRPH


No, crear un arraylist seria mas bien:
Código Java:
Ver original
  1. List<int[]> fichas= new ArrayList<>();
  2. fichas.add(ficha1);
  3. fichas.add(ficha2);
  4. fichas.add(ficha3);
  5. ....
  6. Collections.suffle(fichas);
  7. ...
  8.  
  9. for (final int[] ficha : fichas) {
  10. // Repartes
  11. }

Si lo quieres hacer creando objetos, como bien indica Malenko

Ficha.java

Código Java:
Ver original
  1. public class Ficha {
  2.     private int num1;
  3.     private int num2;
  4.    
  5.     public Ficha(int num1, int num2) {
  6.         this.num1 = num1;
  7.         this.num2 = num2;
  8.     }
  9.  
  10.     public int getNum1() {
  11.         return num1;
  12.     }
  13.  
  14.     public int getNum2() {
  15.         return num2;
  16.     }    
  17. }


Código Java:
Ver original
  1. ......
  2.  
  3. Ficha ficha1 = new Ficha1(0, 1);
  4. Ficha ficha2 = new Ficha1(1,3);
  5. Ficha ficha3 = new Ficha1(3, 2);
  6. etc etc
  7.  
  8. ......
  9.  
  10. List<Ficha> fichas= new ArrayList<>();
  11. fichas.add(ficha1);
  12. fichas.add(ficha2);
  13. fichas.add(ficha3);
  14. ....
  15. Collections.suffle(fichas);
  16. ...
  17.  
  18. for (final Ficha  ficha : fichas) {
  19. // Repartes
  20. }

Espero que a partir de aqui sepas ya hacerlo.

Un saludo
Muchas gracias por el código, finalmente lo haré mediante objetos. A tu código he añadido esto:

Código:
public String toString() {   // Abre metodo toString
        return "["+num1+"|"+num2+"]";
}
Pero después de poner esta parte:

Código:
    Ficha ficha1 = new Ficha(0, 0);
    Ficha ficha2 = new Ficha(0, 1);
    Ficha ficha3 = new Ficha(0, 2);
    Ficha ficha4 = new Ficha(0, 3);
    Ficha ficha5 = new Ficha(0, 4);
    Ficha ficha6 = new Ficha(0, 5);
    Ficha ficha7 = new Ficha(0, 6);
    Ficha ficha8 = new Ficha(1, 1);
    Ficha ficha9 = new Ficha(1, 2);
    Ficha ficha10 = new Ficha(1, 3);
    Ficha ficha11 = new Ficha(1, 4);
    ....
Al añadir esta parte me sale error

Código:
    List<Ficha> fichas = new ArrayList<>();
    
    fichas.add(ficha1);
    fichas.add(ficha2);
    fichas.add(ficha3);
    ...
Y tampoco me deja añadir la línea del Collections a pesar de haber puesto al inicio el import java.util.*;
  #10 (permalink)  
Antiguo 30/04/2015, 12:26
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema java principante

Quizás sea porque es shuffle en lugar de suffle. Pero entiendo que eso es algo que puedes intuir por ti mismo.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #11 (permalink)  
Antiguo 01/05/2015, 09:18
 
Fecha de Ingreso: abril-2015
Mensajes: 6
Antigüedad: 9 años
Puntos: 0
Respuesta: Problema java principante

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Quizás sea porque es shuffle en lugar de suffle. Pero entiendo que eso es algo que puedes intuir por ti mismo.

Un saludo
Bueno creo que ya tengo hecho el tema de generar las fichas

Clase Ficha:

Código:
import java.util.*;

public class Ficha {      
    
    private int num1;
    private int num2;
 
    public Ficha(int num1, int num2) {   // Abre constructor
        this.num1 = num1;
        this.num2 = num2;
    }
 
    public int getNum1() {
        return num1;
    }
 
    public int getNum2() {
        return num2;
    }  
 
    public String toString() {   // Abre metodo toString
        return "["+num1+"|"+num2+"]";
    }
    
}

Clase MontonFichas

Código:
import java.util.ArrayList;
import java.util.Collections;

public class MontonFichas {
    
    Ficha ficha1 = new Ficha(0, 0);
    Ficha ficha2 = new Ficha(0, 1);
    Ficha ficha3 = new Ficha(0, 2);
    Ficha ficha4 = new Ficha(0, 3);
    Ficha ficha5 = new Ficha(0, 4);
    Ficha ficha6 = new Ficha(0, 5);
    Ficha ficha7 = new Ficha(0, 6);
    Ficha ficha8 = new Ficha(1, 1);
    Ficha ficha9 = new Ficha(1, 2);
    Ficha ficha10 = new Ficha(1, 3);
    Ficha ficha11 = new Ficha(1, 4);
    Ficha ficha12 = new Ficha(1, 5);
    Ficha ficha13 = new Ficha(1, 6);
    Ficha ficha14 = new Ficha(2, 2);
    Ficha ficha15 = new Ficha(2, 3);
    Ficha ficha16 = new Ficha(2, 4);
    Ficha ficha17 = new Ficha(2, 5);
    Ficha ficha18 = new Ficha(2, 6);
    Ficha ficha19 = new Ficha(3, 3);
    Ficha ficha20 = new Ficha(3, 4);
    Ficha ficha21 = new Ficha(3, 5);
    Ficha ficha22 = new Ficha(3, 6);
    Ficha ficha23 = new Ficha(4, 4);
    Ficha ficha24 = new Ficha(4, 5);
    Ficha ficha25 = new Ficha(4, 6);
    Ficha ficha26 = new Ficha(5, 5);
    Ficha ficha27 = new Ficha(5, 6);
    Ficha ficha28 = new Ficha(6, 6);
 
    public void barajar() {
        ArrayList<Ficha> fichas = new ArrayList<>();
 
        fichas.add(ficha1);
        fichas.add(ficha2);
        fichas.add(ficha3);
        fichas.add(ficha4);
        fichas.add(ficha5);
        fichas.add(ficha6);
        fichas.add(ficha7);
        fichas.add(ficha8);
        fichas.add(ficha9);
        fichas.add(ficha10);
        fichas.add(ficha11);
        fichas.add(ficha12);
        fichas.add(ficha13);
        fichas.add(ficha14);
        fichas.add(ficha15);
        fichas.add(ficha16);
        fichas.add(ficha17);
        fichas.add(ficha18);
        fichas.add(ficha19);
        fichas.add(ficha20);
        fichas.add(ficha21);
        fichas.add(ficha22);
        fichas.add(ficha23);
        fichas.add(ficha24);
        fichas.add(ficha25);
        fichas.add(ficha26);
        fichas.add(ficha27);
        fichas.add(ficha28);
 
        Collections.shuffle(fichas);   
 
        for(int i = 0; i < fichas.size(); i++) {
            System.out.println(fichas);
        }
    }
    
}

Pero sigo sin ser capaz de repartir las 7 fichas a cada jugador
  #12 (permalink)  
Antiguo 01/05/2015, 15:42
 
Fecha de Ingreso: diciembre-2011
Mensajes: 152
Antigüedad: 12 años, 4 meses
Puntos: 34
Respuesta: Problema java principante

Como ya comentaron no tiene nada de malo utilizar datos primitivos para cosas tan simples como una ficha de domino, aqui te dejo una implementacion algo mas sencilla.
Código Java:
Ver original
  1. package com.github.luischavez.snippet;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.Stack;
  6.  
  7. /**
  8.  *
  9.  * @author Luis Chávez <https://github.com/luischavez>
  10.  */
  11. public class Dominoes {
  12.  
  13.     public static final Float[] PIECES = {
  14.         0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f,
  15.         1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f,
  16.         2.2f, 2.3f, 2.4f, 2.5f, 2.6f,
  17.         3.3f, 3.4f, 3.5f, 3.6f,
  18.         4.4f, 4.5f, 4.6f,
  19.         5.5f, 5.6f,
  20.         6.6f
  21.     };
  22.  
  23.     private final Stack<Float> deck;
  24.  
  25.     public Dominoes() {
  26.         this.deck = new Stack<>();
  27.     }
  28.  
  29.     public void init() {
  30.         this.deck.addAll(Arrays.asList(Dominoes.PIECES));
  31.     }
  32.  
  33.     public void shuffle() {
  34.         Collections.shuffle(this.deck);
  35.     }
  36.  
  37.     public int count() {
  38.         return this.deck.size();
  39.     }
  40.  
  41.     public float pop() {
  42.         return this.deck.pop();
  43.     }
  44.  
  45.     public static int spots1(float value) {
  46.         int spots = Float.valueOf(value).intValue();
  47.         if (0 > spots || 6 < spots) {
  48.             throw new RuntimeException("Invalid spots number: " + value);
  49.         }
  50.         return spots;
  51.     }
  52.  
  53.     public static int spots2(float value) {
  54.         int spots = Math.round((value - Dominoes.spots1(value)) * 10);
  55.         if (0 > spots || 6 < spots) {
  56.             throw new RuntimeException("Invalid spots number: " + value);
  57.         }
  58.         return spots;
  59.     }
  60.  
  61.     public static void main(String[] args) {
  62.         Dominoes dominoes = new Dominoes();
  63.         dominoes.init();
  64.         dominoes.shuffle();
  65.         while (0 < dominoes.count()) {
  66.             float piece = dominoes.pop();
  67.             System.out.printf("%.1f = [%d|%d]\n", piece, Dominoes.spots1(piece), Dominoes.spots2(piece));
  68.         }
  69.     }
  70. }

Para asignar las fichas a cada jugador puedes crear un mapa donde almacenes el numero del jugador y el arreglo con las fichas de ese jugador, por ejemplo:
Código Java:
Ver original
  1. Map<Integer, Float> players = ...;
  2. float[] pieces = ...;
  3. players.put(1, pieces);
  #13 (permalink)  
Antiguo 06/05/2015, 09:57
 
Fecha de Ingreso: junio-2009
Mensajes: 101
Antigüedad: 14 años, 10 meses
Puntos: 13
Respuesta: Problema java principante

Código Java:
Ver original
  1. public class Ficha {
  2.     private final int num1;
  3.     private final int num2;
  4.  
  5.     public Ficha(int num1, int num2){
  6.         assert num1 <= num2;
  7.        
  8.         this.num1 = num1;
  9.         this.num2 = num2;
  10.     }
  11.    
  12.     public getNum1(){
  13.         return this.num1;
  14.     }
  15.    
  16.     public getNum2(){
  17.         return this.num2;
  18.     }
  19. }

Código Java:
Ver original
  1. public void run(){
  2.    
  3. //Creando fichas:
  4.     Ficha fichas = new Ficha[28];
  5.     int k = 0;
  6.     for(int i = 0; i <= 6; i++){
  7.         for(int j = i; j <= 6; j++){
  8.             fichas[k] = new Ficha(i,j);
  9.             k++;
  10.         }
  11.     }
  12.  
  13. }

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:44.