Advertisement
AntonioVillanueva

c++ pelota ping pong

Dec 1st, 2017
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.38 KB | None | 0 0
  1. //instalar las ncurses antes sudo apt-get install libncurses-dev
  2. //compilacion  g++ -std=c++11 -o pelota pelota.cpp -lncurses
  3. //Estudio de una pelota que rebota en la pantalla en ncurses
  4. //Antonio Villanueva Segura
  5. #include <ncurses.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <unistd.h> //usleep
  9. #include <stdlib.h>     /* srand, rand */
  10. #include <string>
  11.  
  12.  
  13.  
  14. using namespace std ;
  15.  
  16. class pelota{
  17.     public:
  18.     pelota(WINDOW *win,int x,int y,string obj);
  19.     void run ();
  20.     bool contact(int x,int y);
  21.    
  22.     protected:
  23.     WINDOW *win;
  24.     void move (int &x,int &y);//logica del movimiento
  25.     void print (int &x,int &y);//imprime objeto
  26.     int x,y,max_x,max_y;//coordenadas y maximos
  27.     bool dir_x,dir_y;//direccion
  28.     string objeto;//objeto a mover
  29.     int tempo;
  30. };
  31.  
  32. /***********************************************************************/
  33.     pelota ::pelota(WINDOW *win,int x=1,int y=1,string obj="O"):win(win),x(x),y(y),dir_x(true),dir_y(true),objeto(obj){
  34.         getmaxyx(win,max_y,max_x);      /* get the number of rows and columns */
  35.         move(x,y);
  36.         curs_set(0);
  37.         noecho();
  38.         srand (time(NULL));//inicializa aleatorios
  39.     }
  40.  
  41. /***********************************************************************/
  42.     void pelota::move (int &x,int &y){//logica del movimiento
  43.        
  44.         if (tempo++ <5000){return ;}
  45.         erase();
  46.         tempo=0;
  47.  
  48.         dir_x ? x++: x--;
  49.         dir_y ? y++: y--;
  50.        
  51.         //choque en los extremos
  52.         if (x>max_x-3){dir_x^=1;}//inversa trayectoria
  53.         if (y>max_y-3){dir_y^=1;}  
  54.  
  55.         if (x<=1){dir_x^=1;}
  56.         if (y<=1) {dir_y^=1;}
  57.     }
  58.  
  59. /***********************************************************************/
  60.     void pelota::run (){
  61.             move(x,y);
  62.             mvprintw(y,x,objeto.c_str());          
  63.     }
  64. /***********************************************************************/
  65.     bool pelota::contact(int objx,int objy){//choque raqueta
  66.     //la pelota esta en un area, cuadrado de 3x3 con centro la raqueta ?
  67.        
  68.         objx--;
  69.         objy--;
  70.        
  71.         //centro objx,objy
  72.         for (int linea=0;linea<3;linea++){
  73.             for(int col=0;col<3;col++){
  74.                 if ((objx+linea)==x && (objy+col)==y){
  75.                     dir_x^=1;//inversa la trayectoria
  76.                     dir_y^=1;
  77.                     return true;}
  78.             }          
  79.         }      
  80.         return false;
  81.     }  
  82.    
  83. class raqueta : public pelota{
  84.     public:
  85.     raqueta (WINDOW *win,int x,int y,string obj);
  86.     void run ();
  87.     int getX()const;
  88.     int getY()const;
  89.    
  90.     private:   
  91.     void move (int &x,int &y);//logica del movimiento raqueta
  92.     int tecla;
  93.    
  94. };
  95. /***********************************************************************/
  96.     raqueta ::raqueta(WINDOW *win,int x=1,int y=1,string obj="O") :pelota(win,x,y,"|"){}
  97. /***********************************************************************/
  98.     void raqueta::move (int &x,int &y){//logica del movimiento
  99.  
  100.         timeout (0);//no bloquea lectura
  101.         tecla=getch();//lee teclado
  102.         if (x<max_x/2){
  103.            
  104.             switch (tecla){ //raqueta Izq. 
  105.                 case '7':--y;erase();break;        
  106.                 case '1':++y;erase();break;                
  107.                 }              
  108.         }else {        
  109.                 switch (tecla){ //raqueta Izq. 
  110.                     case '9':--y;erase();tecla=0;break;        
  111.                     case '3':++y;erase();tecla=0;break;
  112.                 }          
  113.         }
  114.  
  115.         //tecla=0;//Reset
  116.                
  117.         if (y<2){y=2;}
  118.         if (y>max_y-3){y=max_y-3;} 
  119.        
  120.  
  121.     }
  122. /***********************************************************************/  
  123.     void raqueta::run (){
  124.             move(x,y);
  125.             mvprintw(y,x,objeto.c_str());          
  126.     }
  127. /***********************************************************************/
  128.     int raqueta::getX()const{
  129.         return x;
  130.     }
  131. /***********************************************************************/
  132.     int raqueta::getY() const{
  133.         return y;
  134.     }  
  135. /***********************************************************************/
  136. /***********************************************************************/
  137. class juego {
  138.     public:
  139.     juego ();
  140.     void run ();       
  141.     private:
  142.     void pista();
  143.     WINDOW *win; //ventana curses
  144.     void initVideo();//inicializa video ncurses
  145.     int max_x,max_y;
  146.  
  147. };
  148. /***********************************************************************/
  149.     juego::juego (){
  150.             win=initscr(); /* Crea la ventana curses mode*/
  151.     }
  152. /***********************************************************************/  
  153.     void juego::run (){
  154.        
  155.         pelota p(win,40,12);
  156.         raqueta der(win,79,24);    
  157.         raqueta izq(win,1,1);
  158.  
  159.        
  160.         while (true){//Bucle principal juego
  161.             //erase();
  162.  
  163.             pista();
  164.             der.run(); //ejecuta raqueta derch.        
  165.             izq.run();//ejecuta raqueta izq.
  166.  
  167.  
  168.                
  169.             p.contact(izq.getX(),izq.getY());//choque pelota raqueta
  170.             p.contact(der.getX(),der.getY());//choque pelota raqueta
  171.                
  172.        
  173.             p.run();//ejecuta pelota
  174.  
  175.             pista();
  176.             refresh ();
  177.             //usleep(100000);      
  178.         }
  179.     };
  180. /***********************************************************************/  
  181.     void juego::initVideo(){//inicializa video ncurses
  182.         win=initscr(); /* Crea la ventana curses mode*/
  183.         clear();  /* Borra la pantalla entera bajo ncurses */
  184.         refresh(); /* Actualiza la ventana con los cambios */
  185.         curs_set(FALSE); // Don't display a cursor
  186.  
  187.         noecho();
  188.         cbreak();
  189.         timeout(1);
  190.         keypad(win, TRUE);
  191.         getmaxyx(win,max_y,max_x);      /* get the number of rows and columns */
  192.     }  
  193.     void juego:: pista(){
  194.         for (int y=1;y<max_y-3;y++){
  195.             mvprintw(y,37,"|");
  196.             refresh();
  197.         }
  198.  
  199.     }  
  200. /***********************************************************************/      
  201. /***********************************************************************/
  202. /***********************************************************************/
  203. int main (){
  204.     juego game;
  205.     game.run();
  206.     return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement