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

时间:2015-04-17 08:19:30

标签: c ncurses

我有一个算法,我有一个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,'*');在它后面画一条线(在这个例子中,框向左移动,使它成为{{1在框的右侧)

但是当我改变方向时,线条不会连接。发生这种情况可能是因为盒子是3 X 3而不是1 X 1(我之前使用的是1 X 1盒子,但是我试图将盒子更改为3 X 3并且它会消失)。

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

Image

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

这是一种关于如何制作的特写:

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

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

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

1 个答案:

答案 0 :(得分:1)

线路没有连接,因为你是在错误的方向上添加y,x的偏移量(但是一致)。例如,当移动 up 时,程序会这样做:

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;

如果你链接到 ncursesw 库,它应该能够在UTF-8语言环境中显示漂亮的行。