[ create a new paste ] login | about

Link: http://codepad.org/yNUTWY4K    [ raw code | fork ]

C++, pasted on Feb 28:
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<stdlib.h>
#include<list>
#include <ctime>
using namespace std;

#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80


void gotoxy(int x, int y){
    HANDLE hCon;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD dwPos;
    dwPos.X = x;
    dwPos.Y = y;

    SetConsoleCursorPosition(hCon, dwPos); 
         
}

void OcultarCursor(){
    HANDLE hCon;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cci;
    cci.dwSize = 2;
    cci.bVisible = FALSE;
    
    SetConsoleCursorInfo(hCon,&cci);
    
}

void pintar_limites(){
     for(int i = 2 ; i<78 ; i++){
           gotoxy(i,3); printf("%c",205);
           gotoxy(i,33);printf("%c",205);
     }
     for(int i = 4 ; i<33 ; i++){
           gotoxy(2,i); printf("%c",186);
           gotoxy(77,i);printf("%c",186);
     }
     
     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{
    int x,y;
    int corazones;
    int vidas;
public:
    NAVE(int _x, int _y, int _corazones, int _vidas): x(_x),y(_y),corazones(_corazones), vidas(_vidas){}
    int X(){ return x;}
    int Y(){ return y;}
    void COR() { corazones--; }
    void pintar();
    void borrar();
    void mover(char);
    void pintar_corazones();
    void morir();
};

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("     "); 
     gotoxy(x,y+1);printf("     "); 
     gotoxy(x,y+2);printf("     "); 
     
}

void NAVE::mover(char key){
    if(key){
        borrar();
        if(key == 'a' && x > 3) x--;
        if(key == 'd' && x+5 < 77) x++;
        if(key == 'w' && y > 4) y--;
        if(key == 's' && y+3 < 33) y++;
        if(key == 'e')corazones--;
        pintar();
        pintar_corazones();
    }
}

void NAVE::pintar_corazones(){
     
    gotoxy(50,2); printf("Vidas %d",vidas);
    gotoxy(64,2); printf("Salud");
    gotoxy(70,2); printf("     ");
    for(int i = 0 ; i < corazones; i++){
          gotoxy(70+i,2); printf("%c",3);
    }
}

void NAVE::morir(){
    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;
public:
    AST(int _x, int _y):x(_x),y(_y){}
    void pintar();
    void mover();
    void choque(NAVE &N);
};

void AST::pintar(){
    gotoxy(x,y); printf("%c",184);     
}

void AST::mover(){
    gotoxy(x,y); printf(" ");
    y++;
    if(y > 32){
        x = rand()%71 + 4;
        y = 4;     
    }
    pintar();
}

void AST::choque(NAVE &N){
    if( x >= N.X() && x < N.X()+5 && y >= N.Y() && y <= N.Y()+2){
         N.COR();
         N.borrar();
         N.pintar();
         N.pintar_corazones();
         x = rand()%71 + 4;
         y = 4; 
    }     
}

class BALA{
    int x,y;
public:
    BALA(int _x, int _y):x(_x),y(_y){}
    int X() { return x;}
    int Y() { return y;}
    void mover(); 
    bool fuera();   
};

void BALA::mover(){
    gotoxy(x,y); printf(" ");  
    y--; 
    gotoxy(x,y); printf(".");       
}

bool BALA::fuera(){
    if(y == 4) return true;
    return false;     
}

int main(){
    srand( time(NULL) );
    OcultarCursor();
    pintar_limites();
    NAVE N(37,30,3,3);
    N.pintar();
    N.pintar_corazones();
    
    list<AST*> A;
    list<AST*>::iterator itA;
    for(int i=0; i<5; i++){
         A.push_back(new AST( 4 + rand()%75, 4 + rand()%75) ); 
    }
    
    list<BALA*> B;
    list<BALA*>::iterator it;
    
    bool game_over = false;
    while(!game_over){
            
            /*
            Mira el cambio que he hecho aquí:
             - en vez de llamar a getch() aquí y luego dentro de NAVE::mover(), lo hago una vez
               eso es porque getch() procesa la tecla actual y limpia el buffer; en otras palabras, una vez
               que llamas a getch(), C++ ya piensa que no hay ninguna tecla pulsada, y la próxima vez que llames
               a getch() dentro de NAVE::mover, va a creer que no hay tecla pulsada y no funcionará.
               Así que simplemente guardo el valor y lo uso aquí una vez, y abajo, lo paso a NAVE::mover(key)
               como primer y único parámetro / argumento
            */
            char key = 0;
            
            if (kbhit())
                key = getch();
            
            if(key == 'b')  
                B.push_back(new BALA(N.X()+2, N.Y()-1));
            
            for(it = B.begin(); it != B.end(); it++){
                (*it)->mover();  
                if((*it)->fuera()){
                    gotoxy((*it)->X(),(*it)->Y()); printf(" ");
                    delete(*it);
                    it = B.erase(it);      
                }     
            }
            
            for(itA = A.begin(); itA != A.end(); itA++){
                 (*itA)->mover(); 
                 (*itA)->choque(N);    
            }
            
            N.morir();
            N.mover(key);
            Sleep(30);
            
    }
    system("pause"); 
    return 0;
}


Create a new paste based on this one


Comments: