Explicación del código fuente del juego 2048
Ejecute para confirmar que se ha compilado:
# include ltgraphics.h gt
# include ltstdlib.h gt
# incluir ltdos.h gt
#Definir LEFTPRESS 0xff01
#Definir clic izquierdo 0xff10
#Definir arrastre izquierdo 0xff19
#Definir movimiento del mouse 0xff08
Estructura
{
int num/*¿Cuál es el estado actual de la grilla? 1 tiene minas, 0 ha mostrado números o cuadrículas en blanco*/
int roundnum/*Cuenta cuántas minas hay alrededor de la cuadrícula*/
int signo /*clic derecho Mostrar el bandera roja bandera, 0 no tiene bandera roja bandera, 1 tiene bandera roja bandera*/
} Mío[10][10];
int juego otra vez = 0; para reiniciar Variable */
int gamePLAY = 0 /*¿Es la primera vez que juegas?*/
int mineNUM/*Calcular el número de cuadrículas procesadas*/
char randmineNUM[3] /*Mostrar una cadena de números*/
int Keystate
int MouseExist
int MouseButton
int MouseX
int MouseY
void Init(void); /*Controlador de gráficos*/
void MouseOn(void); * Visualización del cursor del mouse*/
void MouseOff(void); /*Cursor del mouse oculto*/
void MouseSetXY(int, int /*Establecer posición actual*/); p >
int pulsación izquierda(void);/*pulsación izquierda*/
int pulsación derecha(void);/*presiona el botón derecho del ratón*/
void mouse getxy( void); /*Obtener la posición actual*/
Control no válido (void); /*Inicio, reinicio y apagado del juego*/
void GameBegain(void); *El juego comienza en pantalla*/
void DrawSmile(void); /*Dibuja una sonrisa*/
void DrawRedflag(int, int); /*Mostrar bandera roja*/ p>
void DrawEmpty(int, int, int, int); /*Mostrar dos espacios*/
void game over(void /*Game over*/
void GameWin(invalid); /*Mostrar victoria*/
int MineStatistics(int, int /*Calcular el número de minas alrededor de cada cuadrícula*/
int ShowWhite( int , int); /*Mostrar la parte en blanco sin campos minados*/
void gameplay (void); /*Proceso del juego*/
void Close (no válido); Cerrar*/
Administrador no válido (no válido)
{
init();
control();
close();
}
Inicio nulo(nulo
)/*Inicio de gráfico*/
{
int gd=DETECT, GM;
init gráfico( amp; gd, ampgm, " c: \ \ TC ");
}
Cerrar vacío(vacío)/*cerrar gráfico*/
{
cerrargraf();
}
Void MouseOn(void)/*Visualización del cursor del mouse*/
{
_ AX = 0x 01;
interrupción de generación(0x 33);
}
Void MouseOff(void)/*Cursor del mouse oculto*/
{
_ AX = 0x02
gen interrupción(0x 33);
}
Void MouseSetXY(int x, int y)/*Establecer el valor actual posición */
{
_ CX = x;
_ DX = y
_ AX = 0x04
gen interrupción(0x 33);
}
Int LeftPress(void)/*Presione el botón izquierdo del mouse*/
{
_ AX = 0x03
interrupción de generación(0x 33);
Retorno(_ BX amp; 1);
}
Int RightPress(void)/*Presione el botón derecho del mouse*/
{
_ AX = 0x03
gen interrupt(0x 33);
p>
Return (_ BX amp; 2);
}
Voidmousetxy (void)/*Obtener la posición actual*/ p>
{ p>
_ AX = 0x03
interrupción gen(0x 33);
MouseX = _ CX;
MouseY = _ DX
}
Control de vacío(void)/*Inicio, reinicio y cierre del juego*/
{
int game flag = 1;/*Game Flag para determinar si se debe reiniciar después de un fallo*/
while(1)
{
If(gameFLAG)/* Si el juego falla y no decide reiniciar o salir del juego, continúa juzgando*/
{
GameBegain() /*Pantalla inicial del juego*/
<; p>Juego(); /*Juego específico*/If(gameAGAIN==1)/*Reiniciar el juego*/
{
juego nuevamente = 0;
Continuar ;
}
}
MouseOn();
bandera del juego = 0 ;
If(LeftPress ())/*Determinar si se debe reiniciar*/
{
mouse getxy();
if (MouseX gt; 280 amperios ampMouseX lt300 ampampMouseY gt65 amp amp mouselt85)
{
bandera del juego =
1;
Continuar
}
}
If(kbhit())/*Determine si presionar la tecla para salir */ p>
Romper;
}
MouseOff();
}
Void DrawSmile(void) /*Dibujar un Smiley*/
{
setfillstyle(SOLID_FILL, amarillo);
fillellipse(290, 75, 10, 10);
setcolor(amarillo);
setfillstyle(SOLID_FILL, negro); /*ojos*/
fillllellipse(285, 75, 2, 2);
fillllellipse (295, 75, 2, 2);
setcolor (negro); /*boca*/
bar(287, 80, 293, 81); /p>
}
Anular dibujar dflag (int i, int j)/*Mostrar bandera roja*/
{
set color(7 );
p>setfillstyle(SOLID_FILL, rojo);
bar(198 j*20, 95 i*20, 198 j*20 5, 95 I * 20 5);
setcolor(negro);
line(198 j*20, 95 i*20, 198 j*20, 95 I * 20 10);
}
Dibujo vacío vacío (int i, int j, int mode, int color)/*Mostrar dos tipos de espacios en blanco*/
{
setcolor( color);
setfillstyle(SOLID_FILL, color);
If(mode==0)/*Cuadrícula grande sin hacer clic*/
bar(200 j* 20-8, 100 i*20-8, 200 j*20 8, 100 I * 20 8);
Otros
If(mode==1)/*Haga clic en Cuadrícula de red pequeña en blanco*/
bar(200 j*20-7, 100 i*20-7, 200 j*20 7, 100 I * 20 7);
}
Ganancia de juego no válida (anular)/*pantalla de inicio del juego*/
{
int i, j;
borrar dispositivo( );
Si(¡jugar! =1)
{
MouseSetXY(290, 70); /*La posición inicial del mouse se utiliza como coordenada inicial*/
MouseX = 290
MouseY = 70
}
Juego = 1; /*El mouse no se reinicializará la próxima vez que presiones reiniciar*/
mineNUM = 0;
setfillstyle(SOLID_FILL, 7);
Bar(190, 60, 390, 290);
for(I = 0 ;I lt10; I )/*Dibujar una cuadrícula*/
for(j = 0;j lt10;j)
DrawEmpty(i, j, 0, 8);
establecer color(7);
dibujar sonrisa();/*
Dibuja una cara*/
randomize();__page_break__
for(I = 0; I lt10; I )/*100 cuadrados se asignan aleatoriamente si hay minas terrestres*/ p>
for(j = 0; j lt10; j )
{
Mi[i][j]. num = random(8); /*Si el resultado del número aleatorio es 1, significa que hay una mina en esta cuadrícula*/
if (my [i][j].num== 1)
p>minenum;/*Suma 1 al número de minas existentes*/
Otros
Mi [I] [j]. num = 2;
Mi[i][j]. flag = 0; /*Indica que no hay bandera roja*/
}
sprintf(randmineNUM, "d", mineNUM); /*Muestra el número total de minas esta vez* * * *
establecer color(1);
settextstyle(0, 0, 2);
outtextxy(210, 70, randmineNUM); p>
mineNUM = 100-mineNUM; /*El número de celdas en blanco en la variable*/
MouseOn();
}
Void GameOver(void) /*Pantalla final del juego*/
{
int i, j
set color(0); >for(I = 0;i lt10;i)
for(j = 0;j lt10;j)
Si(mi[i][j].num== 1)/ *Mostrar todas las minas*/
{
DrawEmpty(i, j, 0, RED);
setfillstyle(SOLID_FILL, black); /p>
fillllellipse(200 j * 20, 100 i*20, 7, 7
}
}
Void GameWin(void); )/* Mostrar victoria*/
{
set color(11
settextstyle(0, 0, 2); >outtextxy( 230, 30, "¡Tú ganas!");
}
Int MineStatistics(int i, int j)/*Cuenta el número de minas alrededor de cada cuadrícula*/
{
int nNUM = 0
if(I = = 0 amp; ampJ==0)/*Estadísticas de la cuadrícula superior izquierda*/ p>
{
if(mi[0][1]). num==1)
nnum;
if(mi[1][0]). num==1)
nnum;
if(mi[1][1].num==1)
nnum;
}
Otros
if(I = = 0 amp; ampJ==9)/*Estadísticas de la cuadrícula superior derecha*/
{
if(mi[0][8]). num==1)
nnum;
if(mi[1][9]). num==1)
nnum;
if(mi[1][8]).
num==1)
nnum;
}
Otros
if(I == 9 amp; ampJ==0) /*Estadísticas de la grilla en la esquina inferior izquierda*/
{
if(my[8][0]). num==1)
nnum;
if(mi[9][1]). num==1)
nnum;
if(mi[8][1]). num==1)
nnum;
}
Otros
if(I = = 9 amp; ampJ==9) /*Estadísticas de la grilla en la esquina inferior derecha*/
{
If (my[9][8]). num==1)
nnum;
if (mi[8][9]). num==1)
nnum;
if (mi[8][8]). num==1)
nnum;
}
Else if(j==0)/*Estadísticas del grid en la primera columna de la izquierda */
{
if(mi[i][j 1]). num==1)
nnum;
if(mi[i 1][j].num==1)
nnum;
if(mi[i-1][j].num==1)
nnum;
if(mi[i-1][j 1 ]). num==1)
nnum;
if(mi[i 1][j 1]). num==1)
nnum;
}
Else if(j==9)/*Estadísticas del grid en la primera columna de la derecha */
{
if(mi[i][j-1]). num==1)
nnum;
if(mi[i 1][j].num==1)
nnum;
if(mi[i-1][j].num==1)
nnum;
if(mi[i-1][j- 1]) . num==1)
nnum;
if(mi[i 1][j-1]). num==1)
nnum;
}
Else if(i==0)/*Estadísticas de la primera grilla*/ p>
{
if(mi[i 1][j].num==1)
nnum;
if(mi [i][ j-1]). num==1)
nnum;
if(mi[i][j 1]). num==1)
nnum;
if(mi[i 1][j-1]). num==1)
nnum;
if(mi[i 1][j 1]). num==1)
nnum;
}
Else if(i==9)/*Estadísticas de la última grilla*/
{
if(mi[i-1][j].num==1)
nnum;
if(mi [i] [j-1]). num==1)
nnum;
if(mi[i][j 1]).
num==1)
nnum;
if(mi[i-1][j-1]). num==1)
nnum;
if(mi[i-1][j 1]). num==1)
nnum;
}
Else/*Estadísticas de cuadrícula normal*/
{
if(mi[i-1][j].num==1)
nnum;
if(mi[i-1][j 1] ). num==1)
nnum;
if(mi[i][j 1]). num==1)
nnum;
if(mi[i 1][j 1]). num==1)
nnum;
if(mi[i 1][j].num==1)
nnum;
si(mi[i 1][j-1]). num==1)
nnum;
if(mi[i][j-1]). num==1)
nnum;
if(mi[i-1][j-1]). num==1)
nnum;
}__page_break__
Return (nNUM); /*Devuelve los resultados estadísticos de cuántos relámpagos hay alrededor de la red* * * *
}
Int ShowWhite(int i, int j)/*Mostrar la parte en blanco sin campos minados*/
{
If(my[I][j].flag == 1 ||mine[I][j].num == 0)/*Si hay una bandera roja o la grilla ha sido procesada, no se emitirá ningún juicio made*/ p>
Return;
mineNUM-;/*La cuadrícula que muestra números o espacios indica que se ha procesado otra cuadrícula. Cuando todas las cuadrículas han sido procesadas, significa victoria*/.
if(my[i][j].roundnum==0. ampmy[i][j].num!=1)/*display space*/
{
DrawEmpty(i,j,1,7);
Mi[i][j]. num = 0;
}
Otros
if(my[i][j].roundnum!=0)/*Número de rayo de salida*/
{
DrawEmpty(i, j, 0, 8);
sprintf(randmineNUM, " d ", Mine[i][j]. round num );
setcolor(rojo);
outtextxy(195 j*20, 95 i*20, randmineNUM);
Mi [I][ j] . num = 0; /*Una cuadrícula que tiene números de relámpagos de salida indica que la cuadrícula se ha utilizado con 0*/
Return;
}
/* Muestra recursivamente todas las cuadrículas vacías en 8 direcciones*/
if (i!= 0 amp amp my[i-1][j].num!=1)
ShowWhite(i -1, j);
Si (i!= 0 amp ampj!= 9 amp amp my[i-1][j 1].num!=1)
ShowWhite (i-1, j 1);
if (j!= 9 amp amp my[i][j 1].
número! =1)
ShowWhite(i, j 1);
If (j!= 9 amp ampi!= 9 amp ampmy[i 1][j 1]. num!= 1)
ShowWhite(i 1, j 1);
if (i!= 9 amperios ampmy[i 1][j].num!=1 )
ShowWhite(i 1, j);
if (i!= 9 amp ampj!= 0 amp amp my[i 1][j-1]. num! =1)
ShowWhite(i 1, j-1);
Si (j!= 0 amp amp my[i][j-1].num!=1 )
ShowWhite(i, j-1);
if (i!= 0 amp ampj!= 0 amp amp my[i-1][j-1]. num! =1)
ShowWhite(i-1, j-1);
}
Juego vacío (void)/*proceso de juego*/
{
int i, j, Num/*Num se usa para recibir la función estadística y devolver cuántas minas hay alrededor de una cuadrícula*/
for( i = 0; i lt10; i )
for(j = 0; j lt10; j )
mi[i][j]. roundnum=MineStatistics(i,j);/*Calcular cuántas minas hay alrededor de cada cuadrícula*/
And (!kbhit())
{
If(LeftPress())/*Presione el botón izquierdo del mouse*/
{
mouse getxy();
if(MouseX gt; 280 amp ampMouseX lt300 amp ampMouseY gt65 amp amp mouselt85)/*Comenzar de nuevo*/
{
MouseOff();
juego de nuevo = 1;
Break;
}
if(MouseX gt; 190. ampMouseX lt390 amp ampMouseY gt90 amp amp mouse lt290)/*La posición actual del mouse está dentro de la cuadrícula*/ p>
{
j =(MouseX-190)/20;/*coordenada x*/
I =(MouseY-90)/20;/*coordenada y */
If(my[i][j].flag==1)/*Si la cuadrícula tiene una bandera roja, el clic izquierdo no es válido*/
Continuar;
if(my[i][j].num!=0)/*Si la grilla no se procesa*/
{
If(i de[i][j].
num==1)/*La cuadrícula en la que hace clic el mouse es una mina*/
{
MouseOff();
game over();/ *El juego falló */
Pausa;
}
Else/*La cuadrícula presionada por el mouse no es una mina*/
{
MouseOff();
Num=MineStatistics(i,j);
If(Num==0)/*Si no hay minas alrededor, use un algoritmo recursivo para mostrar una cuadrícula neta en blanco*/
ShowWhite(i,j);
Else/*Press grid. Hay minas alrededor*/
{
sprintf(randmineNUM, "d", Num /*Muestre el número de minas alrededor de la cuadrícula actual*/
<); p> setcolor(rojo);outtextxy(195 j*20, 95 i*20, randmineNUM);
mineNUM-;
}
MouseOn();
Mi[i][j]. num = 0 /*El número de minas alrededor de la cuadrícula seleccionada cambia a 0, lo que indica que la cuadrícula ha sido utilizada*/
if(mineNUM lt; 1)/*Victoria*/
{
GameWin();
Romper;
}
}
} p >
}
}
If(RightPress())/*Botón derecho del ratón y pulsación del teclado*/
{
mouse getxy();
if(MouseX gt; 190. ampMouseX lt390 amp ampMouseY gt90 amp amp mouse lt290)/*La posición actual del mouse está dentro de la cuadrícula*/
{
j =(MouseX-190)/20;/*coordenada x*/
I =(MouseY-90)/20;/*coordenada y*/
MouseOff();
if(my[i][j].flag==0 amp ampmy[i][j].num!=0)/*No hubo ninguna señal de alerta , pero ahora se muestra Salió*/
{
DrawRedflag(i,j);
Mi [i][j]. flag = 1;
}
Otros
If(my[i][j].flag==1)/*Si hay una bandera roja , Presione el botón derecho y la bandera roja desaparecerá*/
{
DrawEmpty(i, j, 0, 8);
Mi [i] [ j]. bandera = 0;
}
}
MouseOn()
Dormir(1); }
}
}