【Linux拓展】ncurses库的安装和使用 {ncurses库的安装方法,ncurses库的使用手册,基于终端的贪吃蛇游戏}

一、简介

ncurses库是一个用于创建基于终端的交互式应用程序的库。它提供了一套API,用于处理终端界面的输入和输出,以及控制终端的光标位置、颜色、窗口等。

使用ncurses库,您可以在终端中创建复杂的文本界面,包括窗口、菜单、按钮、文本框等。您可以使用函数来控制光标的位置,以及在终端上输出文本和图形。此外,ncurses库还提供了处理键盘和鼠标输入的功能,以及对终端的颜色和属性进行控制。

ncurses库的主要特点包括:

  1. 跨平台:ncurses库可以在多个操作系统上使用,包括Linux、Unix、macOS等。

  2. 终端独立性:ncurses库可以在不同类型的终端上运行,而不需要关心底层终端的特定细节。

  3. 窗口管理:ncurses库提供了创建和管理窗口的功能,可以在终端中创建多个窗口,并在窗口之间进行切换。

  4. 颜色和属性:ncurses库支持在终端中使用不同的颜色和属性,以增强界面的可读性和视觉效果。

  5. 键盘和鼠标输入:ncurses库提供了处理键盘和鼠标输入的功能,可以捕捉用户的输入并作出相应的响应。

  6. 动画和定时器:ncurses库支持创建动画效果和定时器,可以在终端中实现交互式的动态效果。

ncurses库是一个功能强大且广泛使用的库,常用于开发终端界面的应用程序,如文本编辑器、终端游戏、系统管理工具等。它提供了丰富的功能和灵活的接口,使开发者能够轻松地创建复杂的终端界面和交互式应用程序。


二、安装方法

在CentOS 7上安装ncurses库,您可以按照以下步骤进行操作:

  1. 打开终端。

  2. 运行以下命令更新系统软件包:

sudo yum update
  1. 运行以下命令安装ncurses库及其开发文件:
sudo yum install ncurses-devel.x86_64
  1. 安装过程中,系统会提示您输入root密码以确认安装。输入密码并按下回车键。

  2. 安装完成后,在/lib64目录下查看是否成功安装ncurses库
    在这里插入图片描述

  3. 现在您可以使用ncurses库来开发和构建基于终端的应用程序了。要编译使用ncurses库的程序,可以使用以下命令:

gcc -o myprogram myprogram.c -l ncurses

请确保在编译时使用了-l ncurses选项来链接ncurses库。


三、使用手册

以下是一些常用的ncurses库函数和用法的简要说明:

  1. 初始化和清理:
  • initscr():初始化ncurses库,启动终端模式。
  • endwin():清理并退出ncurses库,恢复终端原始设置。
  1. 屏幕输出:
  • printw(const char *format, ...):在当前光标位置打印格式化的字符串。
  • mvprintw(int y, int x, const char *format, ...):在指定位置打印格式化的字符串。
  • refresh():刷新屏幕,将输出显示在终端上。
  1. 键盘输入:
  • getch():获取用户按下的键盘字符。
  • mvgetch(int y, int x):在指定位置获取用户按下的键盘字符。
  1. 光标控制:
  • move(int y, int x):将光标移动到指定位置。
  • getyx(WINDOW *win, int y, int x):获取当前光标位置。
  1. 窗口和面板:
  • WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x):创建一个新的窗口。
  • delwin(WINDOW *win):删除窗口。
  • wprintw(WINDOW *win, const char *format, ...):在窗口中打印格式化的字符串。
  • wrefresh(WINDOW *win):刷新窗口,将输出显示在终端上。
  • PANEL *new_panel(WINDOW *win):创建一个新的面板。
  • del_panel(PANEL *panel):删除面板。
  1. 颜色和属性:
  • start_color():启用颜色功能。
  • init_pair(short pair, short foreground, short background):初始化颜色对。
  • attron(int attrs):启用指定的属性。
  • attroff(int attrs):禁用指定的属性。

这只是ncurses库的一小部分函数和用法。您可以参考ncurses库的官方文档和教程,以了解更多关于ncurses库的函数、常量和示例代码。

官方文档链接:https://invisible-island.net/ncurses/ncurses.html


四、贪吃蛇游戏

4.1 游戏代码

下面是一个使用ncurses库实现的简单贪吃蛇游戏的示例代码:

#include <ncurses.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#define DELAY 100000

int main() {
    int x, y, maxX, maxY; //蛇头的位置和终端窗口的大小
    int direction = KEY_RIGHT; //方向
    int snakeLength = 5; //蛇的长度
    int snakeX[100], snakeY[100]; //蛇身的位置
    int foodX, foodY; //食物的位置
    int score = 0; //得分
    int gameOver = 0; //游戏结束标志

    // 初始化ncurses库
    initscr();
    noecho();
    curs_set(0);
    keypad(stdscr, TRUE);
    timeout(0);

    // 获取终端窗口的大小
    getmaxyx(stdscr, maxY, maxX);

    // 初始化蛇的初始位置和长度
    x = maxX / 2;
    y = maxY / 2;
    for (int i = 0; i < snakeLength; i++) {
        snakeX[i] = x - i;
        snakeY[i] = y;
    }

    // 生成食物的初始位置
    srand(time(NULL));
    foodX = rand() % maxX;
    foodY = rand() % maxY;

    // 游戏循环
    while (!gameOver) {
        clear();

        // 绘制蛇
        for (int i = 0; i < snakeLength; i++) {
            mvprintw(snakeY[i], snakeX[i], "O");
        }

        // 绘制食物
        mvprintw(foodY, foodX, "*");

        // 显示分数
        mvprintw(0, 0, "Score: %d", score);

        // 移动蛇的位置
        int nextX = snakeX[0];
        int nextY = snakeY[0];
        switch (direction) {
            case KEY_UP:
                nextY--;
                break;
            case KEY_DOWN:
                nextY++;
                break;
            case KEY_LEFT:
                nextX--;
                break;
            case KEY_RIGHT:
                nextX++;
                break;
        }

        // 检查是否吃到食物
        if (nextX == foodX && nextY == foodY) {
            score++;
            snakeLength++;
            foodX = rand() % maxX;
            foodY = rand() % maxY;
        } 
        
        // 移动蛇的身体
        for (int i = snakeLength - 1; i > 0; i--) { //后一节移动到前一节的位置
             snakeX[i] = snakeX[i - 1];
             snakeY[i] = snakeY[i - 1];
        }
        

        // 更新蛇头位置
        snakeX[0] = nextX;
        snakeY[0] = nextY;

        // 检查游戏结束条件
        //检查是否越界
        if (nextX < 0 || nextX >= maxX || nextY < 0 || nextY >= maxY) {
            gameOver = 1;
        }
        //检查是否撞到自己的身体
        for (int i = 1; i < snakeLength; i++) {
            if (snakeX[i] == nextX && snakeY[i] == nextY) {
                gameOver = 1;
            }
        }

        // 刷新屏幕
        refresh();

        // 延迟一段时间
        usleep(DELAY);
        
        // 获取用户输入
        int key = getch();
        switch (key) {
            case KEY_UP:
            case KEY_DOWN:
            case KEY_LEFT:
            case KEY_RIGHT:
                direction = key;
                break;
            case 'q':
                gameOver = 1;
                break;
        }
    }

    // 清理并退出ncurses库
    endwin();

    printf("Game Over! Your score: %d\n", score);

    return 0;
}

编译并运行上述代码,您将在终端中看到一个简单的贪吃蛇游戏界面。使用方向键控制蛇的移动,吃到食物会增加分数,碰到边界或自己的身体会导致游戏结束。


4.2 代码解释

  1. stdscr是ncurses库中的一个全局变量,表示标准屏幕窗口(standard screen window)。它是ncurses库中默认的主要窗口,用于在终端上显示文本和图形。在使用ncurses库创建终端界面时,我们可以使用stdscr变量来进行屏幕上的输出和输入操作。stdscr是一个指向WINDOW结构体的指针,它代表了整个终端屏幕的窗口。

  2. noecho():调用noecho()函数后,终端将不会回显用户输入的字符。这对于需要隐藏用户输入(如密码输入)的情况非常有用。

  3. curs_set(0):调用curs_set(0)函数将光标设置为不可见。这在终端界面中通常是一个好的做法,以避免光标干扰用户界面的显示。

  4. keypad(stdscr, TRUE):调用keypad(stdscr, TRUE)函数启用终端的特殊键盘输入模式。这样,终端将能够捕捉到特殊键(如方向键、功能键等)的输入,并将其作为特殊的键值返回。

  5. timeout(0):调用timeout(0)函数将输入等待时间设置为非阻塞模式。这意味着当没有输入时,getch()函数将立即返回,而不会等待用户输入。这对于需要实时响应用户输入的情况非常有用。

  6. usleep:微秒级暂停
    在这里插入图片描述


4.2 测试效果

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/67224.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

能化校对软件:提高招标文件质量的创新解决方案

智能化校对软件是一种创新的解决方案&#xff0c;可以进一步提高招标文件的质量和准确性。 以下是一些智能化校对软件的创新功能和优势&#xff1a; 1.自然语言处理(NLP)技术&#xff1a;智能化校对软件利用NLP技术来理解和分析文本&#xff0c;识别和纠正更复杂的语法和语义错…

chapter14:springboot与安全

Spring Boot与安全视频 Spring Security, shiro等安全框架。主要功能是”认证“和”授权“&#xff0c;或者说是访问控制。 认证&#xff08;Authentication&#xff09;是建立在一个声明主体的过程&#xff08;一个主体一般指用户&#xff0c;设备或一些可以在你的应用程序中…

集合工具类 Collections:提升集合操作效率

文章目录 多元素添加&#xff1a;addAll 方法随机置换&#xff1a;shuffle 方法自定义对象排序&#xff1a;sort 方法总结 在Java的集合框架中&#xff0c;Collections 是一个包含了许多操作集合的静态方法的工具类。通过使用 Collections 类提供的方法&#xff0c;我们能够更加…

利用 3D 地理空间数据实现Cesium的沉浸式环境

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 为了将大量异构 3D 地理空间数据处理和分散到各行各业的地理空间应用程序和运行时引擎&#xff0c;Cesium 创建了 3D Tiles&#xff0c;这是一种用于高效流式传输和渲染大量异构数据集的开放标准。3D Tile…

CEC2013(MATLAB):淘金优化算法GRO求解CEC2013的28个函数

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;提…

