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

问题描述 投票:-1回答:1

我正在使用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;
}

我正在使用拱门

c linux ncurses archlinux
1个回答
0
投票

[n] curses保留了屏幕应该是什么样子的内部地图。当您调用refresh()时,它使用该映射进行有效更新。仅当库完全控制到终端的输出时,这才有效。

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

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

还有一个clear()函数,它有一个erase()和一个clearok(TRUE),它告诉图书馆扔掉它的内部地图并重新绘制整个屏幕。这可以用来从发生坏事的情况中恢复,破坏屏幕。所以,具有讽刺意味的是,如果你之后做了一个system("clear"),你可能已经离开了clear()

© www.soinside.com 2019 - 2024. All rights reserved.