Autor Tema: Java juego con tablero quarto crear línea de cuatro piezas por turnos dos jugado  (Leído 1885 veces)

yromanova

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Hola, espero que estén muy bien de salud.

Una pregunta, estoy haciendo un video juego en java, desde el IDE Neatbeans, el cual se llama quarto, en el que consiste en El área de juego es un tablero con 16 casillas dispuestas en forma de cuadrado de 4x4. En cada turno, el jugador recibe una pieza escogida por el adversario y seguidamente debe colocarla en cualquier posición libre del tablero.

La regla básica es conformar una línea de cuatro piezas con una característica
común. Además, las líneas de 4 piezas pueden ser horizontales, verticales o
diagonales.

Las posibles líneas para ganar son las siguientes:

• Cuatro piezas claras (usted elige el color).
• Cuatro piezas oscuras (usted elige el color).
• Cuatro piezas pequeñas.
• Cuatro piezas grandes.
• Cuatro piezas redondas.
• Cuatro piezas cuadradas.
• Cuatro piezas huecas en el centro.
• Cuatro piezas rellenas en el centro

Bueno el punto es cómo puedo validar las dichas para que aparezca el ganador, ya que son distintas, he pensado en un arreglo pero se me torna un tanto complicado, los componentes que se usan son los que ofrece el menú del Frame, espero su respuesta, gracias.
« Última modificación: 12 de Marzo 2022, 14:54 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Juego con un tablero
« Respuesta #1 en: 10 de Octubre 2021, 14:09 »
Buff.. Interesante pero complicado.

Tengo una duda. Si tengo una fila de por ejemplo dos piezas redondas y dos cuadradas, pero las cuatro son claras... ¿sería una combinación ganadora?

Es decir, ¿basta con que coincidan todas en una sola característica?


En ese caso podemos crear una clase Pieza donde cada característica sea un atributo.

En ese enunciado se mencionan 8 características, pero en realidad serían solo 4 porque son características opuestas.
Una pieza o es redonda, o es cuadrada, no puede ser ambas cosas a la vez.
O es grande, o es pequeña.
O es clara, o es oscura.
etc...

Así que la clase Pieza, para comenzar, solo tendría 4 atributos que pueden ser de tipo boolean.
Código: [Seleccionar]
public class Pieza {

public boolean esClara;
public boolean esGrande;
public boolean esRedonda;
public boolean esHueca;

public Pieza(boolean esClara, boolean esGrande, boolean esRedonda, boolean esHueca) {
this.esClara = esClara;
this.esGrande = esGrande;
this.esRedonda = esRedonda;
this.esHueca = esHueca;
}

}

Si por ejemplo el atributo esClara tiene valor true, pues que la pieza es clara. Si tiene valor false, es que es oscura.
Es muy simple, no tiene mayor misterio.

Ahora hay que pensar en como modelar una combinación de 4 piezas, y poder discernir si es una combinación GANADORA o no.
Será GANADORA si todas las piezas coinciden en al menos uno de esos cuatro atributos.

Podemos hacer una clase llamada Combinacion con un array de 4 piezas.
Este array lo recibe por el constructor. Luego según la necesidades del programa, se puede hacer que las piezas se reciban por algún setter, eso ya verás tú lo que necesites..

Una vez tenemos ese array, podemos hacer distintos métodos, uno por cada atributo, que se encarguen de comprobar si las piezas coinciden en ese atributo en concreto.
Serán métodos boolean, que devolverán true si todas coinciden en su atributo o false si no es así.

Un último método comprobará si alguno de estos métodos devuelve true, lo cuál significará que la combinación es GANADORA.

