[ Foro de Pascal ]

Matrices para Tetris

09-Oct-2009 22:24
oscar gomez
3 Respuestas

Hola Profesor nacho cabanes.
Mira es que estoy realizando tu excelente curso del cual te doy mil felicitaciones por tu vocacion de enseñar.
Mira queria preguntar respecto a un ejercicio que estoy realizando de una matriz que simula el juego de tetriz y bueno solo me falta una parte de el por solucionar y es la siguiente:

tengo la matriz inicial

0 0 0 0 0 0
0 0 0 0 0 0
1 0 1 0 1 0
1 1 1 1 1 1 MATRIZ INICIAL LEIDA DE TECLADO
1 1 1 1 1 1
1 0 1 0 1 1

bien en este caso tendria un tetriz de dos filas ( las compuestas por puros unos). se pide ademas imprimir la matriz resultante asi:
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0 MATRIZ NUEVA DESPUES DE LAS DOS FILAS DE TETRIZ
1 0 1 0 1 1
1 0 1 0 1 1

pues bien ahi esta mi problema pues no se como hacer para llegar a ella.

yo lo que he intentado profesor es crear un vector que me almacene donde hay filas todos unos es decir el vector podria ser para este caso.

0 0 0 1 1 0 es decir en las posiciones 4 y 5 del vector almaceno 1 para indicar que en esas filas la matriz esta llena de unos y que son filas de tetriz, luego mi idea es copiar los valores de la matriz inicial a la nueva ( la de imprimir) pero claro lo que no se es como hacer para bajar la fila 1 0 1 0 1 1 dos filas abajo de donde estan las filas llenas de unos. si podeis ayudarme ...


09-Oct-2009 22:42
Nacho Cabanes (+31)

Si no te he entendido mal, tu problema consiste en eliminar filas de una matriz, haciendo que bajen las que están por encima de ella.

El pseudocódigo podría ser algo como:

Para cada fila desde n hasta 1
Si filaDeUnos(fila)
 BajarFila(fila-1)

Convertido a Pascal, ese "para cada fila" sería simplemente un "for" que recorriese cada fila desde abajo hacia arriba, algo como

for fila := n downto 1


La función "filaDeUnos(n)" podría devolver "true" si todos los datos de la fila son unos, y "false" si hay algún cero, y se podría hacer ayudándose de una variable auxiliar que indicase si se ha encontrado algún cero, así:

function filaDeUnos(n: integer): boolean;
var
 hayAlgunCero: boolean;
begin
 hayAlgunCero := false;
 for columna := 1 to maxcolumnas do
   if matriz[n,columna] = 1 then hayAlgunCero := true;  
 filaDeUnos:= not hayAlgunCero;
end;


Y el procedimiento "bajarFila" se limitaría a copiar todos los datos de esa fila en la siguiente

for columna := 1 to maxcolumnas do
   matriz[n,columna] := matriz[n+1,columna];  

(en el caso real del Tetris, realmente deberían bajar también todas las filas que están por encima de ella, y rellenar con 0 la primera fila).


11-Oct-2009 18:11
oscar gomez

Cordial saludo profesor Nacho Cabanes.
Ante todo agradecerte tu tiempo y tu excelente ayuda pues la verdad explicas muy bien y sabes responder muy bien nuestras dudas.
Profesor mire ud, es que tome en cuenta sus orientaciones en el ejercicio de la matriz para tetriz,pero no se si este equivocado en lo siguiente:
en la funcion bajarfila ( que realmente si empezamos desde la ultima fila hacia la primera deberis ser: matriz[n,columna]:=matriz[n-1,columna] y no como me la haz planteado matriz[n,columna]:=matriz[n+1,columna] verdad? o estoy confundido??) entiendo que al existir una fila toda de unos se copiara la siguiente linea ( es decir matriz[n,columna]:= matriz[n-1,columna]) pero bueno haciendo un seguimiento con el siguiente ejemplo pasaria lo siguiente:

0 0 0 0 0 0 fila 1
0 0 0 0 0 0 fila 2
1 0 1 1 0 1 fila 3 matriz original
1 1 1 1 1 1 fila 4
0 1 0 1 0 1 fila 5
1 0 1 0 1 1 fila 6
resulta que en la fila 4 ( empezando el for :=n downto 1 do) encontraria una fila toda de unos por lo tanto segun la funcion que tu me das se copiaria la siguiente fila encima de la fila en cuestion de unos, es decir la fila 3 ( 1 0 1 1 0 1 ) con lo cual tendria en este momento empezando de abajo arriba(for fila:=n downto 1):


1 0 1 1 0 1 //** esta seria la fila que bajo en reemplazo de la posicion donde
0 1 0 1 0 1 estaba la fila llena de unos.
1 0 1 0 1 1

mi pregunta es si porejemplo si la fila encima de la fila toda llena de unos en cuestion se encontrara encima otra fila toda llena de unos entonces la funcion bajarfila copiaria una fila llena de unos y no seria correcto, es decir ejemplo:

si la matriz original fuese:

0 0 0 0 0 0
0 0 0 0 0 0
1 1 1 1 1 1 matriz original
1 1 1 1 1 1
0 1 0 1 0 1
1 0 1 0 1 1

entonces



tendria para la matriz resultante:


1 1 1 1 1 1 matriz resultante hasta el momento de encontrar la fila 1 1 1 1 1 1
0 1 0 1 0 1 es decir se copiaria la fila que esta encima de ella osea la fila
1 0 1 0 1 1 llena de unos 1 1 1 1 1 1 y esto en la matriz resultante seria
incorrecto.

Quisiera pedirte ayuda en como implementar un correcto algoritmo en el caso del tetriz real es decir que se bajarian todas las filas que estan por encima de una fila llena de unos teniendo encuenta que ninguna de ellas vuelva a ser una fila llena de unos y como en un ciclo podria rellenar la primera fila con ceros.

en definitiva profesor el caso mio que me tiene confundido es esto:
supon la matriz original

0 1 0 1 0 0
1 1 1 0 0 1
1 1 1 1 1 1 matriz original
1 1 1 1 1 1
0 1 0 1 0 1
1 0 1 0 1 1

como hago para que empezando desde la ultima fila ( for fila:=n downto 1 do)
bajen las filas que estan encima de las filas llenas de unos en este caso
las filas que estan encima de 1 1 1 1 1 1
1 1 1 1 1 1

que en este caso serian :

0 1 0 1 0 0
1 1 1 0 0 1
y como hacer para colocar en cero las primeras dos lineas dado que fueron dos filas llenas de unos, para obtener la matriz resultante correcta para un tetris real:

0 0 0 0 0 0
0 0 0 0 0 0
0 1 0 1 0 0
1 1 1 0 0 1
0 1 0 1 0 1
1 0 1 0 1 1

ahora si el caso de la matriz riginal fuese:

1 1 1 1 1 1
1 1 1 0 0 1
1 1 1 1 1 1 matriz original
1 1 1 1 1 1
1 0 1 0 1 1
1 1 1 1 1 1


como podria hacer para que se cumpliera este tambien este caso en el que como veis tenemos un tetriz de cuatro filas llenas de unso,entonces empezando desde la fila de abajo (for fila:= n downto 1 do )
como controlo que bajen todas las filas encima de la primera fila llenas de unos ( la correspondiente a la fila n= 6 osea ,la ultima) para llegar al matriz resultante para este caso:

0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
1 1 1 0 0 1
1 0 1 0 1 1

me disculpais profesor si por querer hacer mas entendible mi pregunta me extiendo,por tu valiosa ayuda para seguir aprendiendo mil gracias

Att. Oscar Gomez







20-Oct-2009 10:33
oscar gomez

Hola profesor Nacho Cabanes queria decirte que ya he solucionado lo que me faltaba de este ejercicio ,me ayudo muchisimo tus orientaciones mil gracias profesor.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)