Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <windows.h>
- #include <conio.h>
- #include <stdlib.h>//Para utilizar la funcion rand de número aleaotrio
- #include <list> // Para usar listas
- #define ARRIBA 72
- #define IZQUIERDA 75
- #define DERECHA 77
- #define ABAJO 80
- using namespace std; // para usar list sin tanto nombre
- /* run this program using the console pauser or add your own getch, system("pause") or input loop */
- void gotoxy(int x,int y);
- void OcultarCursor(void);
- void gotoxy(int x, int y){
- HANDLE hCon;//identificamos el handle
- COORD dwPos;
- 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
- dwPos.X=x;
- dwPos.Y=y;
- SetConsoleCursorPosition(hCon,dwPos );//2 parámetros el identificador handle, y el segundo una estructura de datos
- }
- void OcultarCursor(){
- HANDLE hCon;//identificamos el handle
- 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
- CONSOLE_CURSOR_INFO cci;//Estructura que controla la apariencia del cursor que se muestra en pantalla
- cci.dwSize=100; //puede tormar un valor de 1-100 dependiendo de el será el tipo de cursor en pantalla
- cci.bVisible=FALSE;// si es TRUE el cursor se muestra en pantalla y si fuera FALSE no
- SetConsoleCursorInfo(hCon,&cci);
- }
- // Método para pintar límites del juego
- void pintar_limites(){
- // Líneas horizontales
- for(int i=2;i<78;i++){
- gotoxy(i,3); printf("%c", 205); // 205 es el caracter de linea
- gotoxy(i,33); printf("%c", 205); // 205 es el caracter de linea
- }
- // Líneas verticales
- for (int i=4;i<33;i++){
- gotoxy(2,i); printf("%c",186); // 205 es el caracter de linea
- gotoxy(77,i); printf("%c",186); // 205 es el caracter de linea
- }
- // Esquinas del marco
- gotoxy(2,3); printf("%c",201);
- gotoxy(2,33); printf("%c",200);
- gotoxy(77,3); printf("%c",187);
- gotoxy(77,33); printf("%c",188);
- }
- class NAVE{
- private:
- int x,y; // Coordenadas de la nave
- int corazones;
- int vidas;
- public:
- NAVE(int _x, int _y, int _corazones, int _vidas):x(_x),y(_y),corazones(_corazones),vidas(_vidas) // Constructor de nave
- {
- }
- int X(){return x;}// Al pasar esta clase Nave a asteroide necediso sus coordenadas públicas
- int Y(){return y;}
- void COR(){ corazones--;}// ;Método para restar corazones
- void pintar();
- void borrar();
- void mover();
- void pintar_corazones();
- void morir();
- int Vidas();
- };/* Otra forma de crear el constructor
- NAVE::NAVE(int _x, int _y){
- this.x=_x;
- this.y=_y;
- }*/
- int NAVE::Vidas(){
- return vidas;
- }
- void NAVE::pintar(){
- gotoxy(x,y); printf(" %c",30);
- gotoxy(x,y+1); printf("%c%c%c",40,207,41);
- gotoxy(x,y+2); printf("%c%c%c%c",30,190,190,30);
- }
- void NAVE::borrar(){
- gotoxy(x,y); printf(" ");//Un espacio mas
- gotoxy(x,y+1);printf(" ");
- gotoxy(x,y+2);printf(" ");
- }
- void NAVE::pintar_corazones(){
- gotoxy(50,2);printf("VIDAS %d", vidas);
- gotoxy(64,2); printf("SALUD");
- gotoxy(70,2); printf(" "); // Borrar los anteriores corazones
- for(int i=0;i<corazones;i++){
- gotoxy(70+i,2); printf("%c",3);
- }
- }
- void NAVE::mover(){
- //Si se ha presionado una teclas se entra en el fi
- if(kbhit()){
- char tecla=getch();
- borrar();// Borra nave y no hace falta decirle que viena de una clase porque es un método de la misma
- // gotoxy(x,y);printf(" ");
- if (tecla== IZQUIERDA && x>3) x--;
- if (tecla== DERECHA && (x+6)<77) x++;
- if (tecla== ARRIBA && y>4) y--;
- if (tecla== ABAJO && (y+3)<33) y++;
- if (tecla== 'e') corazones--; // de momento Al pulsar e se quita un corazón
- pintar();
- pintar_corazones();
- }
- }
- void NAVE::morir(){
- //Nos hace un efecto de explosión al tener corazones a 0
- if(corazones==0){
- borrar();
- gotoxy(x,y);printf(" ** ");
- gotoxy(x,y+1); printf(" **** ");
- gotoxy(x,y+2); printf(" ** ");
- Sleep(200);
- borrar();
- gotoxy(x,y);printf("* ** *");
- gotoxy(x,y+1); printf(" **** ");
- gotoxy(x,y+2); printf("* ** *");
- Sleep(200);
- borrar();
- vidas--;
- corazones=3;
- pintar_corazones();
- pintar();
- }
- }
- class AST{
- int x,y;//Las dos coordenadas de la posición del asteroide
- public:
- AST(int _x,int _y):x(_x),y(_y){}//Constructor que recibe las 2 coordenadas y las asigna la objeto
- int X(){
- return(x);
- }
- int Y(){
- return(y);
- }
- void pintar();
- void mover();
- void choque(NAVE &N);//Declaro el prototipo de un método choque
- };
- void AST::pintar(){
- gotoxy(x,y);printf("%c", 184 );//Colocamos en la posición del asteroide el símbolo copyright
- }
- void AST::mover(){
- gotoxy(x,y);printf(" ");//Nos posicionamos en el asteroide y lo borramos
- y++;//bajamos el asteroide
- if (y>32){ // Cada uno que se va uno se pone
- //que vuelva a caer
- x=4+(rand()%73);//Posición del asteroide al comienzo de la pantalla entre x=4 y x=78
- y=4;//Posición del asteroide al comienzo de la posición de la pantalla en y=4
- }
- pintar();
- }
- void AST::choque(NAVE &N){
- //Si el asteroide está en el rango de x e y de la nave se producirá choque
- if(x>=N.X() && x<N.X()+6 && y>=N.Y() && y<=N.Y()+2){
- N.borrar();//Borramos la nave al tocar asteroide
- N.COR();//Quita un corazón
- N.pintar();//Pintamos la nave
- N.pintar_corazones();//Visualmente escribimos los corazones que quedan
- x=4+(rand()%73);
- y=4;//Subimos el asteroide
- }
- }
- class BALA{
- int x,y;
- public:
- BALA(int _x, int _y):x(_x),y(_y){}
- // el x recibe el _x y el y el _y
- int X() {return x;}; // Metodos accesores para la X a Y
- int Y() {return y;};
- void mover(); // Sólo va a mover la bala
- bool fuera(); // Cuando la bala se debe eliminar
- };
- void BALA::mover(){
- gotoxy(x,y); printf(" "); // Borramos para poder borrar
- // if (y>4){ // SE quita el if porque se controla con el método de fuera la bala
- // la bala sube
- y--;
- // }
- gotoxy(x,y); printf("*");
- }
- bool BALA::fuera(){
- if(y==4) return true;
- return false;
- }
- int main(int argc, char** argv) {
- int x=10,y=10;
- bool game_over=false;
- int puntos=0; //Puntuacion, se suma al eliminar asterides con balas
- OcultarCursor(); // Para que no parpadee el cursor de al lado
- // gotoxy(x,y);printf("*");
- NAVE N(7,7,3,3); // Construimos una nave en x 7, y 7 y 3 corazones
- pintar_limites();
- N.pintar(); // Pintamos la nave
- N.pintar_corazones();
- // AST ast1(10,4),ast2(4,8),ast3(15,10);//Dibuja los tres asteorides de diferentes posiciones
- list<AST*> A; // Creamos la lista de Asterioides
- list<AST*>::iterator itA;
- for (int i=0;i<3;i++){ // El for pone de forma aleatoria los asteroides y el 3 dá el número de asteroides
- A.push_back(new AST((rand()%75+3),(rand()%5+4))); // Metemos en la lista de asterioides uno entre 3 y 77 la x
- }
- list<BALA*>B; // Creamos la lista de BALAS que esta es una clase y se usa el puntero
- list<BALA*>::iterator it; // El iterador está unido al puntero de BALAS
- while(!game_over) {
- gotoxy(4,2); printf("Puntos %d", puntos);
- // Controlamos los disparos que hago
- if(kbhit())
- {
- char tecla=getch();
- if(tecla=='a' || tecla=='A')
- {
- // metemos en la lista el disparo y le damos la dirección
- B.push_back(new BALA(N.X()+2,N.Y()-1)); // Nos dá igual el nombre de la bala
- }
- }
- for (it=B.begin();it!=B.end();it++) // Para controlar el iterador de la lista de las BALAS
- {
- (*it)->mover(); // Se llama al metodo mover de la BALA.
- if((*it)->fuera())
- {
- gotoxy((*it)->X(),(*it)->Y()); // Tenemos la posición X e Y de la bala
- printf(" ");
- delete(*it); // Borramos puntero
- it=B.erase(it); // Borramos de memoria el elemento de la lista
- }
- }
- /* ast1.mover();ast1.choque(N); // Movemos cada asteroide para ver si ha chocado y llamamos a la nave
- ast2.mover();ast2.choque(N);
- ast3.mover();ast3.choque(N);*/
- for (itA=A.begin();itA!=A.end();itA++){
- (*itA)->mover();
- (*itA)->choque(N); // Miramos si hay choque y le pasamos la nave
- }
- for (itA=A.begin();itA!=A.end();itA++){ // Recorre los asteroides
- for (it=B.begin();it!=B.end();it++) // Recorre las balas
- {
- 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
- {
- //Borramos la bala que choca contra el asteroide
- gotoxy((*it)->X() , (*it)->Y() ); printf(" "); //Borramos la bala de la pantalla
- delete(*it); //Borrar de memoria la bala
- it=B.erase(it); //Borrar de la lista la bala
- //Crear otro asteroide
- A.push_back(new AST(rand()%74+3,4));
- //Borramos el asteroide
- gotoxy((*itA)->X(), (*itA)->Y()); printf(" "); //Borramos el asteroide de la pantilla
- delete(*itA); //Borramos el asteroide de memoria
- itA=A.erase(itA); //Borramos el asteroide de la lista
- puntos+=5;
- }
- }
- }
- N.mover();
- N.morir();
- if (N.Vidas()<0){
- game_over = true;
- }
- Sleep(50);//se detiene 30 milisegundos
- }
- system("cls");
- printf("GAME OVER\n");
- getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement