/* show a ball bouncing in a box using curses */ #include #include #include #include #include struct ball_s { int ballxold; int ballyold; int ballx; int bally; int ballx_vel; int bally_vel; }; void drawStart(WINDOW *win); void drawScreen(WINDOW *win, struct ball_s * one, struct ball_s * two); void cleanUp(int sig); void moveBall(struct ball_s * ball); void moveCursor(WINDOW *win); #define MIN_X 11 #define MAX_X 69 #define MIN_Y 5 #define MAX_Y 19 int main(int argc, char *argv[]) { WINDOW *main_window; struct ball_s one; struct ball_s two; /* initialize curses stuff */ initscr(); main_window = newwin(0,0,0,0); leaveok(main_window,TRUE); curs_set(0); /* turn off cursor */ /* initialize ball */ one.ballx = (MAX_X - MIN_X) / 3 + MIN_X; one.bally = (MAX_Y - MIN_Y) / 3 + MIN_Y; one.ballxold = one.ballx; one.ballyold = one.bally; one.ballx_vel = -1; one.bally_vel = +1; two.ballx = (MAX_X - MIN_X) * 2 / 3 + MIN_X; two.bally = (MAX_Y - MIN_Y) * 2 / 3 + MIN_Y; two.ballxold = two.ballx; two.ballyold = two.bally; two.ballx_vel = -1; two.bally_vel = +1; /* draw starting box */ drawStart(main_window); /* loop until exit on Ctrl-C */ while (1) { // imagine this is a I/O call necessary to compute the next motion usleep(1000000); moveBall(&one); drawScreen(main_window, &one, &two); // same here usleep(300000); moveBall(&two); drawScreen(main_window, &one, &two); } } /* move the ball based on x,y velocity and walls */ void moveBall(struct ball_s * ball) { /* move the ball */ ball->ballxold = ball->ballx; ball->ballyold = ball->bally; ball->ballx = ball->ballx + ball->ballx_vel; ball->bally = ball->bally + ball->bally_vel; /* hit side wall? */ if (ball->ballx == MIN_X || ball->ballx == MAX_X) ball->ballx_vel = ball->ballx_vel * -1; /* hit top/bottom wall? */ if (ball->bally == MAX_Y || ball->bally == MIN_Y) ball->bally_vel = ball->bally_vel * -1; } /* draw the screen */ void drawScreen(WINDOW *win, struct ball_s * one, struct ball_s * two){ mvwaddch(win, one->ballyold, one->ballxold,' '); mvwaddch(win, one->bally, one->ballx, '*'); mvwaddch(win, two->ballyold, two->ballxold,' '); mvwaddch(win, two->bally, two->ballx, '*'); wrefresh(win); } /* draw the starting box */ void drawStart(WINDOW *win) { int i; /* horizontal bars */ for (i=MIN_X-1; i<=MAX_X+1; i++) { mvwaddch(win, MIN_Y-1, i, '-'); mvwaddch(win, MAX_Y+1, i, '-'); } /* vertical bars */ for (i=MIN_Y-1; i<=MAX_Y+1; i++) { mvwaddch(win, i, MIN_X-1, '|'); mvwaddch(win, i, MAX_X+1, '|'); } wrefresh(win); } /* close curses and exit */ void cleanUp(int sig) { endwin(); exit(0); }