asi que para que no muera en el olvido lo comparto con ustedes
Pd.- no haban caso a los comentarios "raros" eran para recordarme a mi mismo cosas
Código :
/*
APUNTES
El corrimiento es de 0 a 1 osea de menor a mayor
se manejan cuatro arreglos dos para el display y dos para la figura
*/
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdlib.h>
#define ANCHO 10
#define LARGO 20
#define ANCHO_FIG 15
#define LARGO_FIG 15
#define COL_PANT 200
#define FIL_PANT 100
#define XSIG 400
#define YSIG 200
#define LIMITE 10000
#define CIERTO 1
#define FALSO 0
/*variables globales*/
struct matriz_log{
char lleno;
}mat_log[ANCHO][LARGO],mat_log2[ANCHO][LARGO];
//el largo y el ancho se deben de cambiar en ambos arreglos
struct matriz_fig{
int lleno;
/*char col,fil;*/
}fig_log[4][4];
int cuadrado[16]={0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0};
int vara[16]={0,1,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0};
int ele[16]={0,1,0,0,
0,1,0,0,
0,1,1,0,
0,0,0,0};
int eleinv[16]={0,0,1,0,
0,0,1,0,
0,1,1,0,
0,0,0,0};
int t[16]={0,0,0,0,
1,1,1,0,
0,1,0,0,
0,0,0,0};
int z[16]={0,0,0,0,
1,1,0,0,
0,1,1,0,
0,0,0,0};
int s[16]={0,0,0,0,
0,1,1,0,
1,1,0,0,
0,0,0,0};
int sonido[16]={500,450,55,562,
910,600,400,800,
200,600,1500,1000,
500,2000,1000,1500};
//,vara,ele,eleinv,t,z,s;
void *p_image;
int xfig=(ANCHO/2)-2,yfig=-3;//las posiciones son de acuerdo a la matriz no display
int cuenta_lineas=0;
int counter=0,limite=LIMITE;
/*procedimientos*/
void suena(int ret)
{
int i;
for (i=0;i<16;i++)
{
sound(sonido[i]);
delay(ret);
}
nosound();
}
void FENTO(int x, int y)
{
//cabeza
line(x,y,x,y+15);
//pico
line(x+5,y,x+10,y+3);
line(x+10,y+3,x+5,y+6);
//cuello
line(x+5,y+8,x+5,y+15);
//alas izquierda
line(x-5,y+15,x-15,y+3);
line(x-15,y+3,x-30,y+3);
line(x-18,y+8,x-30,y+8);
line(x-21,y+13,x-30,y+13);
line(x-21,y+15,x-5,y+28);
//alas derecha
line(x+10,y+15,x+20,y+3);
line(x+20,y+3,x+35,y+3);
line(x+23,y+8,x+35,y+8);
line(x+26,y+13,x+35,y+13);
line(x+26,y+15,x+10,y+28);
//patas
line(x,y+20,x-3,y+23);
line(x,y+20,x+3,y+23);
line(x,y+20,x,y+23);
line(x+7,y+20,x+4,y+23);
line(x+7,y+20,x+10,y+23);
line(x+7,y+20,x+7,y+23);
//cola
line(x-5,y+30,x-8,y+35);
line(x,y+30,x-3,y+35);
line(x+3,y+30,x+3,y+35);
line(x+6,y+30,x+9,y+35);
line(x+10,y+30,x+13,y+35);
line(x-10,y+40,x-15,y+50);
line(x-5,y+40,x-8,y+50);
line(x,y+40,x,y+50);
//line(x+3,y+40,x+3,y+50);
line(x+6,y+40,x+6,y+50);
line(x+10,y+40,x+15,y+50);
line(x+15,y+40,x+22,y+50);
settextstyle(0,0,1);
outtextxy(x-15,y+55,"FeNtO");
}
void *copia(int x,int y, int x2,int y2)
{
unsigned size;
void *auxiliar;
size = imagesize(x,y,x2,y2);
auxiliar = malloc(size);
getimage(x,y,x2,y2,auxiliar);
return auxiliar;
}
void baja(int x,int y, int x2, int y2)
{
setcolor(8);
line(x,y,x2,y);
line(x,y,x,y2);
setcolor(15);
line(x,y2,x2,y2);
line(x2,y,x2,y2);
}
void alza(int x,int y, int x2, int y2)
{
setcolor(15);
line(x,y,x2,y);
line(x,y,x,y2);
setcolor(8);
line(x,y2,x2,y2);
line(x2,y,x2,y2);
}
void boton(int x,int y)
{
setfillstyle(1,7);
bar(x,y,x+ANCHO_FIG-1,y+LARGO_FIG-1);
alza(x,y,x+ANCHO_FIG-1,y+LARGO_FIG-1);
}
void boton_car(int x,int y,int x2,int y2)
{
setfillstyle(1,7);
bar(x,y,x2,y2);
alza(x,y,x2,y2);
}
void caratula( int x,int y )
{
int ancho=70,largo=70;
//boton_car(x,y,x+ancho,y+largo);
setlinestyle(0,0,2);
setbkcolor(3);
baja(XSIG-5,YSIG-5,XSIG+ancho-10,YSIG+largo-10);
setlinestyle(0,0,1);
//TEXTO
settextstyle(5,0,2);
outtextxy(XSIG,YSIG+largo-10,"Siguiente");
baja(60,180,120,205);
outtextxy(60,200,"Velocidad");//las coord para vel 70 175
outtextxy(70,175,"0");
baja(60,280,120,305);
outtextxy(60,300,"Lineas");//las coordenadas pra las lineas es 80,275
outtextxy(70,275,"0");
FENTO(290,10);
settextstyle(0,0,1);
outtextxy(200,420,"[email protected]");
settextstyle(5,1,1);
outtextxy(600,50,"Jorge Fernando Ramirez Huerta");
}
void pausa(void)
{
void *temporal;
temporal =copia(COL_PANT,FIL_PANT,COL_PANT+(ANCHO*ANCHO_FIG),FIL_PANT+(LARGO*LARGO_FIG));
boton_car(COL_PANT,FIL_PANT,COL_PANT+(ANCHO*ANCHO_FIG),FIL_PANT+(LARGO*LARGO_FIG));
setcolor(11);
settextstyle(5,0,2);
outtextxy(COL_PANT+(((ANCHO/2)-3)*ANCHO_FIG),FIL_PANT+(((LARGO/2)-2)*LARGO_FIG),"Pausa");
getch();
putimage(COL_PANT,FIL_PANT,temporal,COPY_PUT);
free(temporal);
/*#define ANCHO 10
#define LARGO 20
#define ANCHO_FIG 15
#define LARGO_FIG 15
#define COL_PANT 200
#define FIL_PANT 100*/
}
void muestra_lineas()
{
char string[25];
itoa(cuenta_lineas, string, 10);
settextstyle(5,0,2);
outtextxy(70,275,string);
}
void muestra_vel()
{
char string[25];
int temporal;
temporal=(LIMITE-limite);
if (temporal!=0)
temporal/=500;
itoa(temporal, string, 10);
settextstyle(5,0,2);
outtextxy(70,175,string);
}
/*se supone que el display ya funciona falta checarlo al final*/
/*por cierto el display toma como base la matriz logica */
void display(int x, int y)
{
int col,fil;
for (fil=0; fil<LARGO; fil++)
for (col=0;col<ANCHO;col++)
if (mat_log[col][fil].lleno!=mat_log2[col][fil].lleno)
{
putimage(x+(col*ANCHO_FIG),y+(fil*LARGO_FIG),p_image,XOR_PUT);//checar po que es aqui como se va a desplegar
mat_log2[col][fil].lleno=mat_log[col][fil].lleno;
}
}
/*se hace el borrado de la fila en la matriz normal
y en corrimiento se bacia la fila anterior*/
/*hasta aqui empieza las rutinas por que lo anterior solo es paja*/
void asigna_figura(int *op)
{
//int op;
int col,fil;
for (fil=0; fil<4; fil++)
{
for (col=0;col<4;col++)
{
switch (*op){
case 0:
fig_log[col][fil].lleno=z[(fil*4)+col];
break;
case 1:
fig_log[col][fil].lleno=s[(fil*4)+col];
break;
case 2:
fig_log[col][fil].lleno=t[(fil*4)+col];
break;
case 3:
fig_log[col][fil].lleno=ele[(fil*4)+col];
break;
case 4:
fig_log[col][fil].lleno=eleinv[(fil*4)+col];
break;
case 5:
fig_log[col][fil].lleno=cuadrado[(fil*4)+col];
break;
case 6:
fig_log[col][fil].lleno=vara[(fil*4)+col];
break;
}
}
}
*op=random(7);
}
/*por medio de esto te regresa cierto si el movimiento es posible
y te regresa falso si el movimiento no es posible*/
char checar_mov(void)
{
int col,fil;
for (fil=yfig;fil<yfig+4;fil++)
for(col=xfig;col<xfig+4;col++)
/*if ( ((fig_log[col-xfig][fil-yfig].lleno==CIERTO)&&(
mat_log[col][fil].lleno==CIERTO))||
(col>ANCHO)||(col<1)||(fil>LARGO)
)*/
if (((fig_log[col-xfig][fil-yfig].lleno==CIERTO)&&
(mat_log[col][fil].lleno==CIERTO)
)||
((fig_log[col-xfig][fil-yfig].lleno==CIERTO)&&
(
(col>ANCHO-1)||
(col<0)
)
)||
((fig_log[col-xfig][fil-yfig].lleno==CIERTO)&&
(fil>LARGO-1)
)
)
return FALSO;
return CIERTO;
}
/*la asignacion de las figuras ya funciona ahora viene el rotamiento*/
/*el rotamiento no incluye el display debes checar si depsues hace falta aqui*/
void rota_fig(void)
{
matriz_fig auxiliar[4][4],auxiliar2[4][4];
int col,fil;
int col_aux,fil_aux;
char bandera=CIERTO;
int i,j;
int xtmp;
char bandera_corre=FALSO;
xtmp=xfig;
/*rotamiento*/
//almacenamiento de los valores primero auxiliar el segubbdo rotado
for (fil=0;fil<4;fil++)
for(col=0;col<4;col++)
{
auxiliar[col][fil].lleno=fig_log[col][fil].lleno;
auxiliar2[3-fil][col].lleno=fig_log[col][fil].lleno;
}
for (fil=0;fil<4;fil++)
for(col=0;col<4;col++)
fig_log[col][fil].lleno=auxiliar2[col][fil].lleno;
//checa las posiciones posibles para una posible corrimiento
//if (xfig<0)
for (;xfig<=0; xfig++)
if (checar_mov()==CIERTO)
{
xtmp=xfig;
xfig=1;
}
for (;xfig>=(ANCHO-4); xfig--)
if (checar_mov()==CIERTO)
{
xtmp=xfig;
xfig=(ANCHO-5);
}
xfig=xtmp;
//else
if (checar_mov()==FALSO)
{
for (fil=0;fil<4;fil++)
for(col=0;col<4;col++)
fig_log[col][fil].lleno=auxiliar[col][fil].lleno;
}
/*else
{
for (fil=0;fil<4;fil++)
for(col=0;col<4;col++)
fig_log[col][fil].lleno=auxiliar2[col][fil].lleno;
}*/
}
void borrado(int fil)
{
int i;
for (i=0;i<ANCHO;i++)
{
mat_log[i][fil].lleno=FALSO;
display(COL_PANT,FIL_PANT);
delay(10);
}
}
/*el corrimeitto aun no esta terminado asi que ojno*/
void corrimiento(int fil)
{
int i,j;
for (i=fil;i>0;i--)
for (j=0;j<ANCHO;j++)
mat_log[j][i].lleno=mat_log[j][i-1].lleno;
for (j=0;j<ANCHO;j++)
mat_log[j][0].lleno=FALSO;
}
/*vacia la matriz principal*/
/*recuerda que los procedimientos no muestran resultados cisuales
solo hacen lo que deben de hacer*/
void vacia_mat(void)
{
int fil,col;
for (fil=0;fil<LARGO;fil++)
for(col=0;col<ANCHO;col++)
{
mat_log[col][fil].lleno=FALSO;
display(COL_PANT,FIL_PANT);
delay(5);
}
}
void llena_mat(void)
{
int fil,col;
for (fil=0;fil<LARGO;fil++)
for(col=0;col<ANCHO;col++)
{
mat_log[col][fil].lleno=CIERTO;
display(COL_PANT,FIL_PANT);
delay(5);
}
}
/*esta hacioendo el chequeo de que no haya nonguna fila completa por que
hace los corrimeitnos y borrados*/
void checa(void)
{
int col,fil;
char bandera,bandera_fin=FALSO;
for (fil=0;fil<LARGO;fil++)
{
bandera=CIERTO;
bandera_fin=FALSO;
for (col=0;col<ANCHO;col++)
if (mat_log[col][fil].lleno==FALSO)
{
bandera=FALSO;
bandera_fin=CIERTO;
}
if (bandera==CIERTO)
{
borrado(fil);
//display(COL_PANT,FIL_PANT);
delay(100);
suena(5);//ojo aqui va el sonido
corrimiento(fil);
display(COL_PANT,FIL_PANT);
delay(100);
fil=0;
setcolor(0);
muestra_lineas();
cuenta_lineas++;
setcolor(15);
muestra_lineas();
if ((cuenta_lineas%3)==0)
{
setcolor(0);
muestra_vel();
limite-=500;
setcolor(15);
muestra_vel();
//aqui se debe de hacer el despliegue del nivel
//y aqui el despliegue de las lineas echas
}
}
/*if ((fil<1)&&(bandera_fin==CIERTO))
{
vacia_mat();
display(COL_PANT,FIL_PANT);
}*/
}
}
/*quita los valores de la figura de la matriz principal*/
void quita_fig(void)
{
int fil,col;
for (col=xfig;col<xfig+4;col++)
for(fil=yfig;fil<yfig+4;fil++)
if (fil>=0)
if (fig_log[col-xfig][fil-yfig].lleno==CIERTO)
mat_log[col][fil].lleno=FALSO;
}
/*pone los valores de la figura en la matriz principal*/
void pon_fig(void)
{
int fil,col;
for (col=xfig;col<xfig+4;col++)
for(fil=yfig;fil<yfig+4;fil++)
if (fil>=0)
if (fig_log[col-xfig][fil-yfig].lleno==CIERTO)
mat_log[col][fil].lleno=CIERTO;//fig_log[col-xfig][fil-yfig].lleno;
}
/* este es el procedimiento que proporciona el tiempo reuqerido*/
/*char timer(int time)
{
gettime
}*/
void figura_next(int op)
{
int col,fil;
for (fil=0; fil<4; fil++)
{
for (col=0;col<4;col++)
{
switch (op){
case 0:
if (z[(fil*4)+col]==CIERTO)
putimage(XSIG+(col*ANCHO_FIG),YSIG+(fil*LARGO_FIG),p_image,XOR_PUT);
break;
case 1:
if (s[(fil*4)+col]==CIERTO)
putimage(XSIG+(col*ANCHO_FIG),YSIG+(fil*LARGO_FIG),p_image,XOR_PUT);
break;
case 2:
if (t[(fil*4)+col]==CIERTO)
putimage(XSIG+(col*ANCHO_FIG),YSIG+(fil*LARGO_FIG),p_image,XOR_PUT);
break;
case 3:
if (ele[(fil*4)+col]==CIERTO)
putimage(XSIG+(col*ANCHO_FIG),YSIG+(fil*LARGO_FIG),p_image,XOR_PUT);
break;
case 4:
if (eleinv[(fil*4)+col]==CIERTO)
putimage(XSIG+(col*ANCHO_FIG),YSIG+(fil*LARGO_FIG),p_image,XOR_PUT);
break;
case 5:
if (cuadrado[(fil*4)+col]==CIERTO)
putimage(XSIG+(col*ANCHO_FIG),YSIG+(fil*LARGO_FIG),p_image,XOR_PUT);
break;
case 6:
if (vara[(fil*4)+col]==CIERTO)
putimage(XSIG+(col*ANCHO_FIG),YSIG+(fil*LARGO_FIG),p_image,XOR_PUT);
break;
}
}
}
}
void main()
{
int gdriver = DETECT, gmode, errorcode;
/* initialize graphics mode */
initgraph(&gdriver, &gmode, "");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* return with error code */
}
//int col,fil;
//int x=200,y=1;
int op;
char bandera=CIERTO;
char tecla;
//matriz_fig figura;
/*procedimientos de inicializacion*/
randomize();
boton(1,1);
p_image=copia(1,1,1+ANCHO_FIG-1,1+LARGO_FIG-1);
op=random(7);
cleardevice();
alza(COL_PANT,FIL_PANT,COL_PANT+(ANCHO_FIG*ANCHO),FIL_PANT+(LARGO_FIG*LARGO));
asigna_figura(&op);//hasta aqui la asignacion ya esta validada y funciona bien
//rota_figura(); la rotacion de la figura ya funciona correctamente
/*for (fil=0; fil<4; fil++)
{
for (col=0;col<4;col++)
{
if (fig_log[col][fil].lleno==CIERTO)
putimage(x+(col*ANCHO_FIG),y+(fil*LARGO_FIG),p_image,XOR_PUT);//checar po que es aqui como se va a desplegar
}
} */
/*los procedimiento que se tienen pensados es asi
mientras no bandera hacer
si tiempo transcurrido
avanza
si avanza tope
nueva figura
si no
si tecla presionada
caso de tecla sea
derecha
incrementar columna
izquierda
decrementatar columna
abajo
inclementar fila
enter
rotafigura
*/
caratula(400,10);
pon_fig();
figura_next(op);
while (bandera!=FALSO)
{
//se supone que aqui va la condicion del tiempo
//if .....
//pon_fig();
if (kbhit())
{
//suena(2);
tecla=getch();
quita_fig();
display(COL_PANT,FIL_PANT);
switch(tecla){
case 80 :
yfig++;
if (checar_mov()==FALSO)
yfig--;
break;
case 75 :
xfig--;
if (checar_mov()==FALSO)
xfig++;
break;
case 77 :
xfig++;
if (checar_mov()==FALSO)
xfig--;
break;
case 13 :
rota_fig();
break;
case 32:
pausa();
break;
case 27:
bandera=FALSO;
break;
}
pon_fig();
display(COL_PANT,FIL_PANT);
}
if (counter>limite)
{
display(COL_PANT,FIL_PANT);
quita_fig();
yfig++;
if (checar_mov()==FALSO)
{
if (yfig<1)
{
llena_mat();
vacia_mat();
getch();
bandera=FALSO;//aqui es donde se hace la encriptacion del archivo
}
else
{
yfig--;
pon_fig();
display(COL_PANT,FIL_PANT);
checa();
yfig=-1;
xfig=(ANCHO/2)-2;
figura_next(op);
asigna_figura(&op);
figura_next(op);
pon_fig();
display(COL_PANT,FIL_PANT);
}
}
pon_fig();
//display();
counter=0;
}
counter++;
}
closegraph();
}Xaludos
