In meinem letzten Artikel habe ich eine kurze Einführung in die Verwendung des ncurses Bibliothek zum Schreiben interaktiver Anwendungen im Textmodus in C. Mit ncurses, können wir steuern, wo und wie Text auf dem Terminal angezeigt wird. Wenn Sie die . erkunden ncurses Bibliotheksfunktionen Wenn Sie die Handbuchseiten lesen, werden Sie feststellen, dass es viele verschiedene Möglichkeiten gibt, Text anzuzeigen, einschließlich Fettschrift, Farben, blinkender Text, Fenster, Rahmen, Grafikzeichen und andere Funktionen, die Ihre Anwendung hervorheben.
Wenn Sie ein fortgeschritteneres Programm erkunden möchten, das einige dieser interessanten Funktionen demonstriert, finden Sie hier ein einfaches „Rate die Zahl“-Spiel, das für die Verwendung aktualisiert wurde ncurses. Das Programm wählt eine Zufallszahl in einem Bereich aus und fordert den Benutzer dann auf, wiederholt zu raten, bis er die Geheimzahl gefunden hat. Während der Benutzer seine Schätzung macht, teilt ihm das Programm mit, ob die Schätzung zu niedrig oder zu hoch war.
Beachten Sie, dass dieses Programm die möglichen Zahlen von 0 bis 7 begrenzt. Wenn Sie die Werte auf einen begrenzten Bereich von einstelligen Zahlen beschränken, wird die Verwendung erleichtert getch() um eine einzelne Zahl vom Benutzer zu lesen. die habe ich auch benutzt zufällig Kernel-Systemaufruf zum Generieren von Zufallsbits, maskiert mit der Zahl 7, um eine Zufallszahl von 0 (binär 0000) bis 7 (binär 0111) auszuwählen.
#include <curses.h>
#include <string.h> /* for strlen */
#include <sys/random.h> /* for getrandom */
int
random0_7()
{
int num;
getrandom(&num, sizeof(int), GRND_NONBLOCK);
return (num & 7); /* from 0000 to 0111 */
}
int
read_guess()
{
int ch;
do {
ch = getch();
} while ((ch < '0') || (ch > '7'));
return (ch - '0'); /* turn into a number */
}
Durch die Nutzung ncurses, können wir etwas visuelles Interesse hinzufügen. Lassen Sie uns Funktionen hinzufügen, um wichtigen Text oben auf dem Bildschirm anzuzeigen, und eine Nachrichtenzeile, um Statusinformationen unten auf dem Bildschirm anzuzeigen.
void
print_header(const char *text)
{
move(0, 0);
clrtoeol();
attron(A_BOLD);
mvaddstr(0, (COLS / 2) - (strlen(text) / 2), text);
attroff(A_BOLD);
refresh();
}
void
print_status(const char *text)
{
move(LINES - 1, 0);
clrtoeol();
attron(A_REVERSE);
mvaddstr(LINES - 1, 0, text);
attroff(A_REVERSE);
refresh();
}
Mit diesen Funktionen können wir den Hauptteil unseres Zahlenrätselspiels konstruieren. Zuerst richtet das Programm das Terminal für ncurses, wählt dann eine Zufallszahl von 0 bis 7. Nach der Anzeige einer Zahlenskala tritt das Programm dann in eine Schleife ein, um den Benutzer nach seiner Schätzung zu fragen.
Während der Benutzer seine Vermutungen anstellt, gibt das Programm visuelles Feedback. Wenn die Schätzung zu niedrig ist, druckt das Programm eine linke eckige Klammer unter der Zahl auf dem Bildschirm. Wenn die Schätzung zu hoch ist, druckt das Spiel eine rechte eckige Klammer. Dies hilft dem Benutzer, seine Auswahl einzugrenzen, bis er die richtige Zahl erraten hat.
int
main()
{
int number, guess;
initscr();
cbreak();
noecho();
number = random0_7();
mvprintw(1, COLS - 1, "%d", number); /* debugging */
print_header("Guess the number 0-7");
mvaddstr(9, (COLS / 2) - 7, "0 1 2 3 4 5 6 7");
print_status("Make a guess...");
do {
guess = read_guess();
move(10, (COLS / 2) - 7 + (guess * 2));
if (guess < number) {
addch('[');
print_status("Too low");
}
else if (guess > number) {
addch(']');
print_status("Too high");
}
else {
addch('^');
}
} while (guess != number);
print_header("That's right!");
print_status("Press any key to quit");
getch();
endwin();
return 0;
}
Kopieren Sie dieses Programm und kompilieren Sie es selbst, um es auszuprobieren. Vergiss nicht, dass du GCC mitteilen musst, dass es mit dem verlinken soll ncurses Bücherei:
$ gcc -o guess guess.c -lncurses
Ich habe die Debugging-Zeile dort gelassen, damit Sie die Geheimnummer in der oberen rechten Ecke des Bildschirms sehen können:
ratenumber07.png
Abbildung 1: Errate das Zahlenspiel. Beachten Sie die Geheimnummer oben rechts.
Bring dich in Schwung mit ncurses
Dieses Programm verwendet eine Reihe anderer Funktionen von ncurses die Sie als Ausgangspunkt verwenden können. Beispielsweise druckt die Funktion print_header eine Nachricht in Fettdruck zentriert am oberen Rand des Bildschirms, und die Funktion print_status druckt eine Nachricht in umgekehrtem Text unten links auf dem Bildschirm. Verwenden Sie dies, um Ihnen den Einstieg zu erleichtern ncurses Programmierung.