一、什么是ncurses
ncurses是一套编程库,它提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。使用ncurses库,您可以在终端中创建复杂的文本界面,包括窗口、菜单、按钮、文本框等。您可以使用函数来控制光标的位置,以及在终端上输出文本和图形。此外,ncurses库还提供了处理键盘和鼠标输入的功能,以及对终端的颜色和属性进行控制。不少组件比如vim、screen等是调用了ncurses
二、ncurses的安装
跟其他的rpm包安装是一样的
sudo yum install ncurses-devel.x86_64
三、ncurses的使用
介绍几个比较常见的库函数
initscr():初始化ncurses库
endwin():退出ncurses库
getch(): 获取键盘敲的字符
mvgetch(int a, int b):指定位置获取键盘敲的字符
move(int a, int b):移动光标
getyx(WINDOW *win, int y, int x):获取当前光标
WINDOW *newwin(int nlines, int ncols, int y, int x):创建新窗口
delwin(WINDOW *win):删除窗口
PANEL *new_panel(WINDOW *win):创建新面板
start_color():启动颜色功能
init_pair(short pair, short foreground, short background):初始化颜色对
...
四、基于ncurses库简单的贪食蛇
#include <ncurses.h>
#include <stdlib.h>
#include <unistd.h>
#define DELAY 100000
typedef struct {
int x, y;
} Point;
typedef enum {
UP, DOWN, LEFT, RIGHT
} Direction;
int main() {
// 初始化窗口
initscr();
noecho(); // 不在终端上显示输入字符
curs_set(FALSE); // 隐藏光标
keypad(stdscr, TRUE); // 启用键盘输入
int max_x = 0, max_y = 0;
getmaxyx(stdscr, max_y, max_x);
// 初始化蛇和食物
Point snake[100];
int snake_length = 1;
snake[0].x = max_x / 2;
snake[0].y = max_y / 2;
Direction dir = RIGHT;
Point food;
food.x = rand() % max_x;
food.y = rand() % max_y;
int score = 0;
while (1) {
clear();
// 绘制蛇头和身体
for (int i = 0; i < snake_length; i++) {
mvprintw(snake[i].y, snake[i].x, "o");
}
// 绘制食物
mvprintw(food.y, food.x, "*");
// 显示得分
mvprintw(0, 0, "Score: %d", score);
refresh();
usleep(DELAY);
// 处理按键输入
int ch = getch();
switch (ch) {
case KEY_UP:
dir = UP;
break;
case KEY_DOWN:
dir = DOWN;
break;
case KEY_LEFT:
dir = LEFT;
break;
case KEY_RIGHT:
dir = RIGHT;
break;
case 'q':
endwin();
return 0;
}
// 移动蛇头
switch (dir) {
case UP:
snake[0].y--;
break;
case DOWN:
snake[0].y++;
break;
case LEFT:
snake[0].x--;
break;
case RIGHT:
snake[0].x++;
break;
}
// 检查是否吃到食物
if (snake[0].x == food.x && snake[0].y == food.y) {
// 更新得分
score++;
// 随机生成新的食物位置
food.x = rand() % max_x;
food.y = rand() % max_y;
// 增加蛇的长度
snake_length++;
}
// 检查是否碰到自己的身体或墙壁
if (snake[0].x >= max_x || snake[0].x < 0 || snake[0].y >= max_y || snake[0].y < 0) {
endwin();
printf("Game Over!\n");
return 0;
}
for (int i = 1; i < snake_length; i++) {
if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) {
endwin();
printf("Game Over!\n");
return 0;
}
}
// 移动蛇的身体
for (int i = snake_length - 1; i > 0; i--) {
snake[i] = snake[i - 1];
}
}
endwin();
return 0;
}