Monday, June 11, 2018

Segundo intento: 3+3

A ver si me sirve de algo lo aprendido en la carrera. El primer paso se supone que tiene que ser una descripción mediante lenguaje natural:

El juego se compone de un espacio compuesto por cuatro casillas de ancho y cuatro de alto. Las casillas están rodeadas por un borde.
Al principio, dos de éstas casillas aparecen ocupadas por dos fichas con los valores 1 y 2 respectivamente. La ubicación es aleatoria.
Pulsar cualquier tecla de dirección resulta en que las fichas que estén ya en el tablero se muevan en la dirección elegida. A continuación, se crea en alguno de los espacios libres una ficha nueva. El número que aparece en la ficha depende del último número que apareció: Puede ser un 1 o un 2 y se van alternando.
Si, a consecuencia de un movimiento, se produce una colisión entre fichas, sucederá lo siguiente:
- Si las fichas son de distinto valor o si son del mismo valor y valen 1 o 2, entonces el desplazamiento de aquellas fichas que así colisionen no se produce.
- Si las fichas son del mismo valor y no son 1 o 2 o si las fichas son de distinto valor, valiendo una de las fichas 1 y la otra 2, se fusionan:
La fusión consiste en que, desde el final tomando como referencia la dirección escogida, las dos fichas a fusionar desaparecen y se convierten en una sola por el valor de la suma de 1+2 o por la suma de las dos fichas iguales según corresponda. Esta nueva ficha se situará una casilla por delante en la dirección señalada si existe espacio para ello. En otro caso, se fusionarán ocupando la casilla más cercana al extremo al que apunta la dirección.

Algunos métodos que pueden necesitarse:

void crearFicha()
Dependerá del estado de una variable interna de tablero, que señala si la próxima ficha valdrá 1 o 2. Este método es llamado dos veces cuando se instancia el tablero. Y dependerá de:

boolean estaOcupada(int fila, int columna)
Para poder saber si una casilla está ocupada, podemos obtener la información de dos formas: O que exista en el tablero un registro de casillas o que se busque entre las fichas aquellas que ocupan una determinada posición. Para los movimientos posteriores, creo que una buena idea podría ser la siguiente:
El tablero contiene casillas y las casillas contienen coordenadas y fichas. Para conocer el resultado de esta función, sólo tenemos que entrar en el tablero y preguntar a la casilla si contiene o no una ficha.





public void moverDerecha()


Creo que puede ser interesante desglosar el movimiento por cada dirección en un principio para ver si funciona. Hay que tener en cuenta que la fusión entre fichas afecta y mucho al movimiento. Así que debemos realizar el movimiento en dos pasadas:
Una pasada de fusión.
Una pasada de movimiento propiamente dicho.
En la pasada de fusión recorremos desde el final al principio, en el sentido contrario a la dirección escogida y realizamos las distintas fusiones: Si en la misma línea y en la posición inmediatamente anterior a una determinada ficha existe otra con la que le es posible fusionarse, eliminamos las dos fichas y creamos una nueva en la casilla que estábamos recorriendo (Los movimientos se harán en la segunda pasada). Actualizamos los valores del tablero para reflejar que la ficha anterior a aquella con la que nos fusionamos ya no existe, por lo que no debemos tenerla más en cuenta para futuras fusiones. Pongamos este caso:
1 2 1 2
El resultado de este movimiento sería el siguiente:
0 3 0 3
En la segunda pasada, la del movimiento, nos limitaremos a desplazar todas las fichas que puedan desplazarse en la dirección indicada, desde el principio al fin:
0 0 3 3
Resulta importante que la matriz que contenga las fichas sea bidimensional, para que podamos comprobar más fácilmente los bordes.

Cuando no quede ningún espacio en blanco en el tablero, la partida se dará por perdida.