/*******************\ | Pong | | | | By Alnotz | \*******************/ /* gcc -o pong pong.c `/usr/bin/pkg-config --libs --cflags ncurses` */ #include #include /*Ncurses header*/ #include /*Inner window size*/ #define LINE 40 #define COL 80 /*Inner window title & border*/ #define DO_TITLE(void) \ /*Inner border*/\ box(inwin, '|', '-');\ /*Inner window title*/\ wmove(inwin, 0, COL/4);\ wattron(inwin, COLOR_PAIR(2));\ wprintw(inwin, "Push 'q' to quit");\ wmove(inwin, 0, COL-11);\ timespec_get(&ts, TIME_UTC);\ strftime(buff, sizeof buff, "%H:%M\'%S\"", gmtime(&ts.tv_sec));\ wprintw(inwin, "%s", buff);\ wattroff(inwin, COLOR_PAIR(2)); /*False asynchronization timer*/ unsigned int tmr=0; /*Inner window*/ WINDOW *inwin; /*Cursor position*/ int bracket_Rl=LINE-1, bracket_Rc=COL/2, startl, startc; /*Ball position*/ int ball_Rl=LINE-2, ball_Rc=COL/2, ball_Vl=-1, ball_Vc=1; /*Key number*/ int ch; /*Bloc array*/ char blocs0[COL]; /*Clock*/ struct timespec ts; char buff[20]; void blocs_ltest(char *blc[], const int *ball_Rl, const int *ball_Rc, int *ball_Vl) { const size_t lsize = (sizeof *blc) / (sizeof *blc[0]); if(*ball_Rl==1 || *ball_Rl==3 && *blc[*ball_Rc]=='#') { *blc[*ball_Rc]==' '; *ball_Vl = -*ball_Vl; } } int ball_Vl_test(void) { const int lwall = ball_Rl<1 || ball_Rl>LINE-2; const int br_csize = ball_Rc>=bracket_Rc && ball_Rc0; const int br_up = ball_Rl==bracket_Rl+1 && ball_Vl<0; return lwall || (br_csize && br_bot) || (br_csize && br_up); } int ball_Vc_test(void) { const int cwall = ball_Rc<1 || ball_Rc>COL-2; const int br_lsize = ball_Rl==bracket_Rl; const int br_left = ball_Rc==bracket_Rc-1 && ball_Vc>0; const int br_right = ball_Rc==bracket_Rc+3 && ball_Vc<0; return cwall || (br_lsize && br_left) || (br_lsize && br_right); } int main(int argc, char *argv[]) { /*Outer window*/ initscr(); startl=LINES/2-LINE/2; startc=COLS/2-COL/2; /*Color enabled*/ start_color(); init_pair(1, COLOR_RED, COLOR_BLACK); init_pair(2, COLOR_GREEN, COLOR_BLACK); init_pair(3, COLOR_BLUE, COLOR_BLACK); init_pair(4, COLOR_YELLOW, COLOR_BLACK); /*Cursor hidden*/ curs_set(0); /*Inner window set*/ inwin = newwin(LINE, COL, startl, startc); /*Timeout enabled for wgetch*/ wtimeout(inwin, 20); /*Keypad enabled*/ keypad(inwin, TRUE); DO_TITLE() /*Initial blocs*/ for(int i=0; i3 && i<10) || (i>23 && i<30)) { blocs0[i]='#'; } else { blocs0[i]=' '; } } /*First blocs position*/ wmove(inwin, 2, 1); /*Blocs in yellow*/ wattron(inwin, COLOR_PAIR(4)); wprintw(inwin, "%s", blocs0); wattroff(inwin, COLOR_PAIR(4)); /*First cursor position*/ wmove(inwin, bracket_Rl, bracket_Rc); /*Cursor in red*/ wattron(inwin, COLOR_PAIR(1)); wprintw(inwin, "###"); wattroff(inwin, COLOR_PAIR(1)); /*Ball in blue*/ wmove(inwin, ball_Rl, ball_Rc); wattron(inwin, COLOR_PAIR(3)); wprintw(inwin, "O"); wattroff(inwin, COLOR_PAIR(3)); /*Inner window updated*/ wrefresh(inwin); /*Key expected*/ ch = wgetch(inwin); /*Inner window cleared before next update*/ wclear(inwin); while(ch!=(int)'q') { DO_TITLE() /*First blocs position*/ wmove(inwin, 2, 1); /*Blocs in yellow*/ wattron(inwin, COLOR_PAIR(4)); wprintw(inwin, "%s", blocs0); wattroff(inwin, COLOR_PAIR(4)); /*Cursor movement*/ switch(ch) { case KEY_RIGHT: if(bracket_Rc==COL-3) wmove(inwin, bracket_Rl, bracket_Rc); else wmove(inwin, bracket_Rl, ++bracket_Rc); break; case KEY_LEFT: if(bracket_Rc==0) wmove(inwin, bracket_Rl, bracket_Rc); else wmove(inwin, bracket_Rl, --bracket_Rc); break; case KEY_DOWN: if(bracket_Rl==LINE-1) wmove(inwin, bracket_Rl, bracket_Rc); else wmove(inwin, ++bracket_Rl, bracket_Rc); break; case KEY_UP: if(bracket_Rl==0) wmove(inwin, bracket_Rl, bracket_Rc); else wmove(inwin, --bracket_Rl, bracket_Rc); break; /*No key pushed*/ case ERR: wmove(inwin, bracket_Rl, bracket_Rc); break; } wattron(inwin, COLOR_PAIR(1)); wprintw(inwin, "###"); wattroff(inwin, COLOR_PAIR(1)); /*Ball movement*/ if(tmr==4) { if(ball_Vl_test()) { ball_Vl=-ball_Vl; } if(ball_Vc_test()) { ball_Vc=-ball_Vc; } ball_Rl=ball_Rl+ball_Vl; ball_Rc=ball_Rc+ball_Vc; tmr=0; } else { tmr+=1; } wmove(inwin, ball_Rl, ball_Rc); wattron(inwin, COLOR_PAIR(3)); wprintw(inwin, "O"); wattroff(inwin, COLOR_PAIR(3)); wrefresh(inwin); ch = wgetch(inwin); wclear(inwin); } endwin(); return EXIT_SUCCESS; }