freebsd-dev/contrib/ncurses/test/rain.c

135 lines
2.4 KiB
C
Raw Normal View History

/*
* $Id: rain.c,v 1.19 2002/04/06 20:45:22 tom Exp $
*/
#include <test.priv.h>
/* rain 11/3/1980 EPS/CITHEP */
static float ranf(void);
static void onsig(int sig);
static int
next_j(int j)
{
if (j == 0)
j = 4;
else
--j;
if (has_colors()) {
int z = (int) (3 * ranf());
chtype color = COLOR_PAIR(z);
if (z)
color |= A_BOLD;
attrset(color);
}
return j;
}
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
int x, y, j;
static int xpos[5], ypos[5];
float r;
float c;
for (j = SIGHUP; j <= SIGTERM; j++)
if (signal(j, SIG_IGN) != SIG_IGN)
signal(j, onsig);
initscr();
if (has_colors()) {
int bg = COLOR_BLACK;
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
bg = -1;
#endif
init_pair(1, COLOR_BLUE, bg);
init_pair(2, COLOR_CYAN, bg);
}
nl();
noecho();
curs_set(0);
timeout(0);
r = (float) (LINES - 4);
c = (float) (COLS - 4);
for (j = 5; --j >= 0;) {
xpos[j] = (int) (c * ranf()) + 2;
ypos[j] = (int) (r * ranf()) + 2;
}
for (j = 0;;) {
x = (int) (c * ranf()) + 2;
y = (int) (r * ranf()) + 2;
mvaddch(y, x, '.');
mvaddch(ypos[j], xpos[j], 'o');
j = next_j(j);
mvaddch(ypos[j], xpos[j], 'O');
j = next_j(j);
mvaddch(ypos[j] - 1, xpos[j], '-');
mvaddstr(ypos[j], xpos[j] - 1, "|.|");
mvaddch(ypos[j] + 1, xpos[j], '-');
j = next_j(j);
mvaddch(ypos[j] - 2, xpos[j], '-');
mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\");
mvaddstr(ypos[j], xpos[j] - 2, "| O |");
mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /");
mvaddch(ypos[j] + 2, xpos[j], '-');
j = next_j(j);
mvaddch(ypos[j] - 2, xpos[j], ' ');
mvaddstr(ypos[j] - 1, xpos[j] - 1, " ");
mvaddstr(ypos[j], xpos[j] - 2, " ");
mvaddstr(ypos[j] + 1, xpos[j] - 1, " ");
mvaddch(ypos[j] + 2, xpos[j], ' ');
xpos[j] = x;
ypos[j] = y;
switch (getch()) {
case ('q'):
case ('Q'):
curs_set(1);
endwin();
ExitProgram(EXIT_SUCCESS);
case 's':
nodelay(stdscr, FALSE);
break;
case ' ':
nodelay(stdscr, TRUE);
break;
#ifdef KEY_RESIZE
case (KEY_RESIZE):
r = (float) (LINES - 4);
c = (float) (COLS - 4);
break;
#endif
}
napms(50);
}
}
static void
onsig(int n GCC_UNUSED)
{
curs_set(1);
endwin();
ExitProgram(EXIT_FAILURE);
}
static float
ranf(void)
{
long r = (rand() & 077777);
return ((float) r / 32768.);
}