Hace algunos meses que no puedo dedicarle mucho tiempo al blog. Quisiera retomarlo con algún proyecto sencillo que nos permita poner en práctica todo lo aprendido sobre C y cc65.
Posibilidades hay muchas. Recientemente he leído que están a punto de cumplirse los 40 años desde la publicación del videojuego clásico por antonomasia: el Tetris. Así que me ha parecido una buena opción.
Para quien no lo conozca, si esto fuera posible, el juego aparece descrito en Wikipedia:
https://es.wikipedia.org/wiki/Tetris
Resumiendo, se trata de algo así:
- Tenemos un tablero de N x M casillas.
- En la parte superior del tablero van apareciendo fichas de 4 bloques, aunque con diferentes formas.
- Las fichas aparecen de una en una y van cayendo desde la parte superior hasta la parte inferior del tablero, donde se acumulan.
- El usuario puede rotar y mover las fichas, siempre dentro de los límites del tablero y las limitaciones que imponen las otras fichas, o los restos de ellas.
- El objetivo del usuario es completar filas. Cuando una fila se completa, ésta se colapsa y el usuario recibe puntos.
- Las filas pueden colapsarse de una en una, de dos en dos, de tres en tres, etc. Cuantas más filas se colapsen de golpe, más puntos recibe el usuario.
- El juego se acaba cuando las fichas acumuladas llegan hasta la parte superior del tablero y ya no pueden entrar fichas nuevas.
- Cuanto más rápido sea el juego, lógicamente, más difícil se vuelve.
Y gráficamente sería algo así:

Este juego es relativamente fácil de programar. La clave está en dar con las estructuras de datos más adecuadas para definir las diferentes fichas y sus rotaciones, así como el tablero.
Algunas dudas normales serían: ¿cómo definimos las fichas? ¿Definimos una forma básica y a partir de ahí calculamos sus rotaciones? ¿O mejor definimos las fichas con todas sus rotaciones? ¿Cómo definimos el tablero? ¿Como un conjunto de fichas acumuladas en ciertas posiciones? ¿Como un conjunto de bloques o restos de fichas? ¿Debemos mezclar el tablero y la ficha actual en una misma estructura de datos? ¿Mejor usamos estructuras separadas?
A todo esto, iremos dando respuesta. En particular, veremos los siguientes puntos:
- Definir una ficha y sus rotaciones.
- Mover una ficha.
- Definir todos los tipos de fichas.
- Definir el tablero.
- Combinar el tablero y la ficha actual.
- Hacer que las fichas caigan.
- Hacer que las fichas que aparecen sean aleatorias.
- Controlar las colisiones con otras fichas.
- Colapsar las filas llenas.
- Controlar el final de la partida.
- Hacer que el juego sea multipartida.
- Definir diferentes niveles de dificultad.
- Una vez colocada, que la ficha caiga a plomo.
Y todo esto programado en C con cc65 y para el C64, claro. A disfrutarlo.