En esta entrada nos planteamos dos objetivos nuevos:
- Que las fichas se pinten en su color desde que aparecen.
- Que las fichas que van surgiendo sean aleatorias, tanto en lo que respecta al tipo como a su rotación y posición.
Ambos objetivos se describen a continuación.
Ficheros tetris_ficha.h y tetris_ficha.c:
El primer objetivo es fácil de conseguir. Simplemente consiste en mejorar la función ficha_pinta() para activar el color de la ficha, que depende de su tipo. Recordemos que hace ya varias entradas quitamos la variable ficha_color para vincular el color de la ficha a su tipo mediante la función ficha_color():

La activación del color se hace con la función textcolor() de Conio.
Por otro lado, la función ficha_color() es así:

Es decir, el número que nos da el color de una ficha es el tipo de la ficha (0 – 6) más dos. Por tanto, los colores que vamos a usar van del 2 al 8.
Si recordamos, la paleta de colores del C64 la tenemos en el header file c64.h:

Por tanto, vamos a usar desde el rojo hasta (2) hasta el naranja (8). El motivo de hacerlo así no es otro que evitar el negro y el blanco, que no quedan bien.
Ficheros tetris_random.h y tetris_random.c:
Estos ficheros son nuevos, y los vamos a usar para generar números aleatorios.
En el fichero tetris_random.h, como siempre, tenemos constantes, macros, prototipos de funciones, etc. En este caso sólo tenemos los prototipos de dos funciones nuevas:
- random_min_max().
- random_col().
La función random_mix_max() genera un número aleatorio en el rango min – max, que se pasan como parámetros a la función:

Se apoya en las funciones srand() y rand() de la librería estándar de C stdlib.h. La función srand() sirve para inicializar la semilla (la “s” viene de “seed”), que es el número a partir del cual se genera la serie aleatoria.
Obsérvese cómo la semilla la fijamos a partir del Jiffy Clock, que es el reloj del C64 formado por las posiciones de memoria $a0-$a1-$a2. Tomamos las posiciones $a2 y $a1, ya que la $a0 es la más significativa de las tres y, por tanto, la que varía más lentamente. Y como queremos la mayor aleatoriedad posible, en este caso nos interesan más las posiciones $a2 y $a1.
Por otro lado, la función rand() genera un valor aleatorio entre 0 y RAND_MAX que, al calcularle el resto de la división entera (%) entre (max – min) genera un número entre 0 y (max – min – 1). Por tanto, al sumarle min, al final genera un número entre min y (max – 1), que es el rango que buscamos.
Por último, la función random_col() es así:

Como se puede observar, random_col() se apoya directamente en la función random_min_max(), a la que pasa un valor mínimo y un valor máximo que dependen del tipo de ficha y su rotación. Estos valores se consultan en la tabla cols[tipo][rotacion][min/max].
Esta función nos vale para elegir aleatoriamente la columna del tablero en la que va a aparecer la ficha. En función de su tipo y rotación, la ficha puede ser un poco más ancha o un poco más estrecha y, por tanto, el rango min – max hay que ajustarlo un poco. Recordemos que la posición (columna, fila) de la ficha es la posición de su centro.
Fichero tetris_main.c:
Ya sólo queda llamar a las nuevas funciones random_min_max() y random_col() desde el fichero tetris_main.c, concretamente desde la función ficha_activa(), que es la que activa una nueva ficha:

Como se puede observar, ahora el tipo de ficha, la rotación y la columna se eligen aleatoriamente. La fila de la ficha sigue siendo siempre la fila 0.
Resultado:
El resultado es que ahora las fichas nuevas se eligen aleatoriamente, tanto el tipo, como la rotación y su posición, y que además se pintan en su color desde el comienzo:

Código de ejemplo: tetris07.zip
