[英]Ncurses and C++ screensaver
我正在尝试编写一个小程序,使用ncurses制作某种动画。 我对所有这些都是新手,主要是ncurses。
我想使用布尔2D数组将X随机填充到具有一定前景色和背景色的屏幕上。 True(开放)表示可以将X写入该位置。 将X写入此处后,斑点值更改为False(闭合/填充),并且继续寻找True斑点。 整个屏幕填满后,它将以ncurses循环遍历所有可用的颜色对,直到我按下ctrl + c为止。 我是这一切的新手,尤其是ncurses。我碰到了几堵非常卡住的墙。 Google有所帮助,但我仍然受困。
如何使用ncurses“ getyx”命令并将这些坐标放入2D数组中以检查每个元素? 还是应该使用其他方法来获取屏幕坐标并将其放入我的2D数组中?
我想使用“ int rand()”函数生成一个随机数/数组元素,以检查和填充或不填充。 我以为我只是将所有内容加1,所以它只会检查所有内容。 10/1 = 10,3 / 1 = 3,依此类推...这项工作行吗?
我试图让它在将彩色X写入屏幕之间“睡眠”,但是它在开始时暂停,然后仅执行第一个颜色对。 我不确定如何解决这个问题,也许有很多嵌套循环?
COLOR_PAIR(1);
attron(COLOR_PAIR(1));
move(10, 20);
addstr("Hello");
sleep(5);
COLOR_PAIR(2);
attron(COLOR_PAIR(2));
addstr("Hello");
refresh();
sleep(5);
endwin();
通常,我对ncurses和某些循环逻辑感到困惑。 我问过那些完全有经验的程序员,开发人员,软件人员的朋友。。。大多数人甚至都没有听说过ncurses库。
关于这些类型的事情,是否有一些关于ncurses的好的教程? 对于类似的程序,我还应该查看其他示例或资源吗? 我之前做过井字游戏,但这是整个屏幕,而不仅仅是一个孤独的2D阵列绘制的盒子。
任何帮助将不胜感激!
您应该将游戏状态保持在内部结构中,而不要依赖于终端屏幕,并尝试将其读回到下一状态。 终端只是渲染工具,而不是状态本身。
首先,在选择随机坐标时,您会出错。 该操作应如下进行:
/* Using a macro to follow the style of the Ncurses library. */
#define randyx(y,x) { \
int max_y, max_x; \
getmaxyx(stdscr, max_y, max_x); \
y=rand() % max_y; \
x=rand() % max_x; \
}
(注意:使用%运算符来限制随机数的范围会导致数字对于诸如随机生成的密码之类的数字来说不够随机,但这对于我们的目的已经足够了。)
然后,每当需要随机坐标时,都可以这样做:
int y,x;
randyx(y,x);
/* y and x are random screen coordinates from here. */
接下来需要做的是获取给定位置上已经存在的字符和颜色(因为如果您已经在给定位置上放置了X,则要调用特殊行为)。 无需创建自己的2D数组来执行此操作,而是让Ncurses为您处理它,因为Ncurses已经在屏幕上跟踪了(应该是)什么:
chtype color_and_char = mvinch(y,x);
将颜色,字符和所有其他Curses属性合并为一个整数。 要分离它们,一些宏很方便:
#define CH_CHAR(ch) (ch & A_CHARTEXT)
#define CH_COLOR(ch) (ch & A_COLOR)
#define CH_ATTR(ch) (ch & A_ATTRIBUTES)
所以现在您可以检查那里是否有X:
if(CH_CHAR(color_and_char) == 'X') {
/* Change the color. You're on your own in figuring out the
correct value for MAX_COLOR_PAIR. My guess would be 64.
0x100 is the same thing as COLOR_PAIR(1). */
put_x(y,x,(CH_COLOR(color_and_char)+0x100) % COLOR_PAIR(MAX_COLOR_PAIR));
} else {
put_x(y,x,COLOR_PAIR(1));
}
将给定颜色的X放在给定位置:
void put_x(int y, int x, int color_pair) {
move(y,x);
attron(color_pair);
addch('X');
refresh();
}
要更改已经存在的X的颜色,只需使用新颜色调用put_x
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.