使用这种算法时 Ncurses 线未连接

Ncurses lines not connected when using this kind of algorithm

我有一个算法,我有一个 3 X 3 的盒子:

typedef struct _WIN_struct {

    int startx, starty;
    int height, width;
    WIN_BORDER border;
}WIN;

p_win->border.ls = '|';
p_win->border.rs = '|';
p_win->border.ts = '-';
p_win->border.bs = '-';
p_win->border.tl = '+';
p_win->border.tr = '+';
p_win->border.bl = '+';
p_win->border.br = '+';

所以这看起来像这样:

+-+
| |
+-+

当按下一个键时,盒子会朝它必须走的方向移动,然后我想在它后面画一条线,使用简单的 mvaddch(y,x+1,'*'); (在这个例子中,盒子向左移动,所以它使 *在框的右侧)

但是当我改变方向时,线路没有连接。发生这种情况可能是因为盒子是 3 X 3 而不是 1 X 1(我之前让它与 1 X 1 盒子一起工作,但我试图将盒子更改为 3 X 3 但它弄乱了)。

这是我改变方向 4 次并尝试创建一个正方形时的样子:

您可以看到这些行没有加起来(我无法进行屏幕截图,因为我在没有管理员权限的 LTSP 上:( )

这里是关于它是如何制作的特写镜头:

****
....
..*.
..*.

这里是从上开始然后我向左走。这些点仅用于格式化。

这里是完整的程序:http://pastebin.com/EGabVfwY

这些线没有连接,因为您在错误的方向(但始终如一)添加了 y,x 的偏移量。例如,当移动 向上 时,程序会这样做:

mvaddch(y+1,x,'*');
y--;

但是,向上移动 *),y 坐标将 减小 。如果您将那对语句更改为

y--;
mvaddch(y,x,'*');

它会如您所愿。此外,由于 4 种情况(上、下、左和右)中的每一种都以相同的 mvaddch 结束,您可以将该语句移到 switch 语句之后,并稍微简化程序。

你也可以通过画线人物让程序更有趣一点。首先,添加

#include <locale.h>

在顶部,然后调用

setlocale(LC_ALL, "");

就在 initscr() 之前。然后你可以用这样的东西替换 ASCII 画线代码:

p_win->border.ls = ACS_VLINE;
p_win->border.rs = ACS_VLINE;
p_win->border.ts = ACS_HLINE;
p_win->border.bs = ACS_HLINE;
p_win->border.tl = ACS_ULCORNER;
p_win->border.tr = ACS_URCORNER;
p_win->border.bl = ACS_LLCORNER;
p_win->border.br = ACS_LRCORNER;

如果您 link 使用 ncursesw 库,那应该能够在 UTF-8 语言环境中显示漂亮的线条。