Título: Juego del buscaminas C++, error!!!!
Publicado por: mrwylli en 20 Marzo 2005, 05:48 am
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
Título: Re: Juego del buscaminas C++, error!!!!
Publicado por: victeter en 26 Abril 2005, 15:36 pm
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 cmp.s 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
|