Red de conocimiento informático - Computadora portátil - Programación en C Tetris

Programación en C Tetris

#iincludes & ltstdio.h & gt

#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

#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},

{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( );

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++)

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>

}

}

/*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>

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();

}