Ha llegado el gran momento: combinar el tablero y la ficha activa. Esto implica fundamentalmente dos cosas:
- A la hora de pintar y borrar la ficha activa hay que tener en cuenta que su posición (columna, fila) es con relación al tablero, es decir, para conocer su posición absoluta con relación a la pantalla habrá que tener en cuenta la posición del tablero dentro de la pantalla.
- A la hora de mover y rotar la ficha activa, antes hay que verificar si ese movimiento o rotación es posible, ya que ahora podría ocurrir que nos saliéramos de los límites del tablero (y más adelante que pisáramos otras fichas o restos de fichas).
Pues bien, esto se plasma en los siguientes cambios:
Ficheros tetris_ficha.h y tetris_ficha.c:
El primer cambio tiene que ver con la función ficha_incializa(). Ya no vamos a inicializar la ficha al centro de la pantalla, sino al centro de la parte superior del tablero (ficha_c = TABLERO_MAX_C/2, ficha_f = 1).
El segundo cambio tiene que ver con el pintado y el borrado de las fichas. Como la posición (ficha_c, ficha_f) es relativa al tablero, hay que tener en cuenta que el tablero se pinta en (TABLERO_X0, TABLERO_Y0) para hacer la conversión de (columna, fila) a (x, y). Esto se puede ver en ficha_pinta() y en ficha_borra():

Por último, el cambio más importante es el que tiene que ver con la aparición de las funciones:
- ficha_verifica_izquierda().
- ficha_verifica_derecha().
- ficha_verifica_abajo().
- ficha_verifica_arriba().
- ficha_verifica_rotacion_derecha().
- ficha_verifica_rotacion_izquierda().
Las cuatro primeras tienen que ver con verificar si el movimiento es posible. Y las dos últimas tienen que ver con verificar si la rotación es posible. Pero, en el fondo, todas siguen el mismo esquema:
- Recorrer los cuatro bloques de la ficha.
- Calcular su nueva posición si el movimiento o rotación tuviera lugar.
- Verificar que la nueva (columna, fila) del bloque caería dentro de los límites del tablero.
Más adelante mejoraremos estas funciones para tener en cuenta también si el movimiento o rotación implicarían pisar otras fichas o restos de fichas. Pero de momento nos vale con esto.
A modo de ejemplo, ficha_verifica_izquierda() es así:

Ficheros tetris_tablero.h y tetris_tablero.c:
En estos ficheros apenas hay cambios. Se trata, simplemente, de dejar de pintar el borde superior del tablero (se comenta esa línea):

Fichero tetris_main.c:
En este fichero hay varios cambios. En primer lugar, en la función inicializa() el tablero ya se inicializa vacío, no con contenido, y se recupera la inicialización y el pintado de la ficha activa.
En segundo lugar, en la función actualiza_ficha(), los movimientos y rotaciones van precedidos por las verificaciones oportunas, es decir, por llamadas a las funciones ficha_verifica_*() correspondientes.

Por último, en el bucle de juego recuperamos la llamada a actualiza_ficha(), porque ahora volvemos a querer que se lea el joystick 2 y que se mueva y rote la ficha según corresponda (previa verificación, claro).
Resultado:
El resultado es algo así:

Es decir, ya es posible mover y rotar la ficha dentro del tablero. De momento, sólo se respetan los límites del tablero. Más adelante habrá que respetar otras limitaciones, como no pisar fichas o restos de fichas, pero para hacer eso antes será preciso empezar a acumular las fichas.
Código de ejemplo: tetris05.zip
