domingo, 18 de enero de 2009

Más teoría sobre el Tetris

Seguimos con la programación del Tetris para la nintendo DS.

Tenemos que continuar programando funciones sobre los arrays que definimos en la anterior entrada del blog. Por ejemplo:

void crear_ficha_l(u8 color) {
ficha.radio = 3;
ficha.ficha[0][0] = color;
ficha.ficha[1][0] = CASILLA_VACIA;
ficha.ficha[2][0] = CASILLA_VACIA;
ficha.ficha[3][0] = CASILLA_VACIA;
ficha.ficha[0][1] = color;
ficha.ficha[1][1] = CASILLA_VACIA;
ficha.ficha[2][1] = CASILLA_VACIA;
ficha.ficha[3][1] = CASILLA_VACIA;
ficha.ficha[0][2] = color;
ficha.ficha[1][2] = color;
ficha.ficha[2][2] = CASILLA_VACIA;
ficha.ficha[3][2] = CASILLA_VACIA;
ficha.ficha[0][3] = CASILLA_VACIA;
ficha.ficha[1][3] = CASILLA_VACIA;
ficha.ficha[2][3] = CASILLA_VACIA;
ficha.ficha[3][3] = CASILLA_VACIA;
}
y así todas las fichas!!

Pensando en la forma como hemos solucionado el tema de las fichas, se podría hacer de otra manera.
Esta se basaría en que todas las fichas tienen 4 piezas, con lo que con un array de cuatro elementos sería suficiente, y cada elemento del array guardaría la posición (x, y) donde va esa pieza.

Por ejemplo:
  1. La pieza L sería (0, 0), (0, 1), (0, 2), (1, 2)
  2. La pieza J sería (1, 0), (1, 1), (0, 2), (1, 2)
  3. La pieza o (el cuadrado) sería (0, 0), (0, 1), (1, 0), (1, 1)
A la hora de rotar se podrían guardar las distintas posiciones o rotar sobre la casilla 1,1. Tendríamos que guardar en otra variable el color de las piezas, pero me parece un poco rollo.

Más funciones, la de colisión:
u8 existe_colision(u8 x, u8 y) {
u8 i, j;

for(i = 0; i < j =" 0;">= TABLERO_ANCHO) return 1;
if (y + j >= TABLERO_ALTO) return 1;
if (tablero[x + i][y + j] != CASILLA_VACIA) return 1;
}
return 0; //false
}

Esta la vamos a explicar con más detenimiento.

La función mira si la ficha 'ficha' en las posiciones 'x' e 'y', pasadas como parámetro, está sobre un obstáculo. Se mira que no se salga por los bordes izquierdo o derecho ( if (x + i <>= TABLERO_ANCHO) return 1;), que no llegue al fondo ( if (y + j >= TABLERO_ALTO) return 1;) o que no encuentre alguna casilla del tablero no vacía (if (tablero[x + i][y + j] != CASILLA_VACIA) return 1;), por supuesto todo esto se hará si la casilla de la ficha (i, j) no está vacía ( if (ficha.ficha[i][j] != CASILLA_VACIA) {)

Saludos

4 comentarios:

Anónimo dijo...

Se agradece queeste nuevo tutorial llegara tan rapido.

Anónimo dijo...

si, esta vez te diste prisa! solo que ya me esta parececiendo dificil y acabamos de empezar, xD...

Inigo dijo...

No es difícil!!! sólo son funciones para manejar arrays...dibujando los arrays en papel se ve muy bien.

Saludos

Anónimo dijo...

¡¡¡Sigue así!!!
Eres el mejor , yo i mis amigos te estamos muy agradecidos.
esta muy bien que te des prisa, así aprenderemos antes, biva!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!