c - ncurses 水平显示字符而不是垂直显示

标签 c linux ncurses archlinux

我正在 Linux 上使用 ncurses 在控制台中编写一个简单的游戏,我遇到了一个非常奇怪的问题,我无法找出代码中的问题,问题是当我运行程序时,我的屏幕应该如下所示

enter image description here

它确实做到了,但是在我的 draw() 函数运行超过 10 次之后,我得到了这样的东西

enter image description here

这是我的代码:

#include <stdio.h>
#include <ncurses.h>
#include <stdlib.h>
#define END endwin();return 0
#define LN 5
#define RN 100

int display [LN][RN] = {
//   1 2 3 4 5 6 7 8 9 q w e r t y u 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//1
    {0,0,'@',0,0,0,0,0,0,0,0,0,0,0,0},//2
    {0,0,'@',0,0,0,0,0,0,0,0,0,0,0,0},//3
    {0,0,'@',0,0,0,0,0,0,0,0,0,0,0,0},//4
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} //5
};

void setup(){//cr
    initscr();
    cbreak();
    nodelay(stdscr,TRUE);
    keypad(stdscr, TRUE);
    noecho();
    curs_set(0);
    for(int i = 0 ; i < RN ; i++){
        display[LN - 1][i] = 1;
    }
    return;
}


void draw(){  
system("clear");
    for(int i = 0; i < LN ; i++){
        for(int j = 0; j < RN ; j++){
            if(display[i][j] == 1){
                addch(ACS_HLINE);
            }
            else if(display[i][j] == 0){
                addch(' ');
            }
            else printw("%c",display[i][j]);
        }
        addch('\n');
    }
    refresh();
    system("sleep 0.3");
    return;
}

我正在使用 arch

最佳答案

[n]curses 保留了屏幕应有的外观的内部映射。当您调用 refresh() 时,它会使用该映射进行高效更新。仅当库完全控制终端的输出时,这才有效。

当您通过其他方法(例如 system("clear"))进行终端输出时,库不再具有终端状态的准确映射。下一次更新会发送从状态 A 到状态 B 所需的转义序列和可打印字符串,但终端实际上​​处于状态 C,最终会出现一些疯狂的情况。

有一个curses erase() 函数可以清除屏幕,您应该使用它。这相当于使用一堆 addch 调用在每个位置写入空格。

还有一个 clear() 函数,它执行一个 erase() 和一个 clearok(TRUE),它告诉库扔掉其内部 map 并重新绘制整个屏幕。这可用于在发生不良情况、损坏屏幕时从情况中恢复。因此,具有讽刺意味的是,如果您事后执行了 clear(),您可能就可以摆脱 system("clear") 的麻烦。

关于c - ncurses 水平显示字符而不是垂直显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47962433/

相关文章:

c++ - Ncurses 静态库包含在 C++ 项目中

c# - 任何人都可以建议任何在 c 和 c# 之间互操作的加密解密算法吗

c - 使用 char** 数组作为结构成员加载/填充结构,c

c - 从服务器向客户端发送 float

linux - 关闭所有正在运行的虚拟机并再次启动自动启动机器

C - Ncurses 窗口不显示

c - 解除引用与非解除引用的指针(及其背后的解释)

linux - 为什么我的计算机在使用 USB 串行端口运行程序时一直暂停?

c++ - 了解 sigwait() 及其如何设置参数

php - Windows 上的 PHP 诅咒