当前位置: 首页 > news >正文

Linux 基础入门操作 第十一章 图形界面设计

1 curses介绍

1.1 背景介绍

curses是一个用于文本终端屏幕控制和处理的库,广泛应用于 Unix 和类 Unix 系统(如 Linux 和 macOS)。它允许开发者创建基于文本的用户界面(TUI),支持窗口管理、颜色处理、键盘输入等功能。

Linux/Unix 编程给人的感觉就比较"cool"一点,好像 Linux 编程都是在黑黑的终端下进行的。确实是这样,许多 Linux 高手都喜欢在终端方式下工作,熟悉了一些命令以后,这样的工作方式效率还是很高的。但是长久地看着黑黑的屏幕难免让人感到厌倦,有没有一种工具能让我们在 Linux 下编出好看的图形呢?答案是肯定的,它就是 curses!

curses 的名字起源于"cursor optimization",即光标优化。它最早由有美国伯克利大学的 Bill Joy 和 KenArnold 编写的,用来处理一个游戏 rogue 的屏幕显示。后来贝尔实验室的 Mark Horton 在 System III Unix中重新编写了 curses。现在几乎所有的 Unix/Linux 操作系统都带了 curses 函数库,curses 也加入了对鼠标的支持,一些菜单和面板的处理。可以说,curses 是 Linux 终端图形编程的不二选择(比如著名的文字编辑器 vi 就是基于 curses 编的)。

1.2 系统安装

uptech@uptech-virtual-machine:~/桌面/project/build$ sudo apt-get install libncurses5-dev

1.3 makefile系统调用

  1. 包含头文件: curses.h
  2. 编译时应加上链接语句-lcurses,如:gcc temp.c -o temp -lcurses

1.4 cmake 系统调用

添加头文件路径、添加curses的库

find_package(Curses REQUIRED)
include_directories(${Curses_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME}
    ${OpenCV_LIBS}  # 链接 OpenCV
	#    Threads::Threads  # 链接多线程库
	pthread
	curses
)

1.5 常见的函数

在这里插入图片描述

1.6基本使用步骤

初始化:使用 initscr() 初始化 curses 环境。

关闭回显:调用 noecho() 禁止输入字符自动回显。

启用特殊键:使用 keypad(stdscr, True) 启用特殊键处理。

刷新屏幕:通过 refresh() 更新屏幕显示。

结束:调用 endwin() 恢复终端原始状态并退出

2 游戏设计

2.1 初始化工作

参考以下代码,进行初始化操作就行。

  initscr();   // 初始化屏幕
  cbreak();    // 禁用缓存,,使输入字符立即传递给程序,而不需要等待回车键
  noecho();    // 关闭输入回显,户输入的字符不会显示在屏幕上。
  keypad(stdscr, TRUE); // make keys work,启用特殊键  启用特殊键(如方向键、功能键等)的处理
  curs_set(0); // hide cursor
  timeout(100);  // 阻塞等待时间,getch 等待100ms
   int xmax;
  int ymax;
  getmaxyx(stdscr, ymax, xmax);  // 获取屏幕长度和宽度,是一个宏定义,不是函数
  enum Direction dir = RIGHT;

2.2 创建蛇、食物

创建蛇的单向链表,食物的单向链接

  Board* create_board(PointList* snake, PointList* foods, int xmax, int ymax) {
  Board* board = malloc(sizeof(*board));
  board->foods = foods;
  board->snake = snake;
  board->xmax = xmax;
  board->ymax = ymax;
  return board;
}

void add_new_food(Board* board) {
  PointList* new_food;
  do {
    new_food = create_random_cell(board->xmax, board->ymax);
  } while(list_contains(new_food, board->foods) || list_contains(new_food, board->snake));
  new_food->next = board->foods;
  board->foods = new_food;
}

  Board* board = create_board(create_snake(), NULL, xmax, ymax);
  int i;
  for (i = 0; i < 6; i++) {
    add_new_food(board);
  }

2.3 显示移动策略选择

while(true) {
    clear();  // 将整个萤幕清除(请注意配合 refresh() 使用)
    display_points(board->snake, ACS_BLOCK);  // 显示蛇
    display_points(board->foods, ACS_DIAMOND);  // 显示食物
    refresh();   // 刷新屏幕,使之前的所有更改生效。
    dir = get_next_move(dir);
    enum Status status = move_snake(board, dir);
    if (status == FAILURE) break;
  }

2.4 关闭屏幕

 endwin();   //  退出 curses 模式,恢复终端的原始状态。

2.5 显示效果

在这里插入图片描述

3 简单显示界面

3.1 简单应用代码

#include <curses.h>

int main() {
    // 初始化 curses
    initscr();              // 初始化屏幕
    cbreak();               // 禁用行缓冲,直接读取输入
    noecho();               // 关闭输入回显
    keypad(stdscr, TRUE);   // 启用特殊键(如方向键)

    // 打印欢迎信息
    printw("Hello, Curses!\n");
    printw("Press any key to exit...\n");
    refresh();              // 刷新屏幕以显示内容

    // 等待用户输入
    getch();                // 获取用户输入的字符

    // 结束 curses 模式
    endwin();               // 恢复终端原始状态

    return 0;
}

3.2 显示界面

在这里插入图片描述

4 总结

实际项目案例,以下是一些使用 curses 开发的实际项目:

vim 和 nano:

流行的文本编辑器,使用 curses 实现界面和交互。

htop:

系统监控工具,使用 curses 实时显示系统状态。

tmux:

终端复用工具,使用 curses 管理多个终端窗口。

Nethack:

经典的 Roguelike 游戏,使用 curses 实现图形界面和交互。

ncurses 自带的演示程序:

例如 testcurs,展示了 curses 的各种功能。

适用于终端应用程序、游戏、系统监控工具等场景,是开发高效、轻量级命令行工具的重要工具库。尽管功能受限,但在合适的场景下,curses 仍然是一个非常强大且实用的工具。

相关文章:

  • 【day2】数据结构刷题 栈
  • 【linux】线程概念与控制
  • 05STM32定时器-01定时器概述
  • C#测试基于OllamaSharp调用本地DeepSeek模型
  • AI基础01-文本数据采集
  • TCP/IP协议的三次握手和四次挥手
  • python爬虫Redis数据库
  • Win32桌面编程:ACLUI.DLL,EditSecurity(IntPtr hwndOwner, ISecurityInformation psi)
  • Unity代码热更新和资源热更新
  • Elasticsearch原生linux部署集群 和docker部署集群
  • 基于深度学习的相位调制算法步骤
  • Noe.js 原生 http 模块 vs Express 框架对比
  • 【leetcode题解】贪心算法
  • AI重构SEO关键词优化路径
  • docker安装在D盘/docker迁移到D盘
  • 用数组模拟循环队列
  • js中console 打印有哪些格式?
  • XSS Game(DOM型) 靶场 通关
  • GitHub 发现 ruby-saml 严重漏洞,账户安全岌岌可危
  • 手撕算法——链表
  • 4月国产新能源,降价潮迈入拐点
  • 中山大学人类学系原系主任冯家骏逝世,享年95岁
  • 卢正已任上海市司法局党委委员、副局长
  • 李在明正式登记参选下届韩国总统
  • “爱鸟周”为何不能像FI和花展那样“市区联动”
  • 胖东来发布和田玉、翡翠退货说明:不扣手续费等任何费用