Se trata de realizar un programa en java que simule el juego de las cuatro en raya.
En dicho juego, juegan dos jugadores. El primer jugador elige el color de las fichas y empieza el juego. En cada turno el jugador elegirá una columna que no esté llena en la que depositar su ficha. La ficha caerá por el tablero vertical hasta posarse en el fondo o encima de la última ficha que haya. Gana el juego el jugador que consiga alinear cuatro fichas, de su color bien sea en horizontal, vertical o diagonal. El programa detectará la jugada ganadora e informará del nombre del ganador.
En las siguientes imágenes muestro una salida de la ejecución del programa que debes realizar:
En este repositorio he creado un esqueleto de proyecto gradle que ya lleva incluidos todos los test necesarios que el programa debe pasar. Notar que a la hora de realizar las explicaciones del enunciado se ha supuesto que la posición [0, 0] del array es la esquina inferior izquierda.
Para ello te muestro un diagrama de clases para el mismo y poco a poco te iré explicando los diferentes pasos a realizar:
- Lo primero que debes hacer es un fork de este repositorio.
- Clona tu repositorio remoto recién copiado en GitHub a un repositorio local que será donde irás realizando lo que a continuación se te pide. Modifica el archivo
README.mdpara que incluya tu nombre en el apartado "Alumno". - Realiza tu primer commit.
- Debes implementar el enumerado
Fichacon los valoresVERDEyAZUL.
- La clase
Casillatendrá un atributo del tipoFicha. - Crea los métodos
getyset, con la visibilidad indicada, que deberán hacer las comprobaciones necesarias o lanzar la excepción adecuada. - Crea el
constructor por defectoque inicialmente pondrá el atributo ficha anull. - Crea el método
estaOcupadaque devolverátrueofalse, dependiendo de si la casilla contiene una ficha o no. - Crea el método
toStringque mostrará la inicial del valor de la ficha o un espacio en blanco si esta no está ocupada. Este método debe utilizar el método format de la claseStringpara generar la salida del mismo.
- El registro
Jugadortendrá dos atributos: uno del tipoStringpara el nombre del jugador y otro del tipoFichapara almacenar el color de las fichas del jugador. - Crea los métodos
validarNombreyvalidarColorFichas, con la visibilidad indicada, que deberán hacer las comprobaciones necesarias o lanzar la excepción adecuada. - Sobreescribe
constructor canónicopara que haga uso de los métodosvalidarXpara validar el valor a los atributos. - Crea el método
toStringque imprimirá el nombre y el color de las fichas del jugador. Este método debe utilizar el métodoformatde la claseStringpara generar la salida del mismo.
- La clase
Tablerotendrá tres constantes para indicar el número de filas (6), el número de columnas (7) y el número de fichas consecutivas en línea para ganar. También tendrá como atributo un array bidimensional de objetos del tipoCasilla. - Crea el
constructor por defectoque inicializará correctamente el array bidimensional de casillas. - Crea el método
columnaVaciaque devolverátrueofalsedependiendo que la columna pasada por parámetro esté vacía o no. - Crea el método
estaVacioque devolverátrueofalsedependiendo de que el tablero esté vacío o no. Este método hará uso del método anteriormente creado. - Crea el método
columnaLlenaque devolverátrueofalsedependiendo que la columna pasada por parámetro esté llena o no. - Crea el método
estaLlenoque devolverátrueofalsedependiendo de que el tablero esté lleno o no. Este método hará uso del método anteriormente creado. - Crea el método
comprobaFichaque lanzará una excepción si el parámetro pasado no es correcto. - Crea el método
comprobarColumnaque lanzará una excepción si el parámetro pasado no es correcto. - Crea el método
getPrimeraFilaVaciaque devolverá la primera fila vacía para la columna pasada por parámetro. - Crea el método
objetivoAlcanzadoque aceptará como parámetro el número de fichas consecutivas que llevamos en una de las comprobaciones (horizontal, vertical, diagonalNE o diagonalNO) y devolverátrueofalsesi el parámetro pasado es mayor o igual que la constante definida en la clase para las fichas conscutivas necesarias. - Crea el método
comprobarHorizontalque aceptará la fila y la ficha para la que queremos comprobar si hay cuatro fichas del mismo color seguidas en horizontal. - Crea el método
comprobarVerticalque aceptará la columna y la ficha para la que queremos comprobar si hay cuatro fichas del mismo color seguidas en vertical. - Crea el método
menorque recibirá dos enteros y devolverá el menor de ellos. - Crea el método
comprobarDiagonalNEque recibirá como parámetros la fila, la columna y la ficha para la que queremos comprobar si hay cuatro fichas del mismo color seguidas en la diagonal que va desde abajo a la izquierda hasta arriba a la derecha pasando por la casilla indicada por la fila y la columna. Para ayudarte, te indico que debes calcular el desplazamiento como el mínimo entre la fila y la columna pasadas. Luego calcularás la fila inicial como la fila pasada menos el desplazamiento y la columna inicial como la columna pasada menos el desplazamiento. Luego realizarás un bucle que empiece en la fila inicial y la columna inicial y termine cuando lleguemos al límite de las filas o de las columnas, e irá incrementando en uno la fila y la columna (las variables de control del bucle) y cuente cuántas fichas de ese color hay seguidas. Devolverátruesi las fichas seguidas contadas es igual a 4. - Crea el método
comprobarDiagonalNOque recibirá como parámetros la fila, la columna y la ficha para la que queremos comprobar si hay cuatro fichas del mismo color seguidas en la diagonal que va desde abajo a la derecha hasta arriba a la izquierda pasando por la casilla indicada por la fila y la columna. Para ayudarte, te indico que debes calcular el desplazamiento como el mínimo entre la fila y, el número total de columnas menos 1 menos la columna pasada. Luego calcularás la fila inicial como la fila pasada menos el desplazamiento y la columna inicial como la columna pasada más el desplazamiento. Luego realizarás un bucle que empiece en la fila inicial y la columna inicial y termine cuando lleguemos al límite de las filas o 0 para las columnas, e irá incrementando en uno la fila y decrementando en uno la columna (las variables de control del bucle) y cuente cuántas fichas de ese color hay seguidas. Devolverátruesi las fichas seguidas contadas es igual a 4. - Crea el método
comprobarTiradaque aceptará como parámetros la fila, la columna y la ficha de la última tirada para comprobar si es ganadora o no. Este método hará uso de los métodoscomprobarXXXanteriormente definidos. - Crea el método
introducirFichaque aceptará como parámetros la columna en la que queremos introducir la ficha y la ficha a introducir y devolverá true o false dependiendo de si la jugada ha sido ganadora o no (hemos conseguido cuatro en raya o no). Este método deberá comprobar la validez de los parámetros pasados o lanzar la excepción correspondiente. También podrá lanzar una excepción indicando que la columna en la que queremos introducir la ficha está llena. Para ello este método hará uso de los métodos anteriormente creados. - Crea el método
toStringque haciendo uso de la claseStringBuilderdevuelva la representación del tablero que has visto en las imágenes anteriores.
- Crea el
contsructoradecuado para evitar que se puedan crear instancias de esta clase, ya que, será una clase de utilidades. - Crea el método
leerNombreque leerá el nombre del jugador mientras este sea válido. - Crea el método
elegirColorFichasque leerá el color de una ficha mientras este no sea válido. - Crea el método
leerJugadorque, sin aceptar parámetros, leerá el nombre del primer jugador y el color de sus fichas y lo devolverá. - Crea el método
leerJugadorque, aceptando como parámetro una ficha, leerá el nombre del segundo jugador y devolverá dicho jugador con el color de ficha pasado por parámetro. - Crea el método
leerColumnaque recibirá como parámetro el jugador que debe introducir la columna para una tirada y devolverá un entero representando la columna elegida. El método imprimirá el nombre del jugador y le indicará que elija la columna en la que quiere introducir su ficha y esto lo repetirá mientras la columna elegida no sea válida.
- La clase
CuatroEnRayatendrá una constante para indicar el número de jugadores (2), un atributo que será un array de objetos del tipoJugadory otro atributo de la claseTablero. - Crea el
constructor con parámetrosal que le pasaremos como parámetros dos instancias del tipo Jugador representando a cada uno de los jugadores. Deberá hacer las comprobaciones adecuadas o lanzar la excepción adecuada. También deberá crear correctamente el array de jugadores e incializarlo y crear la instancia de la clase Tablero. - Crea el método
tirarque recibirá como parámetro el jugador que va a tirar y devolverá true o false indicando si esa jugada ha resultado ganadora o no. Para ello leerá la columna en la que el jugador quiere introducir la ficha llamando al método correcto de la clase Consola y llamará al método introducirFicha de la clase Tablero que devolverá si la jugada ha sido ganadora o no, o lanzará una excepción indicando que la columna está llena, la cual debemos capturar para informar al jugador y volver a repetir el proceso mientras no se introduzca una fila que no esté llena o la jugada haya resultado ganadora. - Crea el método
jugarque repetirá, mientras queden casillas libres y no haya ganador, la acción de tirar alternando los jugadores en cada iteración. Al terminar informará de quién ha ganado o que no hay más casillas libres.
- Crea el método
mainque creará los jugadores, creará una instancia de CuatroEnRaya con ambos jugadores y los pondrá a jugar.
- La indentación debe ser correcta en cada uno de los apartados.
- Los identificadores utilizados deben ser adecuados y descriptivos.
- Se debe utilizar la clase
Entradapara realizar la entrada por teclado que se encuentra como dependencia de nuestro proyecto en la libreríaentrada. - El programa debe pasar todas las pruebas que van en el esqueleto del proyecto y toda entrada del programa será validada, para evitar que el programa termine abruptamente debido a una excepción.
- La corrección ortográfica tanto en los comentarios como en los mensajes que se muestren al usuario.