A esta clase le pongo un main() para poder testear combinaciones de piezas a a ver si funciona bien la clase:
Código: [Seleccionar]
public class Combinacion {

private Pieza[] piezas;

public Combinacion(Pieza[] piezas) {
this.piezas = piezas;
}

/**
* Indica si esta combinación de piezas es <u>Ganadora</u>.<br>
* Una combinación es <u>Ganadora</u> si todas las piezas tiene al menos
* una característica en común.
* @return <i>True</i> si es Ganadora, <i>False</i> en caso contrario.
*/
public boolean esGanadora() {
return compruebaPrimerAtrib() || compruebaSegundoAtrib()
|| compruebaTercerAtrib() || compruebaCuartoAtrib();
}

/**
* Comprueba si todas las piezas coinciden en el primer
* atributo, es decir, si todas son <b>CLARAS</b> o
* si todas son <b>OSCURAS</b>.
* @return <i>True</i> si todas coinciden en el primer
* atributo, <i>False</i> en caso contrario.
*/
private boolean compruebaPrimerAtrib() {
//La primera pieza establece el valor con el que debemos comparar.
boolean primera = piezas[0].esClara;
//Recorremos resto de piezas
for (int i = 1; i < piezas.length; i++)
if (piezas[i].esClara != primera)
return false; //Hemos encontrado una diferencia, retornamos false

/*
* Si el bucle FOR termina sin haber retornado false, es que
* todas las piezas coinciden en el primer atributo.
* Por tanto, retornamos true.
*/
return true;
}

/**
* Comprueba si todas las piezas coinciden en el segundo
* atributo, es decir, si todas son <b>GRANDES</b> o
* si todas son <b>PEQUEÑAS</b>.
* @return <i>True</i> si todas coinciden en el segundo
* atributo, <i>False</i> en caso contrario.
*/
private boolean compruebaSegundoAtrib() {

boolean primera = piezas[0].esGrande;

for (int i = 1; i < piezas.length; i++)
if (piezas[i].esGrande != primera)
return false;

return true;
}

/**
* Comprueba si todas las piezas coinciden en el tercer
* atributo, es decir, si todas son <b>REDONDAS</b> o
* si todas son <b>CUADRADAS</b>.
* @return <i>True</i> si todas coinciden en el tercer
* atributo, <i>False</i> en caso contrario.
*/
private boolean compruebaTercerAtrib() {

boolean primera = piezas[0].esRedonda;

for (int i = 1; i < piezas.length; i++)
if (piezas[i].esRedonda != primera)
return false;

return true;
}

/**
* Comprueba si todas las piezas coinciden en el cuarto
* atributo, es decir, si todas son <b>HUECAS</b> o
* si todas son <b>RELLENAS</b>.
* @return <i>True</i> si todas coinciden en el cuarto
* atributo, <i>False</i> en caso contrario.
*/
private boolean compruebaCuartoAtrib() {

boolean primera = piezas[0].esHueca;

for (int i = 1; i < piezas.length; i++)
if (piezas[i].esHueca != primera)
return false;

return true;
}

//Para testear combinaciones
public static void main(String[] args) {
//Array de piezas
Pieza[] pzs = new Pieza[4];
pzs[0] = new Pieza(true, false, false, true);
pzs[1] = new Pieza(false, false, false, true);
pzs[2] = new Pieza(true, true, false, true);
pzs[3] = new Pieza(true, false, true, false);

Combinacion combi = new Combinacion(pzs);

System.out.println(combi.esGanadora()?"Ganadora":"No ganadora");

}

}

En ese main he creado una combinación que NO es GANADORA, y así lo detecta el programa.

Si probamos a cambiarla por esta otra, donde todas son HUECAS, entonces sí declara la combinación como GANADORA:
Código: [Seleccionar]
Pieza[] pzs = new Pieza[4];
pzs[0] = new Pieza(true, false, false, true);
pzs[1] = new Pieza(false, false, false, true);
pzs[2] = new Pieza(true, true, false, true);
pzs[3] = new Pieza(true, false, true, true);


Creo que así hemos encontrado una forma de comparar piezas para decidir si una combinación de 4 de ellas, es ganadora.

Esto sería a nivel de "Modelo", es decir, modelando objetos que no se ven en pantalla.

Ya tendrás que adaptarlo a lo que tu estés haciendo a nivel de "Vista". No se como estarás representando las piezas en pantalla, aunque no importa demasiado, esta parte del "Modelo" vendría a ser igual.
« Última modificación: 10 de Octubre 2021, 14:12 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

yromanova

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: Juego con un tablero
« Respuesta #2 en: 11 de Octubre 2021, 06:29 »
Es que el juego es un poco parecido al juego gato, pero este tiene distintas maneras de ganar, por ejemplo si hay una fica de ficha huecas ya sean redondas o cuadras pueden ganar, ya que algunas fichas cuadradas tiene las caracteristicas de ser hueca, tambien puede ser si hay una fila de cuadradas de distinto color tambien se puede ganar, tiene muchas formas de ganar.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".