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 colocada. 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 siguiente imágenes muestro una salida de la ejecución del programa que debes realizar:
He subido a GitHub un esqueleto de proyecto gradle que ya lleva incluidos todos los test necesarios que el programa debe pasar. La URL del repositorio es la siguiente: repositorio GitHub con el esqueleto del proyecto.
Para ello te muestro un diagrama de clases para el mismo y poco a poco te iré explicando los diferentes pasos a realizar:
Tus tareas van a consistir en:
- Creación del enumerado
Ficha
- Debes implementar el enumerado
Ficha
con los valoresVERDE
yAZUL
.
- Debes implementar el enumerado
- Creación de la clase
Casilla
:- La clase
Casilla
tendrá un atributo del tipoFicha
. - Crea los métodos
get
yset
, con la visibilidad indicada, que deberán hacer las comprobaciones necesarias o lanzar la excepción adecuada. - Crea el
constructor por defecto
que inicialmente pondrá el atributo ficha anull
. - Crea el método
estaOcupada
que devolverátrue
ofalse
, dependiendo de si la casilla contiene una ficha o no. - Crea el método
toString
que mostrará la inicial del valor de la ficha o un espacio en blanco si ésta no está ocupada. Este método debe utilizar el método format de la claseString
para generar la salida del mismo.
- La clase
- Creación de la clase
Jugador
:- La clase
Jugador
tendrá dos atributos: uno del tipoString
para el nombre del jugador y otro del tipoFicha
para almacenar el color de las fichas del jugador. - Crea los métodos
get
yset
, con la visibilidad indicada, que deberán hacer las comprobaciones necesarias o lanzar la excepción adecuada. - Crea el
constructor con parámetros
que hará uso de los métodosset
para asignar valor a los atributos. - Crea el método
toString
que imprimirá el nombre y el color de las fichas del jugador. Este método debe utilizar el métodoformat
de la claseString
para generar la salida del mismo.
- La clase
- Creación de la clase
Tablero
:- La clase
Tablero
tendrá 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 defecto
que inicializará correctamente el array bidimensional de casillas. - Crea el método
columnaVacia
que devolverátrue
ofalse
dependiendo que la columna pasada por parámetro esté vacía o no. - Crea el método
estaVacio
que devolverátrue
ofalse
dependiendo de que el tablero esté vacío o no. Este método hará uso del método anteriormente creado. - Crea el método
columnaLlena
que devolverátrue
ofalse
dependiendo que la columna pasada por parámetro esté llena o no. - Crea el método
estaLleno
que devolverátrue
ofalse
dependiendo de que el tablero esté lleno o no. Este método hará uso del método anteriormente creado. - Crea el método
comprobaFicha
que lanzará una excepción si el parámetro pasado no es correcto. - Crea el método
comprobarColumna
que lanzará una excepción si el parámetro pasado no es correcto. - Crea el método
getPrimeraFilaVacia
que devolverá la primera fila vacía para la columna pasada por parámetro. - Crea el método
objetivoAlcanzado
que aceptará como parámetro el número de fichas consecutivas que llevamos en una de las comprobaciones (horizontal, vertical, diagonalNE o diagonalNO) y devolverá true o false si el parámetro pasado es mayor o igual que la constante definida en la clase para la fichas conscutivas necesarias. - Crea el método
comprobarHorizontal
que 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
comprobarVertical
que 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
menor
que recibirá dos enteros y devolverá el menor de ellos. - Crea el método
comprobarDiagonalNE
que 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 inicial como el mínimo entre la fila y la columna pasadas. Luego calcularás la fila inicial como la fila pasada menos el desplazamiento inicial y la columna inicial como la columna pasada menos el desplazamiento inicial. Luego realizarás un bucle que empezando en la fila inicial y la columna inicial y terminando cuando lleguemos al límite de las filas o de las columnas, incremente en uno la fila y la columna (las variables de control del bucle) y cuente cuántas fichas de ese color hay seguidas. Devolverátrue
si las fichas seguidas contadas es igual a 4. - Crea el método
comprobarDiagonalNO
que 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 inicial 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 inicial y la columna inicial como la columna pasada más el desplazamiento inicial. Luego realizarás un bucle que empezando en la fila inicial y la columna inicial y terminando cuando lleguemos al límite de las filas o 0 para las columnas, incremente en uno la fila y decremente en uno la columna (las variables de control del bucle) y cuente cuántas fichas de ese color hay seguidas. Devolverátrue
si las fichas seguidas contadas es igual a 4. - Crea el método
comprobarTirada que 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étodos
comprobarXXX` anteriormente definidos. - Crea el método
introducirFicha
que 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 fila 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
toString
que haciendo uso de la claseStringBuilder
devuelva la representación del tablero que has visto en las imágenes anteriores.
- La clase
- Creación de la clase
Consola
:- Crea el
contsructor
adecuado para evitar que se puedan crear instancias de esta clase ya que será una clase de utilidades. - Crea el método
leerNombre
que leerá el nombre del jugador mientras este sea válido. - Crea el método
elegirColorFichas
que leerá el color de una ficha mientras éste no sea válido. - Crea el método
leerJugador
que, sin aceptar parámetros, leerá el nombre del primer jugador y el color de sus fichas y lo devolverá. - Crea el método
leerJugador
que, 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
leerColumna
que 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.
- Crea el
- Creación de la clase
CuatroEnRaya
:- La clase
CuatroEnRaya
tendrá una constante para indicar el número de jugadores (2), un atributo que será un array de objetos del tipoJugador
y otro atributo de la claseTablero
. - Crea el
constructor con parámetros
al 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
tirar
que 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 fila 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
jugar
que 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.
- La clase
- Creación de la
MainApp
:- Crea el método
main
que creará los jugadores, creará una instancia de CuatroEnRaya con ambos jugadores y los pondrá a jugar.
- Crea el método
- La indentación debe ser correcta en cada uno de los apartados.
- El nombre de las variables debe ser adecuado.
- Se debe utilizar la clase Entrada para realizar la entrada por teclado.
- 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. Además, que ni decir tiene, el programa no debe contener ningún error léxico, sintáctico. de depencias, etc.
- La corrección ortográfica tanto en los comentarios como en los mensajes que se muestren al usuario.