Colapsar filas llenas

La gracia de casi todo juego es ganar puntos y, en el Tetris, los puntos se ganan llenando filas. Esto nos lleva a la necesidad de detectar y colapsar las filas llenas y, asociado a esta necesidad, se deriva que necesitaremos algún tipo de contador o variable de líneas y puntos.

Es importante tener en cuenta, además, que en el Tetris se puede colapsar una línea, o dos, o tres o cuatro a la vez (más de cuatro no es posible) y, cuantas más líneas se llenen / colapsen de golpe, más puntos se ganan.

Variables de filas llenas y puntos:

A estas alturas del proyecto tenemos los ficheros:

  • tetris_ficha.h y tetris_ficha.c.
  • tetris_joystick.h y tetris_joystick.c.
  • tetris_tablero.h y tetris_tablero.c.
  • tetris_random.h y tetris_random.c.
  • tetris_main.c.

¿En cuál de estos ficheros encajarían mejor las nuevas variables para llevar control de las líneas llenas y los puntos? Pues no está muy claro… Con los ficheros relativos a la ficha no las veo, ya que no son características de la ficha, ni están directamente relacionadas con ella. Con el joystick por descontado que no. Con el tablero podría ser, aunque de forma un poco indirecta, por aquello de que todo se acaba pintando en el tablero. Con los números aleatorios nada que ver. Y con el programa principal podría ser…

En definitiva, hay dos candidatos para ubicar estas nuevas variables. Inicialmente (esta entrada), decidí ubicarlas en el tablero. Más adelante revisaré esa decisión.

Sea como fuere, aquí las tenéis en tetris_tablero.c:

La primera variable, líneas, servirá para contar las líneas llenas. Y la segunda, puntos, servirá para llevar control de los puntos ganados. La relación entre ellas no es directa, puesto que, si se llenan varias líneas de golpe, se ganarán más puntos que línea a línea.

Estas variables tienen su inicialización (función tablero_inicializa_puntos()) y su función de pintado (función tablero_pinta_puntos()).

Detectar filas llenas:

Ahora que tenemos dónde controlar las líneas llenas, lo siguiente es detectarlas. Las líneas no se pueden llenar en cualquier momento, sino sólo cuando cae y se acumula una ficha, ya sea sobre el fondo o sobre otras fichas o restos. Es decir, en esta parte del código (fichero tetris_main.c):

Por eso ahora, cuando la ficha ya no puede caer más y se copia al tablero, además de lo anterior, se llama a la nueva función tablero_filas_llenas(), que detecta si hay filas llenas en el tablero (fichero tetris_tablero.c):

Lo que hace esta función es recorrer el tablero por filas y, dentro de cada fila, por columnas. Si una columna está vacía, entonces esa fila ya no puede estar llena, y pasa a la siguiente fila. Por el contrario, si todas las columnas de la fila están llenas, entonces la fila también lo está.

Además, si detecta que la fila está llena, colapsa la fila con la nueva función tablero_colapsa_fila() y vuelve a pintar el tablero.

Por último, incrementa las variables de líneas y puntos y las pinta. En principio, se reciben 10 puntos por línea, pero si se llenan / colapsan dos líneas de golpe, se reciben 40 puntos. Esto es así porque la fórmula implementada es:

puntos = 10 * líneas^2

Colapsar filas llenas:

Para colapsar las filas llenas se usa la nueva función tablero_colapsa_fila():

Esta función recibe como parámetro la fila a colapsar, y lo que hace es recorrer todas las filas desde esa hasta la primera, copiando en cada fila la fila que está justo encima. En resumen, las tira hacia abajo o colapsa.

Resultado:

El resultado es difícil de captar en una foto, porque es algo dinámico (se llena una fila y se colapsa). Se capta más fácilmente en un vídeo.

En todo caso, lo que sí es patente es que ya tenemos contador de líneas, de puntos, y que los vamos incrementando según se llenan filas.


Código de ejemplo: tetris09.zip

Deja un comentario