Advertisement
AntonioVillanueva

Programmation de l'ancien jeu arcade , ping-pong avec C ++

Dec 5th, 2017
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.77 KB | None | 0 0
  1. //installez les ncurses avant! ! sudo apt-get install libncurses-dev
  2. //compilation >  g++ -std=c++11 -o tennis tennis.cpp -lncurses
  3. //Etude de l'ancien jeu de ping pong en  c ++ objet
  4. //Antonio Villanueva Segura
  5. #include <ncurses.h>
  6. #include <stdlib.h>
  7. #include <string>
  8.  
  9. using namespace std ;
  10. #define RETARDO 10000 //délai pour un  ARM9 à 400 Mhz ==100
  11. //Touches de contrôle raquettes de ping-pongg
  12. #define SUBE_IZQ '7'
  13. #define BAJA_IZQ '1'
  14.  
  15. #define SUBE_DER '9'
  16. #define BAJA_DER '3'
  17.  
  18. #define MARGENX 3 //offset marge x fenêtre du terminal
  19. #define MARGENY 3 //offset marge y fenêtre du terminal
  20. #define MAX_X 80 //Maximum X dans fenetre ncurses , constructeur par défaut
  21. #define MAX_Y 24 //Maximum Y dans fenetre ncurses , constructeur par défaut
  22. /***********************************************************************/
  23. /***********************************************************************/
  24. class pelota{
  25.     public:
  26.     pelota(int max_x,int max_y,string obj,int x,int y);
  27.     void mueve(int x1,int y1,int x2,int y2) ;// mouvement de la balle
  28.     int getX() const;//Coordonne l'objet X, peut être une balle ou une raquette
  29.     int getY() const;//Coordonne l'objet Y, peut être une balle ou une raquette
  30.     int PtosIzq()const;//Retour, points de joueur à Gauche
  31.     int PtosDer() const;//Retour, points de joueur à Droite
  32.     string getObj()const;// retourne le dessin de l'objet O ou |
  33.    
  34.     protected:
  35.     string objeto;//dessin d'objet balle O raquette |
  36.     int max_x,max_y,x,y;//écran maximum, coordonnées de la balle O
  37.     bool dir_x,dir_y;//direction , où va la balle
  38.     int puntosIzq,puntosDerch;//points de chaque joueur
  39. };
  40. /***********************************************************************/
  41. pelota::pelota(int max_x=80,int max_y=24,string obj="O",int x=40,int y=12):
  42. max_x(max_x),max_y(max_y),x(x),y(y),dir_x(true),dir_y(true),
  43. puntosIzq(0),puntosDerch(0){objeto=obj;}
  44. /***********************************************************************/
  45. void pelota::mueve(int x1,int y1,int x2,int y2){// mouvement de la balle
  46.  
  47.     //se déplace selon la direction vrai ou faux
  48.     dir_x ? x++: x--;
  49.     dir_y ? y++: y--;
  50.        
  51.     //détection de raquettes si collision; trajectoire inverse
  52.        
  53.     if ( ((x1+1)==x && y1==y) || ((x2-1)==x && y2==y) ){dir_x^=1;}
  54.              
  55.     //collision avec les extrémités du champ; trajectoire inverse
  56.     if (x>max_x-MARGENX){dir_x^=1;puntosDerch++;flash();}
  57.     if (y>max_y-MARGENY){dir_y^=1;}
  58.  
  59.     if (x<=1){dir_x^=1;puntosIzq++;flash();}
  60.     if (y<=1) {dir_y^=1;}
  61. }
  62.  
  63. /***********************************************************************/
  64. int pelota::getX()const {return x;}//Coordonne X la balle ou la raquette
  65. /***********************************************************************/
  66. int pelota::getY()const{return y;}//Coordonne Y la balle ou la raquette
  67. /***********************************************************************/
  68. int pelota::PtosIzq()const {return puntosIzq;}//Retour, points de joueur à Gauche
  69. /***********************************************************************/
  70. int pelota::PtosDer()const {return puntosDerch;}//Retour, points de joueur à Droite
  71. /***********************************************************************/
  72. string pelota::getObj()const {return objeto;}//Graphique d'objet
  73. /***********************************************************************/
  74. class raqueta : public pelota {//Classe de raquette héritée de la balle ...
  75.     public:
  76.     raqueta(int max_x,int max_y,string obj,int x,int y);
  77.     void mueve(int tecla) ;//déplace la raquette , en fonction de la touche pressée
  78. };
  79. /***********************************************************************/
  80. raqueta::raqueta(int max_x=MAX_X,int max_y=MAX_Y,string obj="O",int x=1,int y=1):
  81. pelota ( max_x , max_y, "|",x,y){} //initialise la classe de base de balle
  82. /***********************************************************************/
  83. void raqueta::mueve(int tecla){//déplace la raquette , en fonction de la touche pressée
  84.  
  85.     if (x<max_x/2){//raquette Gauche
  86.            
  87.         switch (tecla){ //raquette Gauche.
  88.             case SUBE_IZQ:--y;erase();break;        
  89.             case BAJA_IZQ :++y;erase();break;                
  90.         }              
  91.     }else{//raquette Drotie        
  92.             switch (tecla){ //raqueta Droite.
  93.                 case SUBE_DER:--y;erase();tecla=0;break;        
  94.                 case BAJA_DER:++y;erase();tecla=0;break;
  95.             }          
  96.         }
  97.     tecla=0;//Reset . évite la répétition de la touche
  98.                
  99.     if (y<2){y=2;}//limite inférieure y
  100.     if (y>max_y-3){y=max_y-3;} //limite supérieure
  101. }      
  102.  
  103. /***********************************************************************/
  104. /***********************************************************************/
  105. class juego{//Contexte et gestion du jeu
  106.     public:
  107.     juego ();//Constructeur de jeu par défaut
  108.     ~juego();//Destructeur, fin jeu
  109.     void run ();
  110.    
  111.     private:
  112.     void pantalla();//Montrer ce qui devrait être peint
  113.     void campo ();//dessiner un champ de tennis
  114.     WINDOW *win;//fenetre ncurses , graphique
  115.     int max_x,max_y;//limites, fenêtre ncurses
  116.     pelota ball;//instance d'une balle
  117.     raqueta izq,der;//Instances de deux raquettes gauche et droite
  118. };
  119.  
  120. /***********************************************************************/
  121.  
  122. juego::juego():win (initscr()){//Constructeur de jeu par défaut
  123.     getmaxyx(win,max_y,max_x);//maximum du jeu , fenêtre ncurses
  124.     curs_set(0);
  125.     noecho();  
  126.  
  127.     ball =pelota( max_x , max_y, "O");//Créer une balle
  128.     izq=raqueta (max_x , max_y, "|",2,1);//Créer une raquette gauche
  129.     der=raqueta (max_x , max_y, "X",max_x-3,1);//Créer une raquette droite
  130.     }
  131. /***********************************************************************/
  132. juego::~juego(){ //Fin du jeu
  133.     delwin(win);//fin  ncurses
  134.     endwin();
  135.     refresh();}
  136. /***********************************************************************/
  137. void juego::run(){
  138.     int tempo(0);//pour le retard, en boucle, ne bloque pas
  139.     int tecla;//pour la lecture du clavier
  140.     timeout (0);//ça ne bloque pas la lecture
  141.        
  142.     while (true){// boucle principale jeu
  143.         tecla=getch();//lire le clavier
  144.            
  145.         while (tempo  >=RETARDO){  
  146.             ball.mueve(izq.getX(),izq.getY(),der.getX(),der.getY());//déplacer la balle
  147.             tempo=0;
  148.         }
  149.        
  150.         tempo++;//retardo
  151.        
  152.         izq.mueve(tecla);//raquette gauche move
  153.         der.mueve(tecla);//raquette droite move      
  154.  
  155.         pantalla();//Montrer ce qui devrait être peint
  156.     }
  157. }
  158. /***********************************************************************/
  159. void juego::pantalla(){//Montrer ce qui devrait être peint
  160.  
  161.     erase ();//effacer l'écran
  162.     mvprintw(ball.getY(),ball.getX(),ball.getObj().c_str());//impression, balle
  163.    
  164.     mvprintw(izq.getY(),izq.getX(),izq.getObj().c_str());//impression, raquette Gauche.
  165.     mvprintw(der.getY(),der.getX(),der.getObj().c_str());//impression, raquette Droite.
  166.    
  167.  
  168.     mvprintw(max_y-3,((max_x/2)-5),to_string(ball.PtosDer()).c_str() );//points Droite
  169.     mvprintw(max_y-3,((max_x/2) + 4),to_string(ball.PtosIzq()).c_str() );//points Gauche
  170.    
  171.     campo();//imprimer un court de tennis, lignes centrales et haut
  172.     refresh();
  173. }
  174. /***********************************************************************/
  175. void juego::campo (){//imprimer un court de tennis, lignes centrales, haut
  176.     for (int y=0;y<max_y;y++){
  177.         mvprintw (y,(max_x-1)/2,"|"); //centre , moitie de tennis
  178.     }  
  179.  
  180.     for (int y=0;y<max_y;y+=max_y-1){//dessiner des lignes sup et  bas  
  181.         for (int x=0; x<max_x ;x++){ mvprintw (y,x,"-");}
  182.     }
  183. }
  184. /***********************************************************************/
  185. /***********************************************************************/
  186. /***********************************************************************/
  187. int main(){
  188.  
  189.     juego tenis;
  190.     tenis.run();
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement