Advertisement
AntonioVillanueva

Juego antiguo Ping-Pong en C++ objeto y con grafismo curses

Dec 3rd, 2017
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.66 KB | None | 0 0
  1. //https://www.youtube.com/watch?v=xFS6tbjdv3Q
  2. //instalar las ncurses antes ! sudo apt-get install libncurses-dev
  3. //compilacion  g++ -std=c++11 -o juego juego.cpp -lncurses
  4. //Estudio del antiguo juego de ping pong en c++ objeto empleando la libreria  grafica curses
  5. //Antonio Villanueva Segura
  6. #include <ncurses.h>
  7. #include <stdlib.h>
  8. #include <string>
  9.  
  10. using namespace std ;
  11. #define RETARDO 10000 //retardo para un ARM9 a 400 Mhz ==100
  12. //Teclas de control raquetas de ping-pong
  13. #define SUBE_IZQ '7'
  14. #define BAJA_IZQ '1'
  15.  
  16. #define SUBE_DER '9'
  17. #define BAJA_DER '3'
  18.  
  19. #define MARGENX 3 //offset margen x ventana terminal
  20. #define MARGENY 3 //offset margen y ventana terminal
  21. #define MAX_X 80 //Maxima X en ventana curses , constructor por defecto
  22. #define MAX_Y 24 //Maxima Y en ventana curses , constructor por defecto
  23. /***********************************************************************/
  24. /***********************************************************************/
  25. class pelota{
  26.     public:
  27.     pelota(int max_x,int max_y,string obj,int x,int y);
  28.     void mueve(int x1,int y1,int x2,int y2);//algoritmo movimiento pelota
  29.     int getX() const;//Coordenadas X objeto ,puede ser pelota o raqueta
  30.     int getY() const;//Coordenadas Y objeto ,puede ser pelota o raqueta
  31.     int PtosIzq()const;//Retorna puntos jugador Izquierda
  32.     int PtosDer() const;//Retorna puntos jugador Derecha
  33.     string getObj()const;// retorna dibujo del objeto
  34.    
  35.     protected:
  36.     string objeto;//dibujo del objeto pelota O raqueta |
  37.     int max_x,max_y,x,y;//maximos pantalla,coordenadas pelota
  38.     bool dir_x,dir_y;//direccion hacia donde va la pelota
  39.     int puntosIzq,puntosDerch;//puntos de cada jugador
  40. };
  41. /***********************************************************************/
  42. pelota::pelota(int max_x=80,int max_y=24,string obj="O",int x=40,int y=12):
  43. max_x(max_x),max_y(max_y),x(x),y(y),dir_x(true),dir_y(true),
  44. puntosIzq(0),puntosDerch(0){objeto=obj;}
  45. /***********************************************************************/
  46. void pelota::mueve(int x1,int y1,int x2,int y2){// movimiento pelota
  47.  
  48.     //se desplaza segun la direccion true o false
  49.     dir_x ? x++: x--;
  50.     dir_y ? y++: y--;
  51.        
  52.     //deteccion raquetas , colision ; inversa trayectoria
  53.        
  54.     if ( ((x1+1)==x && y1==y) || ((x2-1)==x && y2==y) ){dir_x^=1;}
  55.              
  56.     //choque con los extremos del campo ; inversa trayectoria
  57.     if (x>max_x-MARGENX){dir_x^=1;puntosDerch++;flash();}
  58.     if (y>max_y-MARGENY){dir_y^=1;}
  59.  
  60.     if (x<=1){dir_x^=1;puntosIzq++;flash();}
  61.     if (y<=1) {dir_y^=1;}
  62. }
  63.  
  64. /***********************************************************************/
  65. int pelota::getX()const {return x;}//Coordenada X pêlota o raqueta
  66. /***********************************************************************/
  67. int pelota::getY()const{return y;}//Coordenada Y pêlota o raqueta
  68. /***********************************************************************/
  69. int pelota::PtosIzq()const {return puntosIzq;}//Retorna puntos jugador Izq.
  70. /***********************************************************************/
  71. int pelota::PtosDer()const {return puntosDerch;}//Retorna puntos jugador Der.
  72. /***********************************************************************/
  73. string pelota::getObj()const {return objeto;}//Grafico del objeto
  74. /***********************************************************************/
  75. class raqueta : public pelota {//Clase raqueta hereda de pelota ...
  76.     public:
  77.     raqueta(int max_x,int max_y,string obj,int x,int y);
  78.     void mueve(int tecla);//mueve raqueta en funcion tecla
  79. };
  80. /***********************************************************************/
  81. raqueta::raqueta(int max_x=MAX_X,int max_y=MAX_Y,string obj="O",int x=1,int y=1):
  82. pelota ( max_x , max_y, "|",x,y){} //inicializa clase base pelota{}
  83. /***********************************************************************/
  84. void raqueta::mueve(int tecla){//mueve raqueta en funcion tecla
  85.  
  86.     if (x<max_x/2){//raqueta izquierda
  87.            
  88.         switch (tecla){ //raqueta Izq.
  89.             case SUBE_IZQ:--y;erase();break;        
  90.             case BAJA_IZQ :++y;erase();break;                
  91.         }              
  92.     }else{//raqueta Derecha        
  93.             switch (tecla){ //raqueta Derch.
  94.                 case SUBE_DER:--y;erase();tecla=0;break;        
  95.                 case BAJA_DER:++y;erase();tecla=0;break;
  96.             }          
  97.         }
  98.     tecla=0;//Reset evita repeticion de tecla
  99.                
  100.     if (y<2){y=2;}//limite inferior y
  101.     if (y>max_y-3){y=max_y-3;} //limite superior
  102. }      
  103.  
  104. /***********************************************************************/
  105. /***********************************************************************/
  106. class juego{//Contexto y gestion del  juego
  107.     public:
  108.     juego ();//Constructor por defecto de juego
  109.     ~juego();//Destructor ... Fin juego
  110.     void run ();
  111.    
  112.     private:
  113.     void pantalla();//Muestra lo que se debe de pintar
  114.     void campo ();//dibuja un campo de tenis
  115.     WINDOW *win;//ventana curses , graficos
  116.     int max_x,max_y;//limites ventana curses
  117.     pelota ball;//instancia de una pelota
  118.     raqueta izq,der;//instancias  de dos raquetas Izquierda y Derecha
  119. };
  120.  
  121. /***********************************************************************/
  122.  
  123. juego::juego():win (initscr()){//Constructor de la clase juego
  124.     getmaxyx(win,max_y,max_x);//maximos de la ventana juego ncurses
  125.     curs_set(0);
  126.     noecho();  
  127.  
  128.     ball =pelota( max_x , max_y, "O");//Crea una pelota
  129.     izq=raqueta (max_x , max_y, "|",2,1);//Crea raqueta izquierda
  130.     der=raqueta (max_x , max_y, "X",max_x-3,1);//Crea raqueta derecha
  131.     }
  132. /***********************************************************************/
  133. juego::~juego(){ //Fin juego  
  134.     delwin(win);//fin de ncurses
  135.     endwin();
  136.     refresh();}
  137. /***********************************************************************/
  138. void juego::run(){
  139.     int tempo(0);//para retardo , en bucle , no bloquea
  140.     int tecla;//para lectura del teclado
  141.     timeout (0);//no bloquea lectura
  142.        
  143.     while (true){//bucle principal juego
  144.         tecla=getch();//lee teclado
  145.            
  146.         while (tempo  >=RETARDO){  
  147.             ball.mueve(izq.getX(),izq.getY(),der.getX(),der.getY());//mueve pelota
  148.             tempo=0;
  149.         }
  150.        
  151.         tempo++;//retardo
  152.        
  153.         izq.mueve(tecla);// mueve segun tecla pulsada raqueta izquierda
  154.         der.mueve(tecla);//mueve  segun tecla pulsada raqueta derecha        
  155.  
  156.         pantalla();//Imprime ,pinta , muestra  objetos en pantalla
  157.     }
  158. }
  159. /***********************************************************************/
  160. void juego::pantalla(){//Muestra lo que se debe de pintar
  161.  
  162.     erase ();//borra pantalla
  163.     mvprintw(ball.getY(),ball.getX(),ball.getObj().c_str());//imprime pelota
  164.    
  165.     mvprintw(izq.getY(),izq.getX(),izq.getObj().c_str());//imprime raqueta izq.
  166.     mvprintw(der.getY(),der.getX(),der.getObj().c_str());//imprime raqueta derer.
  167.    
  168.  
  169.     mvprintw(max_y-3,((max_x/2)-5),to_string(ball.PtosDer()).c_str() );//puntos Derecha
  170.     mvprintw(max_y-3,((max_x/2) + 4),to_string(ball.PtosIzq()).c_str() );//puntos Izquierda
  171.    
  172.     campo();//imprime un campo de tenis ,lineas central ,superior
  173.     refresh();
  174. }
  175. /***********************************************************************/
  176. void juego::campo (){//dibuja un campo de tenis
  177.     for (int y=0;y<max_y;y++){
  178.         mvprintw (y,(max_x-1)/2,"|"); //centro del campo de tenis
  179.     }  
  180.  
  181.     for (int y=0;y<max_y;y+=max_y-1){//dibuja rayas sup. e inferior  
  182.         for (int x=0; x<max_x ;x++){ mvprintw (y,x,"-");}
  183.     }
  184. }
  185. /***********************************************************************/
  186. /***********************************************************************/
  187. /***********************************************************************/
  188. int main(){
  189.  
  190.     juego tenis;
  191.     tenis.run();
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement