我有一个算法,其中有一个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;


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

08-26 19:25
查看更多