Fonction main()
Dans la fonction main()
, nous appelons tout d'abord la fonction d'initialisation init()
, puis nous entrons dans la boucle while()
. La boucle se compose principalement de trois parties :
- Vérifier l'entrée de l'utilisateur : Si la touche "w" ou la barre d'espace est pressée, l'oiseau ira deux lignes en haut. Si la touche "q" est pressée, le jeu se terminera. Si la touche "z" est pressée, le jeu se mettra en pause.
- Déplacer l'oiseau et le redessiner.
- Vérifier si l'oiseau heurte les tuyaux.
Voici le code :
int main()
{
char ch;
init();
while(1)
{
ch = getch(); // Obtenir l'entrée clavier
if(ch == ' ' || ch == 'w' || ch == 'W') // Si la barre d'espace ou la touche "w" est pressée
{
// Déplacer l'oiseau et le redessiner
move(bird_y, bird_x);
addch(CHAR_BLANK);
refresh();
bird_y--;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
// Si l'oiseau heurte les tuyaux, finir le jeu
if((char)inch() == CHAR_STONE)
{
set_ticker(0);
sleep(1);
endwin();
exit(0);
}
}
else if(ch == 'z' || ch == 'Z') // Mettre en pause
{
set_ticker(0);
do
{
ch = getch();
} while(ch!= 'z' && ch!= 'Z');
set_ticker(ticker);
}
else if(ch == 'q' || ch == 'Q') // Quitter
{
sleep(1);
endwin();
exit(0);
}
}
return 0;
}
Dans la fonction main()
, nous initialisons d'abord l'écran, puis nous recevons l'entrée clavier dans une boucle. Si la touche "w" ou la barre d'espace est pressée, l'oiseau ira deux lignes en haut. Si la touche "q" est pressée, le jeu se terminera. Si la touche "z" est pressée, le jeu se mettra en pause.
Maintenant, voyons la fonction 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 fonction init()
initialise d'abord l'écran à l'aide de fonctions fournies par ncurses
. Ensuite, elle appelle plusieurs sous-fonctions pour effectuer des initialisations spécifiques. Notez que nous installons une fonction de gestionnaire de signaux drop()
, et que nous définissons l'intervalle du minuteur.
Regardons chaque sous-fonction d'initialisation.
La fonction init_bird()
initialise la position de l'oiseau :
void init_bird()
{
bird_x = 5;
bird_y = 15;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
sleep(1);
}
Les fonctions init_head()
et init_wall()
initialisent une liste chaînée pour stocker les tuyaux :
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 fonction init_draw()
initialise l'écran :
void init_draw()
{
Node p;
int i, j;
// Parcourir la liste chaînée
for(p = head->next; p->next!= NULL; p = p->next)
{
// Dessiner les tuyaux
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);
}
}
Avec cela, notre jeu flappy_bird est terminé.