Juego del buscaminas C++, error!!!!

Iniciado por mrwylli, 20 Marzo 2005, 05:48 AM

0 Miembros y 1 Visitante están viendo este tema.

mrwylli

Tengo el codigo fuente de un supuesto buscaminas, pero despues de darle miles de vueltas no consigo arreglar el fallo que me devuelve, a ver si alguien con práctica consigue que compile.

Perdonadme que el codigo sea tan largo pero es que llevo varios dias dandole vueltas y no tengo ni idea de por donde meterle mano.

Muchisimas gracias.






#include <iostream.h>     
#include <stdlib.h>   
#include <iomanip.h>   
#include <ctime>   





const int FILAS=10;
const int COLUMNAS=10;
const int PORC_MINIMO=20;
const int PORC_MAXIMO=30;
const int MIN_MINAS=PORC_MINIMO*(FILAS*COLUMNAS)/100;
const int MAX_MINAS=PORC_MAXIMO*(FILAS*COLUMNAS)/100;



enum Estado{DESCUBIERTA,INTERROGACION,MINA,CUBIERTA,POR_EXPANDIR};

struct Celda{
    char valor;
    Estado est;
};

typedef Celda Suelo[FILAS] [COLUMNAS];

struct Campo{
    Suelo s;
    int nminas;
    int ncubiertas;
};

int aleatorio(int max){
    return int(double(rand())*max/(RAND_MAX+1.0));
}

//definimos las funciones y procedimientos que utilizaremos

void vaciar(Campo &cmp){
    cmp.nminas=0;
    cmp.ncubiertas=FILAS*COLUMNAS;
    for (int i=0;i<FILAS;i++){
        for (int k=0;k<COLUMNAS;k++){
                cmp.s[i][k].valor=' ';
                cmp.s[i][k].est=CUBIERTA;
        }
    }
}

void generar_aleatorio(Campo &cmp,int nelm){
    int x,y;
    while (nelm>0){
        x=aleatorio(FILAS);
        y=aleatorio(COLUMNAS);
        if (cmp.s[x][y].valor!='M'){
            cmp.s[x][y].valor='M';
            nelm--;
        }
    }
    cmp.nminas=nelm;
}

bool CasillaCorrecta(int f,int c){
    return (f>=0)&&(f<FILAS)&&(c>=0)&&(c<COLUMNAS);
}

int contar_vecinos(const Campo &cmp,int f,int c){
    int cont=0,i,k;
    for(i=f-1;i<=f+1;i++){
        for(k=c-1;k<=c+1;k++){
                if (CasillaCorrecta(i,k)&&(cmp.s[i][k].valor=='M'))
{
                    cont++;
               }
        }           
    }
    return cont;
}

void generar_vecinos(Campo &cmp){
    int i,k,cont;
    for(i=0;i<FILAS;i++){
        for(k=0;k<COLUMNAS;k++){
                if(cmp.s[i][k].valor==' '){
                   cont=contar_vecinos(cmp,i,k);
                   if(cont>0){
                      cmp.s[i][k].valor=cont+'0';
                   }
                }
        }
    }
}

void dibujar(const Campo cmp){
    int i,k;
    cout<<endl<<"Cubiertas: "<<cmp.ncubiertas<<endl;
    cout<<endl<<" ";
    for (i=0;i=COLUMNAS;i++){
        cout<<i%10;
    }
    cout<<endl<<" ";
    for(i=0;i<COLUMNAS;i++){
        cout<<"-";
    }
    cout<<endl;
    for(i=0;i<FILAS;i++){
        cout<<i%10<<"|";
        for(k=0;k<COLUMNAS;k++){
                switch (cmp.s[i][k].est){
                                case DESCUBIERTA:cout<<cmp.s[i][k].valor;break;
                                case INTERROGACION:cout<<"?";break;
                                case MINA:cout<<"M";break;
                                default:cout<<".";
                }
        }
        cout<<endl;
    }
}
void dibujar_solucion(const Campo cmp){
    int i,k;
    cout<<endl<<" ";
    for(i=0;i<COLUMNAS;i++){
        cout<<i%10;
    }
    cout<<endl<<" ";
    for(i=0;i<COLUMNAS;i++){
        cout<<"-";
    }
    cout<<endl;
    for(i=0;i<FILAS;i++){
        cout<<i%10<<"|";
        for(k=0;k<COLUMNAS;k++){
                cout<<cmp.s[i][k].valor;
        }
        cout<<endl;
    }
}

