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

如何使用ncurses库并在Linux上编译?

在Linux上编译Ncurses程序的教程

简介

Ncurses(New Curses)是一个用于创建文本用户界面(TUI)的库,广泛用于Unix-like系统中。它提供了丰富的函数来处理屏幕输出、键盘输入、光标控制等。本文将指导您如何在Linux环境下编译和运行一个简单的Ncurses程序。

ncurses函数使用介绍:

  • initscr():初始化屏幕,进入curses模式。这是使用ncurses库时首先要调用的函数。

  • keypad():启用或禁用特殊按键的读取。当设置为 TRUE 时,可以读取如方向键、功能键等特殊按键。

  • noecho():关闭按键回显,即用户输入的字符不会显示在屏幕上。

  • printw():在当前光标位置打印文本。

  • refresh():将缓冲区的内容刷新到屏幕上,使更改立即可见。

  • getch():等待用户按键并返回按键的ASCII值。如果按下的是特殊按键(如方向键),则返回相应的宏定义值。

  • endwin():结束curses模式,恢复终端到调用 initscr() 之前的状态。

  • clear():清除屏幕,将所有内容重置为空白。

  • move(y, x):移动光标到指定的行 y 和列 x 位置。

环境准备

确保您的Linux系统已经安装了GCC编译器和Ncurses库。如果没有安装,可以通过以下命令安装:

bash复制

sudo apt update
sudo apt install build-essential libncurses5-dev libncursesw5-dev

创建Ncurses程序

  1. 创建源文件:创建一个名为 hello_ncurse.c 的文件,并输入以下代码:

    c复制

    #include <ncurses.h>
    
    int main() {
        int ch;
    
        initscr();                      // Start curses mode
        printw("Hello World !!!");      // Print Hello World
        refresh();                      // Print it on to the real screen
        ch = getch();                   // Wait for user input
    
        endwin();                       // End curses mode
    
        return 0;
    }
  2. 编译程序:使用以下命令编译您的程序:

    bash复制

    gcc -o hello_ncurse hello_ncurse.c -lncurses

    这里,gcc 是GNU编译器集合,-o hello_ncurse 指定输出文件名,hello_ncurse.c 是源文件,-lncurses 链接Ncurses库。

  3. 运行程序:编译成功后,运行编译后的程序:

    bash复制

    ./hello_ncurse

    您应该能看到屏幕上显示 "Hello World !!!"。

实现一个简单的Ncurses游戏

为了进一步演示Ncurses的功能,我们将创建一个简单的游戏,其中字符 "O" 会在屏幕上左右移动。

  1. 创建源文件:创建一个名为 move字符.c 的文件,并输入以下代码:

    #include <ncurses.h>
    
    int main() {
        int key, x, y;
    
        initscr();                      // Initialize the ncurses library
        keypad(stdscr, TRUE);          // Enable special keys like arrow keys to be read directly
        noecho();                       // Disable echoing of key presses to the screen
        x = y = 5;                      // Initialize the x and y coordinates for the object
    
        while (key != 'q') {            // Main game loop, continues until 'q' is pressed
            clear();                    // Clear the screen
            move(0, 0);                 // Put the cursor at the start of the screen
            printw("Press left or right arrow - exit by pressing:q"); // Print instructions on the screen
    
            move(y, x);                 // Move the cursor to the current position of the object
            printw(" OOOO ");            // Print the object at the current position
    
            refresh();                  // Refresh the screen to show the changes
    
            key = getch();              // Wait for a key press
            if (key == KEY_LEFT) {      // If the left arrow key is pressed
                x--;                    // Move the object left
                if (x < 0) x = 0;      // Ensure the object does not move out of the left boundary
            } else if (key == KEY_RIGHT) { // If the right arrow key is pressed
                x++;                    // Move the object right
                if (x > 30) x = 30;    // Ensure the object does not move out of the right boundary
            }
        }
    
        endwin();                       // End the ncurses mode and restore the terminal to its original state
        return 0;
    }
  2. 编译程序:使用以下命令编译你的程序:

    bash复制

    gcc -o move_char move_char.c -lncurses
  3. 运行程序:编译成功后,运行编译后的程序:

    bash复制

    ./move_char

    你应该能看到字符 "O" 在屏幕上左右移动。

如果不知道如何在linux文件运行,请回看我之前发的samba和makefile文章

最后结果是这样的

相关文章:

  • C++Primer学习(13.1 拷贝、赋值与销毁)
  • OSPF-8 OSPF特殊区域NSSA
  • 基于 FPGA的HLS技术与应用
  • 『 C++ 』多线程编程中的参数传递技巧
  • 23 种设计模式中的访问者模式
  • 【大模型算法工程】大模型应用工具化、忠诚度以及知识库场景下PDF双栏解析问题的讨论
  • 视点游动生成光照贴图
  • 3.21学习总结 Java字符串+Static关键字
  • AI Agent开发大全第一课-AI是什么以及如何使用AI
  • Unity代码中修改动画速度
  • Python 面向对象三大特性深度解析
  • C#与西门子PLC的六大通信库
  • VSCode中搜索插件显示“提取扩展时出错。Failed to fetch”问题解决!
  • java基础--序列化与反序列化的概念是什么?
  • 大数据学习(80)-数仓分层
  • Spring 三级缓存能不能解决循环依赖?
  • 概率预测之NGBoost(Natural Gradient Boosting)回归和分位数(Quantile Regression)回归
  • KNN算法
  • Spring Boot中接口数据字段为 Long 类型时,前端number精度丢失问题解决方案
  • Vue入门
  • 印方称所有敌对行动均得到反击和回应,不会升级冲突
  • 雷军:过去一个多月是创办小米以来最艰难的时间
  • 时代中国控股:前4个月销售额18.1亿元,境外债重组协议押后聆讯至5月底
  • 马上评|让“贾宝玉是长子长孙”争议回归理性讨论
  • 外交部答澎湃:美方攻击抹黑中加关系与合作的卑劣图谋不会得逞
  • 湖北奥莱斯轮胎公司逃避监管排放大气污染物被罚25万元