Source code
This commit is contained in:
parent
74b19d9b6f
commit
4cba47d43a
2 changed files with 319 additions and 0 deletions
200
pong.c
Normal file
200
pong.c
Normal file
|
@ -0,0 +1,200 @@
|
|||
/*******************\
|
||||
| Pong |
|
||||
| |
|
||||
| By Alnotz |
|
||||
\*******************/
|
||||
/*
|
||||
gcc -o pong pong.c `/usr/bin/pkg-config --libs --cflags ncurses`
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
/*Ncurses header*/
|
||||
#include <curses.h>
|
||||
/*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_Rc<bracket_Rc+2;
|
||||
const int br_bot = ball_Rl==bracket_Rl-1 && ball_Vl>0;
|
||||
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; i<LINE-1; i++)
|
||||
{
|
||||
if((i>3 && 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;
|
||||
}
|
119
pong_mthread.c
Normal file
119
pong_mthread.c
Normal file
|
@ -0,0 +1,119 @@
|
|||
/*******************\
|
||||
| Pong |
|
||||
| |
|
||||
| By Alnotz |
|
||||
\*******************/
|
||||
/*
|
||||
gcc -o pong_mthread pong_mthread.c `/usr/bin/pkg-config --libs --cflags ncurses` -pthread
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
/*Ncurses header*/
|
||||
#include <curses.h>
|
||||
/*Inner window size*/
|
||||
#define LINE 40
|
||||
#define COL 80
|
||||
/*Threads*/
|
||||
pthread_t bracket_th;
|
||||
pthread_t ball_th;
|
||||
/*Mutex*/
|
||||
pthread_mutex_t mtx;
|
||||
/*Inner window*/
|
||||
WINDOW *inwin;
|
||||
/*Cursor position*/
|
||||
int cursorl=LINE-1, cursorc=COL/2, startl, startc;
|
||||
/*Key number*/
|
||||
int ch;
|
||||
/*Clock*/
|
||||
struct timespec ts;
|
||||
char buff[20];
|
||||
void *bracket_thread(void *win)
|
||||
{
|
||||
for(int i=0; i<10; i++)
|
||||
{
|
||||
pthread_mutex_lock(&mtx);
|
||||
wmove(inwin, 1, COL/4);
|
||||
wattron(inwin, COLOR_PAIR(2));
|
||||
wprintw(inwin, "Thread for bracket done!");
|
||||
wattroff(inwin, COLOR_PAIR(2));
|
||||
wrefresh(inwin);
|
||||
pthread_mutex_unlock(&mtx);
|
||||
}
|
||||
}
|
||||
void *ball_thread(void *win)
|
||||
{
|
||||
for(int i=0; i<10; i++)
|
||||
{
|
||||
pthread_mutex_lock(&mtx);
|
||||
wmove(inwin, 2, COL/4);
|
||||
wattron(inwin, COLOR_PAIR(2));
|
||||
wprintw(inwin, "Thread for ball done!");
|
||||
wattroff(inwin, COLOR_PAIR(2));
|
||||
wrefresh(inwin);
|
||||
pthread_mutex_unlock(&mtx);
|
||||
}
|
||||
}
|
||||
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);
|
||||
/*Cursor hidden*/
|
||||
curs_set(0);
|
||||
/*Inner window set*/
|
||||
inwin = newwin(LINE, COL, startl, startc);
|
||||
/*Multithreading*/
|
||||
pthread_mutex_init(&mtx, PTHREAD_MUTEX_NORMAL);
|
||||
pthread_create(&bracket_th, NULL, bracket_thread, inwin);
|
||||
pthread_create(&ball_th, NULL, ball_thread, inwin);
|
||||
/*Timeout enabled for wgetch*/
|
||||
wtimeout(inwin, 50);
|
||||
/*Keypad enabled*/
|
||||
keypad(inwin, TRUE);
|
||||
/*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));
|
||||
/*Inner window updated*/
|
||||
wrefresh(inwin);
|
||||
/*Key expected*/
|
||||
ch = wgetch(inwin);
|
||||
/*Inner window cleared before next update*/
|
||||
wclear(inwin);
|
||||
while(ch!=(int)'q')
|
||||
{
|
||||
/*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));
|
||||
wrefresh(inwin);
|
||||
ch = wgetch(inwin);
|
||||
wclear(inwin);
|
||||
}
|
||||
endwin();
|
||||
pthread_join(bracket_th, NULL);
|
||||
pthread_join(ball_th, NULL);
|
||||
pthread_exit(NULL);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Loading…
Reference in a new issue