尚硅谷大数据项目《在线教育之采集系统》笔记004

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P047 P048 P049 P050 P051 P052 P053 P054 P055 P056 P047 /opt/module/datax/job/base_province.json [atguigunode001 ~]$ hadoop fs -mkdir /base_province/2022-02-22 [atgu…

干货 | 详述 Elasticsearch 向量检索发展史

1. 引言 向量检索已经成为现代搜索和推荐系统的核心组件。 通过将复杂的对象&#xff08;例如文本、图像或声音&#xff09;转换为数值向量&#xff0c;并在多维空间中进行相似性搜索&#xff0c;它能够实现高效的查询匹配和推荐。 图片来自&#xff1a;向量数据库技术鉴赏【上…

Hugging Face 的文本生成和大语言模型的开源生态

[更新于 2023 年 7 月 23 日: 添加 Llama 2。] 文本生成和对话技术已经出现多年了。早期的挑战在于通过设置参数和分辨偏差&#xff0c;同时控制好文本忠实性和多样性。更忠实的输出一般更缺少创造性&#xff0c;并且和原始训练数据更加接近&#xff0c;也更不像人话。最近的研…

c51单片机16个按键密码锁源代码(富proteus电路图)

注意了&#xff1a;这个代码你是没法直接运行的&#xff0c;但是如果你看得懂&#xff0c;随便改一改不超过1分钟就可以用 #include "reg51.h" #include "myheader.h" void displayNumber(unsigned char num) {if(num1){P10XFF;P10P11P14P15P160;}else if…

论文讲解——TPU-MLIR: A Compiler For TPU Using MLIR

论文讲解——TPU-MLIR: A Compiler For TPU Using MLIR https://arxiv.org/pdf/2210.15016.pdf概览模型转换TranslationCanonicalizeLoweringLayerGroup BufferizationCalibration QuantizationCorrectness Check相关资料 https://arxiv.org/pdf/2210.15016.pdf 本文将对TPU…

vue3 动态导入src/page目录下的所有子文件,并自动注册所有页面组件

main.js添加一下代码&#xff1a; const importAll (modules) > {Object.keys(modules).forEach((key) > {const component key.replace(/src/, /).replace(.vue, );const componentName key.split(/).slice(-2, -1)[0] -page;app.component(componentName, modules…

RocketMQ 5.x如何使用GRPC方式发送消费消息

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 RocketMQ版本 5.1.0 背景 我们都知道RocketMQ 5.x新增了proxy模式部署方式&#xff0c;也就是支持了GRPC的消费方式消费&#xff0c;所以今天我们来试试 本次…

php通过各种函数判断0和空php实例

php通过各种函数判断0和空php实例 本文给大家介绍php同各种函数判断0和空的方法&#xff0c;在文章给大家补充介绍了php 语法里0不等于null为空的解决办法 补充&#xff1a;下面给大家介绍下php 语法里0不等于null为空的解决办法 今天遇到这样一个问题是这样的: php 语句里,我…

Nevron Diagram for .NET Crack

Nevron Diagram for .NET Crack Nevron Diagram for.NET可帮助您快速轻松地在.NET Windows窗体和ASP.NET应用程序中集成和显示复杂的图表。这是一个完整的绘图解决方案&#xff0c;包含许多交互功能、形状、自动布局和令人惊叹的视觉效果&#xff0c;并配备了现成的控件&#x…

Linux常规操作命令

日升时奋斗&#xff0c;日落时自省 目录 1、vim 1.1、工作模式 1.2、末行模式操作相关命令 1.2.1、保存退出操作 1.2.2、查找替换 1.3、输入模式操作相关命令 1.3.1、移动相关命令 1.3.2、删除和剪切命令 1.3.3、复制操作 1.3.4、撤销 2、head 3、tail 4、ps 5、…

策略模式【Strategy Pattern】

刘备要到江东娶老婆了&#xff0c;走之前诸葛亮给赵云&#xff08;伴郎&#xff09;三个锦囊妙计&#xff0c;说是按天机拆开解决棘手问题&#xff0c; 嘿&#xff0c;还别说&#xff0c;真是解决了大问题&#xff0c;搞到最后是周瑜陪了夫人又折兵呀&#xff0c;那咱们先看看…

爬虫学习记录(持续更新)

一、问题记录 1.使用webdriver报错AttributeError: str object has no attribute capabilities 解决&#xff1a;目前使用的selenium版本是4.11.2&#xff0c;可以不必设置driver.exe的路径&#xff0c;selenium可以自己处理浏览器和驱动程序&#xff0c;因此&#xff0c;使用…

Shopify平台Fulfillment业务模块升级

上图是销售订单、发货单与配送之间的关系图&#xff0c;销售订单可以创建多个发货单&#xff0c;多个发货单(不同销售订单)可以合并在一个配送订单进行发货 接口请求错误记录: 1. The api_client does not have the required permission(s). 2. Required parameter missing or…

具有吸引子的非线性系统(MatlabSimulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

第三章 图论 No.5最小生成树之虚拟源点,完全图与次小生成树

文章目录 虚拟源点&#xff1a;1146. 新的开始贪心或kruskal性质&#xff1a;1145. 北极通讯网络最小生成树与完全图&#xff1a;346. 走廊泼水节次小生成树&#xff1a;1148. 秘密的牛奶运输 虚拟源点&#xff1a;1146. 新的开始 1146. 新的开始 - AcWing题库 与一般的最小…