void expandir_a_vecinos(Campo &cmp,int f,int c,bool &hay_expansion){
    int i,k;
    hay_expansion=false;
    for(i=f-1;i<=f+1;i++){
        for(k=c-1;k<=c+1;k++){
                if (CasillaCorrecta(i,k)&&cmp.s[i][k].est!=DESCUBIERTA){
                                hay_expansion=true;
                                if (cmp.s[i][k].valor==' '){
                                    cmp.s[i][k].est=POR_EXPANDIR;
                                }else{
                                    cmp.s[i][k].est=DESCUBIERTA;
                                    cmp.ncubiertas--;
                                }
                }
        }
    }
}

void descubrir_vecinos_sin_minas (Campo &cmp,int ff,int cc){
    int i,k;
    bool hay_expansion,exp;
    expandir_a_vecinos (cmp,ff,cc,hay_expansion);
    while (hay_expansion){
        hay_expansion=false;
        for (i=0;i<FILAS,i++){
                for (k=0;k<COLUMNAS,k++){
                                if(cmp.s[i][k].est==POR_EXPANDIR){
                                   cmp.s[i][k].est=DESCUBIERTA;
                                   cmp.ncubiertas--;
                                   expandir_a_vecinos(cmp,i,k,exp);
                                   hay_expansion=hay_expansion||exp;
                                }
                }
        }
    }
}

void descubrir(Campo &cmp,int f,int c,bool &explosion){
    cmp.s[f][c].est=DESCUBIERTA;
    cmp.ncubiertas--;
    if (cmp.s[f][c].valor=='M'){
        explosion=true;
    }else if(cmp.s[f][c].valor==' '){
        descubrir_vecinos_sin_minas(cmp,f,c);
        explosion=false;
    }else{
        explosion=false;
    }
}

void marcar(Campo &cmp,int f,int c,const Estado e){
    cmp.s[f][c].est=e;
}

void leer_operacion(char &cod,int &f,int &c){
    do{
        cout<<endl<<"Introduce codigo[d,m,?,s]: ";
        cin>>cod;
    }while((cod!='d')&&(cod!='m')&&(cod!='?')&&(cod!='s'));
   
    if(cod!='s'){
        do{
                cout<<"Introduce fila: ";
                cin>>f;
        }while((f<0)||(f>=FILAS));
        do{
                cout<<"Introduce columna: ";
                cin>>c;
        }while((c<0)||(c>=COLUMNAS));
    }
}

void jugar(){
    Campo cmp;
    char op,nivel;
    int f,c,minas=3;
    bool explosion=false,ganar=false,salir=false;
   
    do{
        cout<<endl<<"Introduce nivel juego[f=facil,d=dificil,m=leer minas]; ";
                cin>>nivel;
        }while ((nivel!='f')&&(nivel!='d')&&(nivel!='m'));
        switch (nivel){
                case 'f':minas=MIN_MINAS;break;
                case 'd':minas=MAX_MINAS;break;
                case 'm':cout<<"Introduce minas: ";
                         cin>>minas;
        }
        vaciar(cmp);
        generar_aleatorio(cmp,minas);
        generar_vecinos(cmp);
        do{
                dibujar(cmp);
                leer_operacion(op,f,c);
                switch (op){
                                case 'd':descubrir(cmp,f,c,explosion);break;
                                case 'm':marcar(cmp,f,c,MINA);break;
                                case '?':marcar(cmp,f,c,INTERROGACION);break;
                                case 's':salir=true;
                }
                if (cmp.ncubiertas==minas){
                                ganar=true;
                }
        }while ((!explosion)&&(!ganar)&&(!salir));
        if (explosion){
            cout<<endl<<"BOOOOMM!!!! HAS PERDIDO"<<endl;
        }else if(ganar){
                cout<<endl<<"BIEN HAS GANADO"<<endl;
        }else{
                cout<<endl<<"TE HAS RENDIDO"<<endl;
        }
        dibujar_solucion(cmp);
    }

   


int main (){


    srand(time(0));
    cout<<endl<<"Juego: BUSCAMINAS"<<endl<<endl;
    jugar();
    system("PAUSE");
    return 0;
}






Y el resultado del compilador (utilizo Dev-C++) es:






Compilador: Default compiler
Building Makefile: "C:\Dev-Cpp\Buscaminas\Makefile.win"
Ejecutando  make...
make.exe -f "C:\Dev-Cpp\Buscaminas\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/include/c++"  -I"C:/Dev-Cpp/include/c++/mingw32"  -I"C:/Dev-Cpp/include/c++/backward"  -I"C:/Dev-Cpp/include" 

In file included from C:/Dev-Cpp/include/c++/backward/iostream.h:31,
                 from main.cpp:11:
C:/Dev-Cpp/include/c++/backward/backward_warning.h:32:2: warning: #warning This file includes at least one
deprecated or antiquated header. Please consider using one of
the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting
the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>.
To disable this warning use -Wno-deprecated.

main.cpp: In function `void descubrir_vecinos_sin_minas(Campo&, int, int)':
main.cpp:174: parse error before `)' token

main.cpp: At global scope:
main.cpp:185: parse error before `}' token

make.exe: *** [main.o] Error 1

Ejecución Terminada
AMD xp-m 2500@2370 (225*10.5,core1.65)
[MSI  9800pro@XT]  ---  Jetram ddr400
ABIT AN7  ---   TT 480W twv
Gigabyte 3D Rocket Cooler
Antec Lanboy

victeter



hola:
yo he compilado el programa y me daba dos errores, faltaban ; en dos comandos for. ahora el programa se queda asi

#include <iostream.h>     
#include <stdlib.h>   
#include <iomanip.h>   
#include <ctime>   





const int FILAS=10;
const int COLUMNAS=10;
const int PORC_MINIMO=20;
const int PORC_MAXIMO=30;
const int MIN_MINAS=PORC_MINIMO*(FILAS*COLUMNAS)/100;
const int MAX_MINAS=PORC_MAXIMO*(FILAS*COLUMNAS)/100;



enum Estado{DESCUBIERTA,INTERROGACION,MINA,CUBIERTA,POR_EXPANDIR};

struct Celda{
    char valor;
    Estado est;
};

typedef Celda Suelo[FILAS] [COLUMNAS];

struct Campo{
    Suelo s;
    int nminas;
    int ncubiertas;
};

int aleatorio(int max){
    return int(double(rand())*max/(RAND_MAX+1.0));
}

//definimos las funciones y procedimientos que utilizaremos

void vaciar(Campo &cmp){
    cmp.nminas=0;
    cmp.ncubiertas=FILAS*COLUMNAS;
    for (int i=0;i<FILAS;i++){
        for (int k=0;k<COLUMNAS;k++){
                cmp.s[k].valor=' ';
                cmp.s[k].est=CUBIERTA;
        }
    }
}

void generar_aleatorio(Campo &cmp,int nelm){
    int x,y;
    while (nelm>0){
        x=aleatorio(FILAS);
        y=aleatorio(COLUMNAS);
        if (cmp.s
  • [y].valor!='M'){
                cmp.s
  • [y].valor='M';
                nelm--;
            }
        }
        cmp.nminas=nelm;
    }

    bool CasillaCorrecta(int f,int c){
        return (f>=0)&&(f<FILAS)&&(c>=0)&&(c<COLUMNAS);
    }

    int contar_vecinos(const Campo &cmp,int f,int c){
        int cont=0,i,k;
        for(i=f-1;i<=f+1;i++){
            for(k=c-1;k<=c+1;k++){
                    if (CasillaCorrecta(i,k)&&(cmp.s[k].valor=='M'))
    {
                        cont++;
                   }
            }           
        }
        return cont;
    }

    void generar_vecinos(Campo &cmp){
        int i,k,cont;
        for(i=0;i<FILAS;i++){
            for(k=0;k<COLUMNAS;k++){
                    if(cmp.s[k].valor==' '){
                       cont=contar_vecinos(cmp,i,k);
                       if(cont>0){
                          cmp.s[k].valor=cont+'0';
                       }
                    }
            }
        }
    }

    void dibujar(const Campo cmp){
        int i,k;
        cout<<endl<<"Cubiertas: "<<cmp.ncubiertas<<endl;
        cout<<endl<<" ";
        for (i=0;i=COLUMNAS;i++){
            cout<<i%10;
        }
        cout<<endl<<" ";
        for(i=0;i<COLUMNAS;i++){
            cout<<"-";
        }
        cout<<endl;
        for(i=0;i<FILAS;i++){
            cout<<i%10<<"|";
            for(k=0;k<COLUMNAS;k++){
                    switch (cmp.s[k].est){
                                    case DESCUBIERTA:cout<<cmp.s[k].valor;break;
                                    case INTERROGACION:cout<<"?";break;
                                    case MINA:cout<<"M";break;
                                    default:cout<<".";
                    }
            }
            cout<<endl;
        }
    }
    void dibujar_solucion(const Campo cmp){
        int i,k;
        cout<<endl<<" ";
        for(i=0;i<COLUMNAS;i++){
            cout<<i%10;
        }
        cout<<endl<<" ";
        for(i=0;i<COLUMNAS;i++){
            cout<<"-";
        }
        cout<<endl;
        for(i=0;i<FILAS;i++){
            cout<<i%10<<"|";
            for(k=0;k<COLUMNAS;k++){
                    cout<<cmp.s[k].valor;
            }
            cout<<endl;
        }
    }

    void expandir_a_vecinos(Campo &cmp,int f,int c,bool &hay_expansion){
        int i,k;
        hay_expansion=false;
        for(i=f-1;i<=f+1;i++){
            for(k=c-1;k<=c+1;k++){
                    if (CasillaCorrecta(i,k)&&cmp.s[k].est!=DESCUBIERTA){
                                    hay_expansion=true;
                                    if (cmp.s[k].valor==' '){
                                        cmp.s[k].est=POR_EXPANDIR;
                                    }else{
                                        cmp.s[k].est=DESCUBIERTA;
                                        cmp.ncubiertas--;
                                    }
                    }
            }
        }
    }

    void descubrir_vecinos_sin_minas (Campo &cmp,int ff,int cc){
        int i,k;
        bool hay_expansion,exp;
        expandir_a_vecinos (cmp,ff,cc,hay_expansion);
        while (hay_expansion){
            hay_expansion=false;
            for (i=0;i<FILAS;i++){
                    for (k=0;k<COLUMNAS;k++){
                                    if(cmp.s[k].est==POR_EXPANDIR){
                                       cmp.s[k].est=DESCUBIERTA;
                                       cmp.ncubiertas--;
                                       expandir_a_vecinos(cmp,i,k,exp);
                                       hay_expansion=hay_expansion||exp;
                                    }
                    }
            }
        }
    }

    void descubrir(Campo &cmp,int f,int c,bool &explosion){
        cmp.s[f][c].est=DESCUBIERTA;
        cmp.ncubiertas--;
        if (cmp.s[f][c].valor=='M'){
            explosion=true;
        }else if(cmp.s[f][c].valor==' '){
            descubrir_vecinos_sin_minas(cmp,f,c);
            explosion=false;
        }else{
            explosion=false;
        }
    }

    void marcar(Campo &cmp,int f,int c,const Estado e){
        cmp.s[f][c].est=e;
    }

    void leer_operacion(char &cod,int &f,int &c){
        do{
            cout<<endl<<"Introduce codigo[d,m,?,s]: ";
            cin>>cod;
        }while((cod!='d')&&(cod!='m')&&(cod!='?')&&(cod!='s'));
       
        if(cod!='s'){
            do{
                    cout<<"Introduce fila: ";
                    cin>>f;
            }while((f<0)||(f>=FILAS));
            do{
                    cout<<"Introduce columna: ";
                    cin>>c;
            }while((c<0)||(c>=COLUMNAS));
        }
    }

    void jugar(){
        Campo cmp;
        char op,nivel;
        int f,c,minas=3;
        bool explosion=false,ganar=false,salir=false;
       
        do{
            cout<<endl<<"Introduce nivel juego[f=facil,d=dificil,m=leer minas]; ";
                    cin>>nivel;
            }while ((nivel!='f')&&(nivel!='d')&&(nivel!='m'));
            switch (nivel){
                    case 'f':minas=MIN_MINAS;break;
                    case 'd':minas=MAX_MINAS;break;
                    case 'm':cout<<"Introduce minas: ";
                             cin>>minas;
            }
            vaciar(cmp);
            generar_aleatorio(cmp,minas);
            generar_vecinos(cmp);
            do{
                    dibujar(cmp);
                    leer_operacion(op,f,c);
                    switch (op){
                                    case 'd':descubrir(cmp,f,c,explosion);break;
                                    case 'm':marcar(cmp,f,c,MINA);break;
                                    case '?':marcar(cmp,f,c,INTERROGACION);break;
                                    case 's':salir=true;
                    }
                    if (cmp.ncubiertas==minas){
                                    ganar=true;
                    }
            }while ((!explosion)&&(!ganar)&&(!salir));
            if (explosion){
                cout<<endl<<"BOOOOMM!!!! HAS PERDIDO"<<endl;
            }else if(ganar){
                    cout<<endl<<"BIEN HAS GANADO"<<endl;
            }else{
                    cout<<endl<<"TE HAS RENDIDO"<<endl;
            }
            dibujar_solucion(cmp);
        }

       


    int main (){


        srand(time(0));
        cout<<endl<<"Juego: BUSCAMINAS"<<endl<<endl;
        jugar();
        system("PAUSE");
        return 0;
    }

    espero que te funcione
    victeter