Linux中國

通過 ncurses 在 Linux 上寫一個猜謎遊戲

在我的 上一篇文章,我簡要介紹了使用 ncurses 庫通過 C 語言編寫文本模式互動式應用程序。使用 ncurses,我們可以控制文本在終端上的顯示位置和方式。如果你通過閱讀手冊頁探索 ncurses 庫函數,你會發現顯示文本有很多不同的方式,包括粗體文本、顏色、閃爍文本、窗口、邊框、圖形字元和其它功能,這些都可以使你的應用脫穎而出。

如果你想探索一個更高級的程序來演示其中一些有趣的功能,有一個簡單的「猜數字」遊戲,我已更新為使用 ncurses 編寫的了。該程序在一個範圍內選擇一個隨機數,然後要求用戶進行重複猜測,直到他們猜到這個秘密數字。當用戶進行猜測時,程序會告知他們猜測的數字是太低還是太高。

請注意,程序限定可能的數字範圍是 0 到 7。將值保持在有限的個位數數字範圍內,可以更輕鬆的使用 getch() 函數從用戶讀取單個數字。我還使用了 getrandom 內核系統調用來生成隨機數,設定數字最大值為 7,以從 0 (二進位 0000)到 7 (二進位 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 < &apos;0&apos;) || (ch > &apos;7&apos;));

  return (ch - &apos;0&apos;); /* turn into a number */
}

通過使用 ncurses,我們可以增加一些有趣的視覺體驗。通過添加函數,我們可以在屏幕頂部顯示重要的文本信息,在屏幕底部顯示狀態消息行:

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();
}

通過這些函數,我們就可以構建猜數字遊戲的主要部分。首先,程序為 ncurses 設置終端,然後從 0 到 7 中選擇一個隨機數。顯示數字刻度後,程序啟動一個循環,詢問用戶的猜測。

當用戶進行猜測時,程序會在屏幕上提供反饋。如果猜測太低,程序會在屏幕上的數字下方列印一個左方括弧。如果猜測太高,程序會在屏幕上的數字下方列印一個右方括弧。這有助於用戶縮小他們的選擇範圍,直到他們猜出正確的數字。

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(&apos;[&apos;);
      print_status("Too low");
    }

    else if (guess > number) {
      addch(&apos;]&apos;);
      print_status("Too high");
    }

    else {
      addch(&apos;^&apos;);
    }
  } while (guess != number);

  print_header("That&apos;s right!");
  print_status("Press any key to quit");
  getch();

  endwin();

  return 0;
}

複製這個程序,自己嘗試編譯它。不要忘記你需要告訴 GCC 編譯器鏈接到 ncurses 庫:

$ gcc -o guess guess.c -lncurses

我留下了一個調試行,所以你可以看到屏幕右上角附近的秘密數字:

guess number game interface

圖1:猜數字遊戲。注意右上角的秘密數字。

開始使用 ncurses

該程序使用了 ncurses 的許多其它函數,你可以從這些函數開始。例如,print_header 函數在屏幕頂部居中以粗體文本列印消息,print_status 函數在屏幕左下角以反向文本列印消息。使用它來幫助你開始使用 ncurses 編程。

via: https://opensource.com/article/21/8/guess-number-game-ncurses-linux

作者:Jim Hall 選題:lujun9972 譯者:perfiffer 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國