ncurses 水平显示字符而不是垂直显示
ncurses displays characters horizontally instead of vertically
我正在 linux 上使用 ncurses 在控制台中编写一个简单的游戏,我遇到了一个非常奇怪的问题,我无法找出代码中的错误问题是当我 运行 我的程序我的屏幕应该是这样的
它确实如此,但是在我的 draw()
函数 运行 超过 10 次之后,我得到了这样的结果
这是我的代码:
#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)
,它告诉库丢弃它的内部地图并重新绘制整个屏幕。这可用于在发生不良事件(损坏屏幕)时从情况中恢复。所以,具有讽刺意味的是,如果你之后做了 clear()
,你本可以逃脱 system("clear")
。
我正在 linux 上使用 ncurses 在控制台中编写一个简单的游戏,我遇到了一个非常奇怪的问题,我无法找出代码中的错误问题是当我 运行 我的程序我的屏幕应该是这样的
它确实如此,但是在我的 draw()
函数 运行 超过 10 次之后,我得到了这样的结果
这是我的代码:
#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)
,它告诉库丢弃它的内部地图并重新绘制整个屏幕。这可用于在发生不良事件(损坏屏幕)时从情况中恢复。所以,具有讽刺意味的是,如果你之后做了 clear()
,你本可以逃脱 system("clear")
。