Programación en C Tetris
#iincludes & ltdos.h & gt
#iincludes & ltconio.h & gt
#iincludes & ltgraphics .h & gt
#iinclude & ltstdlib.h & gt
#ifdef __cplusplus
#define __CPPARGS...
# De lo contrario
#define __CPPARGS
#endif
#define MINBOXSIZE 15 /*Tamaño mínimo del cuadrado*/
# Definir color de fondo 7 /*Color de fondo*/
#Define GX 200
#Define GY 10
#define SJNUM 10000 /*Cada vez que el jugador alcanza un nivel 10,000, más un nivel*/
/*Código clave*/
#Define VK _Left 0x4b00
#Define VK _Right 0x4d00
# Definir VK_DOWN 0x5000
#Definir VK_UP 0x4800
#Definir VK_HOME 0x4700
#Definir VK_END 0x4f00
#Definir espacio VK 0x3920 p>
#Define VK_ESC 0x011b
#Define VK _Input 0x1c0d
/*Define la dirección del Tetris (yo lo defino como cuatro)*/
#Definición F_DONG 0
#Definición F_NAN 1
#Definición F_XI 2
#Definición F_BEI 3
#definir NEXTCOL 20 / *La coordenada vertical del siguiente cuadro a imprimir*/
#define NEXTROW 12 /*La etiqueta horizontal del siguiente cuadro a dibujar*/
#define MAXROW 14 / *Tamaño de pantalla del juego*/
#Define MAXCOL 20
#Define SCCOL 100 /*Posición relativa en el monitor grande de la pantalla del juego*/
#Define SCROW 60
int gril[22][16];/*Coordenadas de la pantalla del juego*/
int col=1, fila = 7;/*Fotograma actual Coordenadas horizontales y verticales */
int boxfx=0, box GS = 0 /*Forma y orientación del bloque del templo actual*/
int nextboxfx=0, nextboxgs=0 , maxcol = 22/* La forma y dirección del siguiente bloque*/
int minboxcolor=6, nextminboxcolor = 6;
int num = 0;/*Puntuación del juego*/
int dj=0, gamedj[10]={18, 16, 14, 12, 10, 8, 6, 4, 2, 1}; /*nivel de juego*/
/*Yo uso una matriz 3D para registrar la forma inicial y la orientación de la caja*/
int boxstr[7][4][16]={{
{1,1 ,0, 0,0,1,1,0,0,0,0,0,0,0,0,0},
{0,1,0,0,1,1, 0,0 ,1,0,0,0,0,0,0,0},
{1,1,0,0,0,1,1,0,0,0,0 ,0, 0,0,0,0},
{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0, 0}} ,
{
{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0, 0},
{1,0,0,0,1,1,0,0,0
,1,0,0,0,0,0,0},
{0,1,1,0,1,1,0,0,0,0,0,0,0, 0,0,0},
{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},
{
{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0}, p>
{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},
{1,0 ,0,0,1,0,0,0,1,1,0,0,0,0,0,0},
{0,0,1,0,1,1, 1,0,0,0,0,0,0,0,0,0}},
{
{1,1,0,0,1,0, 0,0,1,0,0,0,0,0,0,0},
{1,0,0,0,1,1,1,0,0,0,0 ,0,0,0,0,0},
{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0, 0},
{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},
{
{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},
{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},
{0,1,0,0 ,0,1,0,0,0,1,0,0,0,1,0,0},
{0,0,0,0,1,1,1,1, 0,0,0,0,0,0,0,0}},
{
{1,1,0,0,1,1,0,0, 0,0,0,0.0,0,0,0},
{1,1,0,0,1,1,0,0,0,0,0,0,0.0,0,0 ,0},
{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},
{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}},
{
{0 ,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},
{1,0,0,0,1, 1,0,0,1,0,0,0,0,0,0,0},
{0,1,0,0,1,1,1,0,0,0 ,0,0.0,0,0,0},
{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0, 0}}
};
/*Obtener aleatoriamente la forma y dirección del bloque actual y el siguiente*/
void boxrad(){
minboxcolor = nextminboxcolor
boxgs = nextboxgs
boxfx = nextboxfx
nextminboxcolor = aleatorio(14)+1;
if(nextminboxcolor = = 4 | | nextminboxcolor = = 7 | | nextminboxcolor = = 8)
nextminboxcolor = 9;
nextboxfx = F_DONG
nextbox GS = random(7);
}
/*Inicializar prueba del módulo de gráficos*/
void init(int gdrive, int gmode){
código de error int;
init gráfico(& g unidad & gmode, "e:\\TC");
código de error = resultado del gráfico( ); p>
si(e
¡Código de error! =grOk){
printf("Error: %s ", grapherrormsg(código de error));
Salir (1); >
}
/*Borrar la pantalla en modo gráfico*/
void cls()
{
setfillstyle ( SOLID_FILL, 0);
establecer color(0);
Barra(0, 0, 640, 480); >/*Borrado de pantalla avanzado en modo gráficos*/
void clscr(int a, int b, int c, int d, int color){
setfillstyle(SOLID_FILL, color) ;
setcolor(color);
Barra (A, B, C, D);
}
/* Dibujo de cuadrado mínimo*/
void minbox(int asc, int bsc, int color, int bdcolor){
int a=0, b = 0;
a = sc col+ASC;
b = SCROW+BSC
clscr(a+1, b+1, a-1+MINBOXSIZE, b-1+MINBOXSIZE , color);
if (color!=BGCOLOR){
establecer color(color BD);
line(a+1, b+1, a-1+MINBOXSIZE, b+1);
línea(a+1, b+1, a+1, b-1+MINBOXSIZE); 1+MINBOXSIZE, b+1, a-1+MINBOXSIZE, b-1+MINBOXSIZE);
line(a+1, b-1+MINBOXSIZE, a-1+MINBOXSIZE, b-1+ MINBOXSIZE);
}
}
/*Texto que aparece en el juego*/
void txt(int a, int b , char *txt, int fuente, int color){
setcolor(color);
settextstyle(0, 0, fuente);
outtextxy( a , b, txt);
}
/*dibujo de Windows*/
void win(int a, int b, int c, int d, int bgcolor, int bordercolor){
clscr(a, b, c, d, bgcolor);
establecer color(color del borde); a , b, c, b);
Línea (a, b, a, d
Línea (a, d, c, d
<); p >Line(C, B, C, D);}
/*Dibujo del cuadro actual*/
void funbox(int a, int b, int color, int bdcolor){
int i, j;
int boxz[4][4]; = 0; i <16;i++)
boxz[I/4][I % 4]= boxstr[boxgs][boxfx][I];
for(I = 0 ;I& lt4;i++)
for(j = 0;j & lt4;j++)
si(b
oxz[i][j]==1)
minbox((j+row+a)*MINBOXSIZE, (i+col+b)*MINBOXSIZE, color, color BD);
}
/*Dibuja el siguiente cuadro*/
void nextfunbox(int a, int b, int color, int bdcolor){
int i, j;
int boxz[4][4];
for(I = 0;i<16;i++)
boxz[I/ 4][I % 4]= boxstr[nextboxgs][nextboxfx][I];
for(I = 0;i<4;i++)
for(j = 0 ;j <4;j++)
if(boxz[i][j]==1)
minbox((j+a)*MINBOXSIZE, (i+b)* MINBOXSIZE, color , color BD);
}
/*Definición de interrupción de tiempo*/
#Definir temporizador 0x1c
int timer counter = 0;
interrupción nula(* controlador antiguo)(_ _ CPPARGS);
interrupción nula nuevo controlador(__CPPARGS){
contador de temporizador++;
antiguo controlador();
}
void SetTimer(void interrupt(* int proc)(_ _ CPPARGS)){
antiguo controlador = get vect(TIMER);
disable();
setvect(TIMER, int proc);
enable();
}
/*Debido a las reglas del juego, elimina la línea más pequeña de bloques*/
void delcol(int a){
int i, j ;
for(I = a;I>1;I-)
for(j = 1;j<15;j++){
minbox( j*MINBOXSIZE , i*MINBOXSIZE, BGCOLOR, BGCOLOR);
gril[I][j]= gril[I-1][j];
if(gril[i ][j ]==1)
minbox(j*MINBOXSIZE, i*MINBOXSIZE, minboxcolor, 0);
}
}
/*Elimina todas las filas con el cuadrado más pequeño*/
void delete(){
int i, j, zero, delgx = 0
char *; nm = " 00000
for(I = 1;i<21;i++){
cero = 0;
for(j = 1 ;j <15;j++ )
if(gril[i][j]==0)
cero = 1;
if(cero== 0){
delcol(1);
delgx++;
}
}
núm = núm+delgx * delgx * 10 ;
DJ = num/10000;
sprintf(nm, " %d ", num);
clscr( 456, 173, 500,
200, 4);
txt(456, 173, "Nº:", 1, 15); /p>
p>
}
/*Hora de finalización de la interrupción*/
void KillTimer(){
disable();
setvect(TIMER, old handler);
enable();
}
/*Prueba si el bloque actual puede caer hacia abajo */
int downok(){
int i, j, k=1, a[4][4];
for(I = 0 ; i<16;i++ )
a[I/4][I % 4]= boxstr[boxgs][boxfx][I];
for(I = 0;i<4; i++)
for(j = 0; j & lt4;j++)
If (a[I][j]& amp;& ampgril[col+i+1][ fila+ j])
k = 0;
Return (k);
}
/*Prueba si el bloque actual puede moverse hacia la izquierda */
int leftok(){
int i, j, k=1, a[4][4];
para (I = 0 ;i<16;i++)
a[I/4][I % 4]= boxstr[boxgs][boxfx][I];
for(I = 0; i<4;i++)
for(j = 0;j<4;j++)
if (a[I][j]&&gril[col+i ][fila+ j-1])
k = 0;
Return (k);
}
/*Prueba si el bloque actual se puede alinear a la derecha*/
int rightok(){
int i, j, k=1, a[4][4];
for(I = 0;i<16;i++)
a[I/4][I % 4]= boxstr[boxgs][boxfx][I];
for( I = 0;i<4;i++)
for(j = 0;j<4;j++)
Si (a[I][j]& amp ;&gril[col+i] [fila+j+1])
k = 0;
Devolver (k);
}
/*Probar si el bloque actual se puede deformar*/
int upok(){
int i, j, k=1, a[4][4]; >for(I = 0;I<4;i++)
for(I = 0;I<16;i++)
a[I/4 ][I % 4]= boxstr[boxgs ][boxfx+1][I];
for(I = 3;I>=0;I-)
for (j = 3;j & gt=0;j -)
Si (a[I][j]& & ampgril[col+i][fila+j])
k = 0;
Return (k);
}
/*Después de que caiga el cuadro actual, marque las coordenadas de la pantalla*/
void setgril(){
int i, j, a[4][4];
funbox(0, 0, minboxcolor, 0
for(I = 0;i<16;i++); )
a[I/4][I % 4]= boxstr[boxgs][boxfx][I];
for(I = 0;i<4;i++)
for (j = 0;j <4;j++)
if(a[i][j])
gril[col+I][fila+j]= 1;
col = 1; fila = 7;
}
/*Juego terminado*/
void juego terminado(){
int i,j;
for(I = 20;i>0;i-)
for(j = 1;j<15;j++) p>
minbox( j*MINBOXSIZE, i*MINBOXSIZE, 2, 0);
txt(103, 203, "Juego terminado", 3, 10); >/*Configuración de teclas*/
void call_key(int keyx){
Cambiar (keyx){
Caso VK hacia abajo:{/*Flecha hacia abajo, agregue uno a la abscisa.
*/
if(downok()){
col++;
funbox(0, 0, minboxcolor, 0);}
De lo contrario {
funbox(0, 0, minboxcolor, 0);
setgril();
nextfunbox(NEXTCOL, NEXTROW, 4, 4);
boxrad();
nextfunbox(NEXTCOL, NEXTROW, nextminboxcolor, 0
delete(); p>
p>
Romper;
}
Caso VK _Up:{/* Tecla de flecha hacia arriba, la forma de dirección gira 90 grados*/
if (upok())
caja fx++;
if(caja FX>3)
caja FX = 0;
funbox(0, 0, minboxcolor, 0);
Break;
}
Caso VK _Left:{ /*Tecla de flecha izquierda, en vertical Restar uno de las coordenadas*/
if(leftok())
Línea -;
funbox(0, 0, minboxcolor, 0);
Romper;
}
Caso VK _right:{ /*tecla de flecha derecha, agregar una*/
if(rightok() )
fila++;
funbox(0, 0, minboxcolor, 0
Descanso
}
; Caso VK_SPACE: /*Barra espaciadora, suelte directamente al último lugar para soltar*/
while(downok())
col++;
funbox(0 , 0, minboxcolor, 0);
setgril();
nextfunbox(NEXTCOL, NEXTROW, 4, 4); p>
nextfunbox(NEXTCOL, NEXTROW, nextminboxcolor, 0);
delete();
Pausa;
Valor predeterminado:
{
txt(423,53,"¡llave desgastada!",1,4);
txt(428,80,"¡Ingrese una clave AG única! ",1,4);
getch();
clscr(420, 50, 622, 97, BGCOLOR);
}
}
}
/*Hora de inicio de interrupción*/
void timezd(void){
int key;
SetTimer(nuevo controlador);
boxrad();
nextfunbox(NEXTCOL, NEXTROW, nextminboxcolor, 0);
for( ;;){
if(bioskey(1)){
clave = clave BIOS(0);
funbox(0, 0, BGCOLOR, BGCOLOR );
if(key==VK_ESC)
Romper;
call_key(clave);
}
if(contador del temporizador & gt;gamedj[dj]){
contador del temporizador = 0;
if(downok()){
<p>funbox(0, 0, BGCOLOR, BGCOLOR);
col++;
funbox(0, 0, minboxcolor, 0); p>
En caso contrario{
if(col==1){
juego terminado();
getch();
Romper;
}
setgril();
eliminar();
funbox(0, 0, minboxcolor, 0
col = 1; fila = 7;
funbox(0, 0, BGCOLOR, BGCOLOR);
nextfunbox(NEXTCOL, NEXTROW, 4, 4);
boxrad();
nextfunbox(NEXTCOL, NEXTROW, nextminboxcolor, 0);
}
} p> p>
}
}
/*Inicio del programa principal*/
Principal no válido (no válido){
int i, j;
char * nm = " 00000
init(VGA, VGA hola);
cls();
/ *Inicialización de coordenadas de pantalla*/
for(I = 0; i & lt= max col+1; i++)
for(j = 0; j & lt= MAXROW +1 ;j++)
gril[I][j]= 0;
for(I = 0;i<= max col+1;i++) {
gril[I][0]= 1;
gril[I][15]= 1;
}
for(j = 1; j & lt= MAXROWj++){
gril[0][j]= 1;
gril[21][j]= 1;
}
clscr(0, 0, 640, 480, 15);
ganar(1, 1, 639, 479, 4, 15); SCCOL+MINBOXSIZE-2, SCROW+MINBOXSIZE-2, SCCOL+15*MINBOXSIZE+2, SCROW+21*MINBOXSIZE+2, BGCOLOR, 0);
nextbox GS = aleatorio(8); p> p>
nextboxfx = random(4);
sprintf(nm, " %d ", num);
txt(456, 173, "Número: " , 1 , 15);
txt(456, 193, nm, 1, 15);
txt(456, 243, "Siguiente cuadro:", 1, 15);
timezd();
kill timer();
closegraph();
}