main()
-Funktion
In der main()
-Funktion rufen wir zunächst die Initialisierungsfunktion init()
auf und gehen dann in die while()
-Schleife ein. Die Schleife besteht hauptsächlich aus drei Teilen:
- Überprüfen Sie die Benutzereingabe: Wenn die Taste "w" oder die Leertaste gedrückt wird, bewegt sich der Vogel um zwei Zeilen nach oben. Wenn die Taste "q" gedrückt wird, wird das Spiel beendet. Wenn die Taste "z" gedrückt wird, wird das Spiel pausiert.
- Bewegen Sie den Vogel und zeichnen Sie ihn neu.
- Überprüfen Sie, ob der Vogel die Rohre trifft.
Schauen wir uns den Code an:
int main()
{
char ch;
init();
while(1)
{
ch = getch(); // Holen Sie die Tastatureingabe
if(ch == ' ' || ch == 'w' || ch == 'W') // Wenn die Leertaste oder die Taste "w" gedrückt wird
{
// Bewegen Sie den Vogel und zeichnen Sie ihn neu
move(bird_y, bird_x);
addch(CHAR_BLANK);
refresh();
bird_y--;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
// Wenn der Vogel die Rohre trifft, beenden Sie das Spiel
if((char)inch() == CHAR_STONE)
{
set_ticker(0);
sleep(1);
endwin();
exit(0);
}
}
else if(ch == 'z' || ch == 'Z') // Pause
{
set_ticker(0);
do
{
ch = getch();
} while(ch!= 'z' && ch!= 'Z');
set_ticker(ticker);
}
else if(ch == 'q' || ch == 'Q') // Beenden
{
sleep(1);
endwin();
exit(0);
}
}
return 0;
}
In der main()
-Funktion initialisieren wir zunächst den Bildschirm und empfangen dann in einer Schleife die Tastatureingaben. Wenn die Taste "w" oder die Leertaste gedrückt wird, bewegt sich der Vogel um zwei Zeilen nach oben. Wenn die Taste "q" gedrückt wird, wird das Spiel beendet. Wenn die Taste "z" gedrückt wird, wird das Spiel pausiert.
Schauen wir uns nun die init()
-Funktion an:
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);
}
Die init()
-Funktion initialisiert zunächst den Bildschirm mit Funktionen von ncurses
. Anschließend ruft sie mehrere Hilfsfunktionen auf, um spezifische Initialisierungen durchzuführen. Beachten Sie, dass wir eine Signalbehandlungsfunktion drop()
installieren und das Zeitintervall des Timers festlegen.
Schauen wir uns jede Initialisierungs-Hilfsfunktion an.
Die init_bird()
-Funktion initialisiert die Position des Vogels:
void init_bird()
{
bird_x = 5;
bird_y = 15;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
sleep(1);
}
Die init_head()
- und init_wall()
-Funktionen initialisieren eine verkettete Liste, um die Rohre zu speichern:
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;
}
Die init_draw()
-Funktion initialisiert den Bildschirm:
void init_draw()
{
Node p;
int i, j;
// Iterieren Sie über die verkettete Liste
for(p = head->next; p->next!= NULL; p = p->next)
{
// Zeichnen Sie die Rohre
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);
}
}
Mit diesem ist unser Flappy-Bird-Spiel abgeschlossen.