Ve svém minulém článku jsem krátce představil použití ncurses knihovny pro psaní interaktivních aplikací v textovém režimu v jazyce C. S ncurses , můžeme ovládat, kde a jak se text na terminálu zobrazí. Pokud prozkoumáte ncurses funkcí knihovny přečtením manuálových stránek zjistíte, že existuje spousta různých způsobů, jak zobrazit text, včetně tučného textu, barev, blikajícího textu, oken, ohraničení, grafických znaků a dalších funkcí, díky kterým vaše aplikace vynikne.
Programování a vývoj
- Blog vývojářů Red Hat
- Programování cheatů
- Vyzkoušejte zdarma:Předplatné Red Hat Learning
- eKniha:Úvod do programování s Bash
- Bash Shell Scripting Cheat Sheet
- Elektronická kniha:Modernizace podnikové Java
Pokud byste chtěli prozkoumat pokročilejší program, který demonstruje několik z těchto zajímavých funkcí, zde je jednoduchá hra „Hádej číslo“, aktualizovaná o použití ncurses . Program vybere náhodné číslo v rozsahu a poté požádá uživatele, aby opakovaně hádal, dokud nenajde tajné číslo. Když uživatel provede svůj odhad, program mu dá vědět, zda byl odhad příliš nízký nebo příliš vysoký.
Upozorňujeme, že tento program omezuje možná čísla od 0 do 7. Zachování hodnot v omezeném rozsahu jednociferných čísel usnadňuje použití funkce getch() pro přečtení jednoho čísla od uživatele. Také jsem použil getrandom systémové volání jádra pro generování náhodných bitů maskovaných číslem 7 pro výběr náhodného čísla od 0 (binární 0000) do 7 (binární 0111).
#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 */
}
Pomocí ncurses , můžeme přidat nějakou vizuální zajímavost. Pojďme přidat funkce pro zobrazení důležitého textu v horní části obrazovky a řádek se zprávou pro zobrazení informací o stavu v dolní části obrazovky.
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();
}
S těmito funkcemi můžeme sestavit hlavní část naší hry na hádání čísel. Nejprve program nastaví terminál pro ncurses , pak vybere náhodné číslo od 0 do 7. Po zobrazení číselné škály pak program vstoupí do smyčky, aby se uživatele zeptal na jeho odhad.
Když uživatel odhaduje, program poskytuje vizuální zpětnou vazbu. Pokud je odhad příliš nízký, program vytiskne pod číslem na obrazovce levou hranatou závorku. Pokud je odhad příliš vysoký, hra vytiskne pravou hranatou závorku. To pomáhá uživateli zúžit výběr, dokud neuhodne správné číslo.
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;
}
Zkopírujte si tento program a zkompilujte si ho pro sebe, abyste si to vyzkoušeli. Nezapomeňte, že musíte říct GCC, aby se propojilo s ncurses knihovna:
$ gcc -o guess guess.c -lncurses
Ponechal jsem tam řádek ladění, takže tajné číslo můžete vidět v pravém horním rohu obrazovky:
Rozjeďte se s ncurses
Tento program využívá spoustu dalších funkcí ncurses které můžete použít jako výchozí bod. Například funkce print_header vytiskne zprávu tučným textem se středem v horní části obrazovky a funkce print_status vytiskne zprávu v obráceném textu v levé dolní části obrazovky. Použijte to, abyste mohli začít s ncurses programování.