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.
Código:
#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:
Código:
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