Función main()
En la función main()
, primero llamamos a la función de inicialización init()
, y luego entramos en el bucle while()
. El bucle se compone principalmente de tres partes:
- Verificar la entrada del usuario: Si se presiona la tecla "w" o la barra espaciadora, el pájaro se moverá dos filas hacia arriba. Si se presiona la tecla "q", el juego se cerrará. Si se presiona la tecla "z", el juego se pausará.
- Mover el pájaro y redibujarlo.
- Verificar si el pájaro choca con las tuberías.
Echemos un vistazo al código:
int main()
{
char ch;
init();
while(1)
{
ch = getch(); // Obtener la entrada del teclado
if(ch == ' ' || ch == 'w' || ch == 'W') // Si se presiona la barra espaciadora o la tecla "w"
{
// Mover el pájaro y redibujarlo
move(bird_y, bird_x);
addch(CHAR_BLANK);
refresh();
bird_y--;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
// Si el pájaro choca con las tuberías, terminar el juego
if((char)inch() == CHAR_STONE)
{
set_ticker(0);
sleep(1);
endwin();
exit(0);
}
}
else if(ch == 'z' || ch == 'Z') // Pausa
{
set_ticker(0);
do
{
ch = getch();
} while(ch!= 'z' && ch!= 'Z');
set_ticker(ticker);
}
else if(ch == 'q' || ch == 'Q') // Salir
{
sleep(1);
endwin();
exit(0);
}
}
return 0;
}
En la función main()
, primero inicializamos la pantalla, y luego recibimos la entrada del teclado en un bucle. Si se presiona la tecla "w" o la barra espaciadora, el pájaro se moverá dos filas hacia arriba. Si se presiona la tecla "q", el juego se cerrará. Si se presiona la tecla "z", el juego se pausará.
Ahora echemos un vistazo a la función init()
:
void init()
{
initscr();
cbreak();
noecho();
curs_set(0);
srand(time(0));
signal(SIGALRM, drop);
init_bird();
init_head();
init_wall();
init_draw();
sleep(1);
ticker = 500;
set_ticker(ticker);
}
La función init()
primero inicializa la pantalla utilizando funciones proporcionadas por ncurses
. Luego llama a varias sub-funciones para realizar inicializaciones específicas. Tenga en cuenta que instalamos una función manejadora de señales drop()
, y establecemos el intervalo del temporizador.
Echemos un vistazo a cada sub-función de inicialización.
La función init_bird()
inicializó la posición del pájaro:
void init_bird()
{
bird_x = 5;
bird_y = 15;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
sleep(1);
}
Las funciones init_head()
e init_wall()
inicializan una lista enlazada para almacenar las tuberías:
void init_head()
{
Node tmp;
tmp = (node *)malloc(sizeof(node));
tmp->next = NULL;
head = tmp;
tail = head;
}
void init_wall()
{
int i;
Node tmp, p;
p = head;
for(i = 0; i < 5; i++)
{
tmp = (node *)malloc(sizeof(node));
tmp->x = (i + 1) * 19;
tmp->y = rand() % 11 + 5;
p->next = tmp;
tmp->next = NULL;
p = tmp;
}
tail = p;
}
La función init_draw()
inicializa la pantalla:
void init_draw()
{
Node p;
int i, j;
// Recorrer la lista enlazada
for(p = head->next; p->next!= NULL; p = p->next)
{
// Dibujar las tuberías
for(i = p->x; i > p->x-10; i--)
{
for(j = 0; j < p->y; j++)
{
move(j, i);
addch(CHAR_STONE);
}
for(j = p->y+5; j <= 23; j++)
{
move(j, i);
addch(CHAR_STONE);
}
}
refresh();
sleep(1);
}
}
Con esto, nuestro juego flappy_bird está completo.