Data de publicació: May 16, 2016 6:35:52 PM
#include <ncurses.h>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <time.h>
#define DELAY 60000
#define FOREVER 1
#define AMUNT -1
#define AVALL 1
#define DRETA 1
#define ESQUERRA -1
int kbhit(void);
void inicialitzar();
void finalitzar();
void esborrar_pnt();
void refrescar_pnt();
void moure_pilota();
void moure_paleta();
void crear_marc();
void mostrar_comptador();
//Variables globals
//Dimensions de la pantalla
int max_y = 0, max_x = 0;
//Coordenades de la pilota
int x, y;
//Coordenades de la paleta
int dim_paleta = 60;
int x_paleta, y_paleta;
int x_seg = 0, y_seg = 0;
int dir_x = AVALL;
int dir_y = DRETA;
//Tecla polsada
int key=0;
//Comptador
int nivell;
int inc_nivell;
int comptador;
int final = 0;
int main() {
inicialitzar();
while(!final) {
esborrar_pnt();
crear_marc();
moure_pilota();
moure_paleta();
mostrar_comptador();
refrescar_pnt();
}
finalitzar();
}
void inicialitzar(){
//Llavor random
srand(time(NULL));
//Inicialitzar ncurses
initscr();
noecho();
curs_set(FALSE);
getmaxyx(stdscr, max_y, max_x);
//Ubica la paleta al inici
x_paleta = COLS / 2;
y_paleta = LINES - 2;
//Posicio aleatoria de la pilota
x = rand()%max_x;
y = 0;
//Puntuació i dificultad
comptador = 1;
nivell = 0;
inc_nivell = 5;
}
void finalitzar(){
endwin();
}
void esborrar_pnt(){
getmaxyx(stdscr, max_y, max_x);
clear();
}
void refrescar_pnt(){
refresh();
usleep(DELAY);
}
void moure_paleta(){
int i;
for (i=0;i<dim_paleta;i++) mvprintw(y_paleta, x_paleta + i, "=");
if (kbhit()) key = getchar();
if (key == 'a' || key == 'A') { x_paleta = x_paleta - 2; }
if (key == 'd' || key == 'D') { x_paleta = x_paleta + 2; }
if (key == 'w' || key == 'W') { y_paleta = y_paleta - 2; }
if (key == 's' || key == 'S') { y_paleta = y_paleta + 2; }
if (x_paleta < 1 ) x_paleta = 1;
if (y_paleta < 1 ) y_paleta = 1;
if (x_paleta > (COLS - 1) - dim_paleta) x_paleta = (COLS - 1) - dim_paleta;
if (y_paleta > LINES - 2) y_paleta = LINES - 2;
key = '0';
}
void moure_pilota(){
mvprintw(y, x, "O");
x_seg = x + dir_x;
y_seg = y + dir_y;
//Si xoca contra laterals rebota
if ( x_seg >= max_x ) {dir_x = ESQUERRA;}
if ( x_seg < 0 ) {dir_x = DRETA;}
//Si xoca contra dalt o baix rebota, per sota final partida
if ( y_seg >= max_y ) {dir_y = AMUNT; final = 1;}
if ( y_seg < 0 ) {dir_y = AVALL;}
//Si xoca contra la paleta, rebota
if ( ( dir_y == AVALL) &&
( y_seg >= y_paleta) &&
( x_seg >= x_paleta ) &&
( x_seg <= (x_paleta + dim_paleta))
)
{dir_y = AMUNT;
dir_x = (rand()%2) ? DRETA : ESQUERRA;
comptador++;
if ( ( comptador % inc_nivell ) == 0) {dim_paleta--;nivell++;}
}
x+=dir_x;
y+=dir_y;
}
void crear_marc()
{
int i;
for(i=0;i<LINES;i++) {mvprintw(i,0,":");mvprintw(i,COLS - 1,":");}
for(i=0;i<COLS;i++) {mvprintw(0,i,".");mvprintw(LINES -1,i,".");}
}
void mostrar_comptador(){
mvprintw( 2, max_x - 20, "%s \t %d", "PUNTS",comptador);
mvprintw( 3, max_x - 20, "%s \t %d", "NIVELL",nivell);
mvprintw( 4, max_x - 20, "%s \t %d", "PALETA",dim_paleta);
}
int kbhit(void)
{
struct termios oldt, newt;
int ch;
int oldf;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ungetc(ch, stdin);
return 1;
}
return 0;
}
____________________________________________________________________
gcc pilota_jokoa.c -lncurses -o pilota_jokoa