通過 ncurses 在 Linux 上寫一個猜謎游戲
使用 ncurses 的靈活性和強大功能在 Linux 上創(chuàng)建一個猜數(shù)字游戲。
在我的 上一篇文章,我簡要介紹了使用 ncurses 庫通過 C 語言編寫文本模式交互式應用程序。使用 ncurses,我們可以控制文本在終端上的顯示位置和方式。如果你通過閱讀手冊頁探索 ncurses 庫函數(shù),你會發(fā)現(xiàn)顯示文本有很多不同的方式,包括粗體文本、顏色、閃爍文本、窗口、邊框、圖形字符和其它功能,這些都可以使你的應用脫穎而出。
如果你想探索一個更高級的程序來演示其中一些有趣的功能,有一個簡單的“猜數(shù)字”游戲,我已更新為使用 ncurses 編寫的了。該程序在一個范圍內選擇一個隨機數(shù),然后要求用戶進行重復猜測,直到他們猜到這個秘密數(shù)字。當用戶進行猜測時,程序會告知他們猜測的數(shù)字是太低還是太高。
請注意,程序限定可能的數(shù)字范圍是 0 到 7。將值保持在有限的個位數(shù)數(shù)字范圍內,可以更輕松的使用 getch() 函數(shù)從用戶讀取單個數(shù)字。我還使用了 getrandom 內核系統(tǒng)調用來生成隨機數(shù),設定數(shù)字最大值為 7,以從 0 (二進制 0000)到 7 (二進制 0111)中選擇一個隨機數(shù)。
#include <curses.h>;#include <string.h>; /* for strlen */#include <sys/random.h>; /* for getrandom */intrandom0_7(){int num;getrandom(&num, sizeof(int), GRND_NONBLOCK);return (num & 7); /* from 0000 to 0111 */}intread_guess(){int ch;do {ch = getch();} while ((ch < '0') || (ch > '7'));return (ch - '0'); /* turn into a number */}
通過使用 ncurses,我們可以增加一些有趣的視覺體驗。通過添加函數(shù),我們可以在屏幕頂部顯示重要的文本信息,在屏幕底部顯示狀態(tài)消息行:
voidprint_header(const char *text){move(0, 0);clrtoeol();attron(A_BOLD);mvaddstr(0, (COLS / 2) - (strlen(text) / 2), text);attroff(A_BOLD);refresh();}voidprint_status(const char *text){move(LINES - 1, 0);clrtoeol();attron(A_REVERSE);mvaddstr(LINES - 1, 0, text);attroff(A_REVERSE);refresh();}
通過這些函數(shù),我們就可以構建猜數(shù)字游戲的主要部分。首先,程序為 ncurses 設置終端,然后從 0 到 7 中選擇一個隨機數(shù)。顯示數(shù)字刻度后,程序啟動一個循環(huán),詢問用戶的猜測。
當用戶進行猜測時,程序會在屏幕上提供反饋。如果猜測太低,程序會在屏幕上的數(shù)字下方打印一個左方括號。如果猜測太高,程序會在屏幕上的數(shù)字下方打印一個右方括號。這有助于用戶縮小他們的選擇范圍,直到他們猜出正確的數(shù)字。
intmain(){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;}
復制這個程序,自己嘗試編譯它。不要忘記你需要告訴 GCC 編譯器鏈接到 ncurses 庫:
$ gcc -o guess guess.c -lncurses
我留下了一個調試行,所以你可以看到屏幕右上角附近的秘密數(shù)字:
圖1:猜數(shù)字游戲。注意右上角的秘密數(shù)字。
開始使用 ncurses
該程序使用了 ncurses 的許多其它函數(shù),你可以從這些函數(shù)開始。例如,print_header 函數(shù)在屏幕頂部居中以粗體文本打印消息,print_status 函數(shù)在屏幕左下角以反向文本打印消息。使用它來幫助你開始使用 ncurses 編程。

















 
 
 







 
 
 
 