Advertisement
Guest User

JUEGO DE LA NAVESITA LOKO

a guest
Mar 22nd, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <conio.h>
  4. #include <stdlib.h>//Para utilizar la funcion rand de número aleaotrio
  5. #include <list>  // Para usar listas
  6.  
  7.  
  8. #define ARRIBA 72
  9. #define IZQUIERDA 75
  10. #define DERECHA 77
  11. #define ABAJO 80
  12.  
  13. using namespace std;   // para usar list sin tanto nombre
  14.  
  15. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  16.  
  17. void gotoxy(int x,int y);
  18. void OcultarCursor(void);
  19.  
  20.  
  21. void gotoxy(int x, int y){
  22.     HANDLE hCon;//identificamos el handle
  23.     COORD dwPos;
  24.     hCon=GetStdHandle(STD_OUTPUT_HANDLE);//recogemos la parte de la consola que queremos manipular y el parámetro es ed manejador de salida, dar posición es salida
  25.     dwPos.X=x;
  26.     dwPos.Y=y;
  27.  
  28.     SetConsoleCursorPosition(hCon,dwPos );//2 parámetros el identificador handle,  y el segundo una estructura de datos
  29. }
  30. void OcultarCursor(){
  31.     HANDLE hCon;//identificamos el handle
  32.         hCon=GetStdHandle(STD_OUTPUT_HANDLE);//recogemos la parte de la consola que queremos manipular y el parámetro es ed manejador de salida, dar posición es salida
  33.         CONSOLE_CURSOR_INFO cci;//Estructura que controla la apariencia del cursor que se muestra en pantalla
  34.         cci.dwSize=100; //puede tormar un valor de 1-100 dependiendo de el será el tipo de cursor en pantalla
  35.         cci.bVisible=FALSE;// si es TRUE el cursor se muestra en pantalla y si fuera FALSE no
  36.         SetConsoleCursorInfo(hCon,&cci);
  37. }
  38.  
  39.  
  40. // Método para pintar límites del juego
  41. void pintar_limites(){
  42.    
  43.     // Líneas horizontales
  44.    
  45.     for(int i=2;i<78;i++){
  46.         gotoxy(i,3); printf("%c", 205);  // 205 es el caracter de linea
  47.         gotoxy(i,33); printf("%c", 205);  // 205 es el caracter de linea
  48.     }
  49.    
  50.     // Líneas verticales
  51.    
  52.     for (int i=4;i<33;i++){
  53.         gotoxy(2,i); printf("%c",186);  // 205 es el caracter de linea
  54.         gotoxy(77,i); printf("%c",186);  // 205 es el caracter de linea
  55.  
  56.     }
  57.     // Esquinas del marco
  58.    
  59.     gotoxy(2,3); printf("%c",201);
  60.     gotoxy(2,33); printf("%c",200);
  61.     gotoxy(77,3); printf("%c",187);
  62.     gotoxy(77,33); printf("%c",188);
  63.    
  64. }
  65.  
  66. class NAVE{
  67.     private:
  68.         int x,y; // Coordenadas de la nave
  69.         int corazones;
  70.         int vidas;
  71.     public:
  72.         NAVE(int _x, int _y, int _corazones, int _vidas):x(_x),y(_y),corazones(_corazones),vidas(_vidas) // Constructor de nave
  73.         {
  74.         }
  75.         int X(){return x;}// Al pasar esta clase Nave a asteroide necediso sus coordenadas públicas
  76.         int Y(){return y;}
  77.         void COR(){ corazones--;}// ;Método para restar corazones
  78.         void pintar();
  79.         void borrar();
  80.         void mover();
  81.         void pintar_corazones();
  82.         void morir();
  83.         int Vidas();
  84.  
  85. };/* Otra forma de crear el constructor
  86. NAVE::NAVE(int _x, int _y){
  87.     this.x=_x;
  88.     this.y=_y;
  89. }*/
  90.  
  91. int NAVE::Vidas(){
  92.     return vidas;
  93. }
  94.  
  95. void NAVE::pintar(){
  96.     gotoxy(x,y); printf(" %c",30);
  97.     gotoxy(x,y+1); printf("%c%c%c",40,207,41);
  98.     gotoxy(x,y+2); printf("%c%c%c%c",30,190,190,30);
  99. }
  100.  
  101.  
  102. void NAVE::borrar(){
  103.     gotoxy(x,y);  printf("       ");//Un espacio mas
  104.     gotoxy(x,y+1);printf("       ");
  105.     gotoxy(x,y+2);printf("       ");
  106. }
  107.  
  108.  
  109. void NAVE::pintar_corazones(){
  110.     gotoxy(50,2);printf("VIDAS %d", vidas);
  111.     gotoxy(64,2); printf("SALUD");
  112.     gotoxy(70,2); printf("   ");    // Borrar los anteriores corazones
  113.     for(int i=0;i<corazones;i++){
  114.        gotoxy(70+i,2); printf("%c",3);
  115.     }
  116.  
  117. }
  118.  
  119.  
  120.  
  121. void NAVE::mover(){
  122.  
  123.         //Si se ha presionado una teclas se entra en el fi
  124.         if(kbhit()){
  125.             char tecla=getch();
  126.            
  127.             borrar();// Borra nave y no hace falta decirle que viena de una clase porque es un método de la misma
  128.             // gotoxy(x,y);printf(" ");
  129.             if (tecla== IZQUIERDA && x>3) x--;
  130.             if (tecla== DERECHA && (x+6)<77)  x++;
  131.             if (tecla== ARRIBA && y>4) y--;
  132.             if (tecla== ABAJO && (y+3)<33) y++;
  133.             if (tecla== 'e') corazones--; // de momento Al pulsar e se quita un corazón
  134.            
  135.             pintar();      
  136.             pintar_corazones();  
  137.         }
  138.        
  139.    
  140. }
  141. void NAVE::morir(){
  142.     //Nos hace un efecto de explosión al tener corazones a 0
  143.     if(corazones==0){
  144.         borrar();
  145.         gotoxy(x,y);printf(" ** ");
  146.         gotoxy(x,y+1); printf(" **** ");
  147.         gotoxy(x,y+2); printf(" ** ");
  148.         Sleep(200);
  149.        
  150.         borrar();
  151.         gotoxy(x,y);printf("* ** *");
  152.         gotoxy(x,y+1); printf(" **** ");
  153.         gotoxy(x,y+2); printf("* ** *");
  154.         Sleep(200);
  155.        
  156.         borrar();
  157.         vidas--;
  158.        
  159.         corazones=3;
  160.         pintar_corazones();
  161.         pintar();
  162.     }
  163. }
  164.  
  165. class AST{
  166.         int x,y;//Las dos coordenadas de la posición del asteroide
  167.     public:
  168.         AST(int _x,int  _y):x(_x),y(_y){}//Constructor que recibe las 2 coordenadas y las asigna la objeto
  169.         int X(){
  170.             return(x);
  171.         }
  172.         int Y(){
  173.             return(y);
  174.         }
  175.         void pintar();
  176.         void mover();
  177.         void choque(NAVE &N);//Declaro el prototipo de un método choque
  178. };
  179.  
  180. void AST::pintar(){
  181.     gotoxy(x,y);printf("%c", 184 );//Colocamos en la posición del asteroide el símbolo    copyright
  182. }
  183. void AST::mover(){
  184.     gotoxy(x,y);printf(" ");//Nos posicionamos en el asteroide y lo borramos
  185.     y++;//bajamos el asteroide
  186.     if (y>32){   // Cada uno que se va uno se pone
  187.         //que vuelva a caer
  188.         x=4+(rand()%73);//Posición del asteroide al comienzo de la pantalla entre x=4 y x=78
  189.         y=4;//Posición del asteroide al comienzo de la posición de la pantalla en y=4
  190.     }
  191.     pintar();
  192. }
  193. void AST::choque(NAVE &N){
  194.     //Si el asteroide está en el rango de x e y de la nave se producirá choque
  195.     if(x>=N.X() && x<N.X()+6 && y>=N.Y() && y<=N.Y()+2){
  196.         N.borrar();//Borramos la nave al tocar asteroide
  197.         N.COR();//Quita un corazón
  198.         N.pintar();//Pintamos la nave
  199.         N.pintar_corazones();//Visualmente escribimos los corazones que quedan
  200.         x=4+(rand()%73);  
  201.         y=4;//Subimos el asteroide
  202.        
  203.     }
  204. }
  205.  
  206.  
  207. class BALA{
  208.     int x,y;
  209.     public:
  210.         BALA(int _x, int _y):x(_x),y(_y){}
  211.         // el x recibe el _x y el y el _y
  212.         int X() {return x;};   // Metodos accesores para la X a Y
  213.         int Y() {return y;};
  214.        
  215.        
  216.                      
  217.         void mover();  // Sólo va a mover la bala 
  218.         bool fuera();  // Cuando la bala se debe eliminar
  219. };
  220.  
  221. void BALA::mover(){
  222.     gotoxy(x,y); printf(" "); // Borramos para poder borrar
  223.     // if (y>4){    // SE quita el if porque se controla con el método de fuera la bala
  224.     // la bala sube
  225.     y--;
  226.     // }
  227.     gotoxy(x,y); printf("*");
  228.    
  229. }
  230.  
  231. bool BALA::fuera(){
  232.     if(y==4) return true;
  233.     return false;
  234. }
  235.  
  236.  
  237.  
  238. int main(int argc, char** argv) {
  239.     int x=10,y=10;
  240.     bool game_over=false;
  241.     int puntos=0; //Puntuacion, se suma al eliminar asterides con balas
  242.     OcultarCursor();   // Para que no parpadee el cursor de al lado
  243.     // gotoxy(x,y);printf("*");
  244.    
  245.     NAVE N(7,7,3,3); // Construimos una nave en x 7, y 7 y 3 corazones
  246.    
  247.     pintar_limites();
  248.     N.pintar();  // Pintamos la nave
  249.     N.pintar_corazones();
  250.    //  AST ast1(10,4),ast2(4,8),ast3(15,10);//Dibuja los tres asteorides de diferentes posiciones
  251.     list<AST*> A;  // Creamos la lista de Asterioides
  252.     list<AST*>::iterator itA;
  253.    
  254.     for (int i=0;i<3;i++){   // El for pone de forma aleatoria los asteroides y el 3 dá el número de asteroides
  255.         A.push_back(new AST((rand()%75+3),(rand()%5+4)));  // Metemos en la lista de asterioides uno entre 3 y 77 la x
  256.     }
  257.    
  258.     list<BALA*>B;  // Creamos la lista de BALAS que esta es una clase y se usa el puntero
  259.    
  260.     list<BALA*>::iterator it;   // El iterador está unido al puntero de BALAS
  261.    
  262.     while(!game_over) {
  263.         gotoxy(4,2); printf("Puntos %d", puntos);
  264.         // Controlamos los disparos que hago
  265.         if(kbhit())
  266.         {
  267.             char tecla=getch();
  268.             if(tecla=='a' || tecla=='A')
  269.             {
  270.                 // metemos en la lista el disparo y le damos la dirección 
  271.                 B.push_back(new BALA(N.X()+2,N.Y()-1));   // Nos dá igual el nombre de la bala
  272.                
  273.  
  274.             }
  275.         }
  276.    
  277.    
  278.         for (it=B.begin();it!=B.end();it++)    // Para controlar el iterador de la lista de las BALAS
  279.            {
  280.                 (*it)->mover();         // Se llama al metodo mover de la BALA.
  281.                 if((*it)->fuera())
  282.                 {
  283.                     gotoxy((*it)->X(),(*it)->Y());  // Tenemos la posición X e Y de la bala
  284.                     printf(" ");
  285.                     delete(*it); // Borramos puntero
  286.                     it=B.erase(it);  // Borramos de memoria el elemento de la lista
  287.                    
  288.                 }
  289.            }
  290.        
  291.    
  292.     /*  ast1.mover();ast1.choque(N); // Movemos cada asteroide para ver si ha chocado y llamamos a la nave
  293.         ast2.mover();ast2.choque(N);
  294.         ast3.mover();ast3.choque(N);*/
  295.        
  296.         for (itA=A.begin();itA!=A.end();itA++){
  297.             (*itA)->mover();
  298.             (*itA)->choque(N);    // Miramos si hay choque y le pasamos la nave
  299.         }
  300.        
  301.         for (itA=A.begin();itA!=A.end();itA++){    // Recorre los asteroides
  302.             for (it=B.begin();it!=B.end();it++)    // Recorre las balas
  303.             {
  304.                 if((*itA)->X()==(*it)->X() && ((*itA)->Y()+1==(*it)->Y() || (*itA)->Y()==(*it)->Y())) //La posicion del asteroide mas uno sea la de la bala o la posicion del asteroide
  305.                 {      
  306.                     //Borramos la bala que choca contra el asteroide
  307.                     gotoxy((*it)->X() , (*it)->Y() ); printf(" "); //Borramos la bala de la pantalla
  308.                     delete(*it); //Borrar de memoria la bala
  309.                     it=B.erase(it); //Borrar de la lista la bala
  310.                    
  311.                    
  312.                     //Crear otro asteroide
  313.                     A.push_back(new AST(rand()%74+3,4));
  314.                     //Borramos el asteroide
  315.                     gotoxy((*itA)->X(), (*itA)->Y()); printf(" "); //Borramos el asteroide de la pantilla
  316.                     delete(*itA); //Borramos el asteroide de memoria
  317.                     itA=A.erase(itA); //Borramos el asteroide de la lista
  318.                    
  319.                     puntos+=5;
  320.        
  321.                    
  322.                 }
  323.             }      
  324.         }
  325.            
  326.         N.mover();
  327.         N.morir();
  328.         if (N.Vidas()<0){
  329.             game_over = true;
  330.         }
  331.         Sleep(50);//se detiene 30 milisegundos
  332.     }
  333.     system("cls");
  334.     printf("GAME OVER\n");
  335.     getch();
  336.     return 0;
  337. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement