Sei sulla pagina 1di 9

//librerias #include <windows.h> #include <iostream.h> #include <stdlib.h> #include <math.h> #include <time.h> #include<conio.

h> #include <fstream> //

//constantes de valores en teclas #define ARR 72 #define ABJ 80 #define DER 77 #define IZQ 75 #define ENT 13 #define S 115 #define H 104 using namespace std; //declaracion de variables int score=0; int mine=10; int side=9; string name=""; int games=1; bool saved=false; int optionMenu=2; //tableros //tablero con el que se va a jugar int table[20][20]={}; //tablero donde estan ubicadas las minas int tableP[20][20]={}; //posicion de la celda en tablero int x=1; int y=1; bool win; bool loaded=false; // void firstPrint(); int menu(); int difficult(); bool save(); void help(); void play(); void toMine(); void print(int [20][20]); int checkMinMax(int num); int aroundMine(int a, int b);

bool isMine(int x, int y); void fill(int [20][20],int val); bool isWinner(); void loadFile(string fileName);

int main(int argc, char *argv[]) { while (optionMenu!=0){ //si menu es 0 es porque quiere salir system("cls"); firstPrint(); //lamada a procedimiento que imprime la presentacion de las minas cout<<"Ingrese su nombre: "; cin>>name; while (optionMenu==3 || optionMenu==2 || optionMenu==4){ //si el valor del menu es 2 o 3 o 4 es porque solicito ayuda o las diferentes opciones que requieren que se vuelva a imprimir el menu system("cls"); //borra la pantalla optionMenu=menu(); //llama a la funcion menu retornando un valor switch(optionMenu){ case 1:play();break; //llama al procedimiento play que es para jugar case 2:side=difficult();break; // llama a a funcion difficult case 3:loadFile("load");loaded=true;break; case 4:help();break; case 0:EXIT_SUCCESS; break; default:cout<<"ha digitado un numero incorrecto";optionMenu=4;break; } } } system("PAUSE"); return EXIT_SUCCESS; } //procedimiento que imprime la presentacion void firstPrint(){ cout<<"\t\t\tBUSCAMINAS\n\n\n"; system("color f0"); //cambia el color del fondo y letra f-> blanco en fondo y 0 es negro en letra ( por las posiciones ) cout<<" **\t\t\t"; cout<<" **\n"; cout<<" **\t\t\t"; cout<<" **\n"; cout<<" **\t\t\t"; cout<<" **\n"; cout<<" **\t\t\t"; cout<<" **\n"; cout<<" ******\t\t\t"; cout<<" ******\n"; cout<<" ************\t\t"; cout<<" ************\n"; cout<<" ****************\t\t"; cout<<" ****************\n"; cout<<" ********************\t\t"; cout<<" ********************\n"; cout<<"**********************\t\t"; cout<<"**********************\n"; cout<<"**********************\t\t"; cout<<"**********************\n"; cout<<"**********************\t\t"; cout<<"**********************\n"; cout<<"**********************\t\t"; cout<<"**********************\n"; cout<<"**********************\t\t"; cout<<"**********************\n"; cout<<" ********************\t\t"; cout<<" ********************\n"; cout<<" ****************\t\t"; cout<<" ****************\n"; cout<<" ************\t\t"; cout<<" ************\n"; cout<<" ******\t\t\t"; cout<<" ******\n"; cout<<"\n\n"; }

//funcion que imprime el menu int menu(){ int option; system("cls"); cout<<name<<", usted tiene las siguientes opciones para escoger.\n"; cout<<"Menu principal\n\n"; cout<<"[1] jugar\n"; cout<<"[2] escoger dificultad\n"; cout<<"[3] cargar partida\n"; cout<<"[4] ayuda\n"; cout<<"[0] Salir\n"; cout<<"ingrese la opcion: "; cin>>option; return option; } //procedimiento que imprime la ayuda al usuario void help(){ cout<<"\nEl Buscaminas es un juego aparentemente simple de memoria y razonamiento.\n"; cout<<"El objetivo del Buscaminas consiste en dar la vuelta a los cuadrados vacos y \n"; cout<<"evitar las minas ocultas. Al hacer clic en una mina, se acaba la partida.\n"; cout<<"A medida que usted vaya ganando las partidas se le aumentara en 10 pts su puntuacion.\n\n"; system("PAUSE"); } //funcion que permite que el usuario seleccione la dificultad int difficult(){ int intdif=0; cout<<"ingrese el grado de dificultad.\n"; cout<<"facil [1] - dificil [2] - experto [3]: "; cin>>intdif; if(intdif<=0 || intdif>=4){ cout<<"no ha digitado ningun numero correcto. se tomara como experto \n"; intdif=3; } if(intdif==1){side=9;mine=10;cout<<"ha escogido dificultad facil\n";} //tablero de 9x9 con 10 minas if(intdif==2){side=14;mine=40;cout<<"ha escogido dificultad dificil\n";} //tablero de 14x14 con 40 minas if(intdif==3){side=20;mine=99;cout<<"ha escogido dificultad experto\n";} //tablero de 20x20 con 99 minas cout<<"el tablero sera de "<<side<<" x " <<side<<"\n"; system("PAUSE"); return side; } //funcion que guarda en archivo txt los datos del juego bool save(){ /* Fichero nuevo para copiar, se abre despus de declararlo, llamando a open() */ ofstream f2; f2.open("partida.txt", ofstream::out); if (f2.bad()) {

return false; } else { f2 << name; //guarda el nombre del jugador f2 << endl; f2 << score; //puntaje f2 << endl; f2 << games; //juego actual f2 << endl; f2 << side; //lado del tablero f2 << endl; f2 << mine; //minas f2 << endl; f2 << 't'; //un separador cualquiera f2 << endl; for(int i = 1 ; i<=side ; i++){ for(int j=1 ; j<=side ; j++){ f2 << tableP[i][j] << " "; } //f2 << endl; } f2 << endl; f2 << 'y'; f2 << endl; for(int i = 1 ; i<=side ; i++){ for(int j=1 ; j<=side ; j++){ f2 << table[i][j]<<" "; } //f2 << endl; } return true; } } //procedimiento que cargar un archivo void loadFile(string fileName){ typedef char TCadena[30]; fileName = fileName+".txt"; ifstream fichin; int i; char cad[400]; int num=0; char cod='n'; //cout << fileName << endl; //siempre va a cargar partida.txt fichin.open("partida.txt", ifstream::in); if (fichin.bad()) { cout << "Incapaz de crear o abrir el fichero " << endl; } else { fichin >> cad; // Observese la lectura adelantada!!! cout << cad << endl;

name=cad; while (!fichin.eof()) { fichin >> i; //cout << i << endl; // Lectura de valores en el fichero score=i; fichin >> i; //cout << i << endl; // Lectura de valores en el fichero games=i; fichin >> i; //cout << i << endl; // Lectura de valores en el fichero side=i; fichin >> i; //cout << i << endl; // Lectura de valores en el fichero mine=i; fichin >> cod; //cout << cod << endl; // Lectura de valores en el fichero //system("pause"); for(int i=1 ; i<=side ; i++){ for(int j=1 ; j<=side ; j++) { fichin >> num; //cout << num << endl; // Lectura de valores en el fichero tableP[i][j]=num; } //system("pause"); } //system("pause"); fichin >> cod; //cout << cod << endl; // Lectura de valores en el fichero //system("pause"); for(int i=1 ; i<=side ; i++){ for(int j=1 ; j<=side ; j++) { fichin >> num; //cout << num << endl; // Lectura de valores en el fichero table[i][j]=num; } //system("pause"); } break; //games=num; //fichin >> cad; //cout << cad << endl; // Lectura de valores en el fichero //score=num; //system("pause"); } fichin.close(); } system("pause"); }

void play(){ while(games<=10){ // para jugar 10 partidas

if(loaded==false){ // si no se carg una partida anterior fill(table,9); fill(tableP,9); toMine(); } bool flag = true; //si completa el cuadro la bandera queda en false int row, col; int opcion; while(flag)//mientras la bandera este verdadera se puede jugar { while(opcion!=ENT){ //mientras la tecla oprimida sea diferente a enter system("cls"); //borra la pantalla cout<<"\njugador: " << name << " puntaje: " << score << " juego: " << games <<endl; cout<<endl; print(tableP); //imprime el tablero cout<<"\n\n"; //print(table); //imprime el tablero de las minas cout<<"\n\n"; cout << "\noprima las flechas para ubicar la celda a donde va a escribir,\nluego presione enter.\n"; cout << "en cualquier momento oprima S para guardar o H para ayuda" << endl; cout << "\nusted esta ubicado en la celda ("<<x<<","<<y<<")"; cout << ""; opcion = getch(); //captura el valor de la tecla oprimida switch (opcion) { case ARR: //cout << "Presionaste arriba..."; x--; x=checkMinMax(x); break; case ABJ: //cout << "Presionaste abajo..."; x++; x=checkMinMax(x); break; case DER: //cout << "Presionaste derecha..."; y++; y=checkMinMax(y); break; case IZQ: //cout << "Presionaste izquierda..."; y--; y=checkMinMax(y); break; case ENT: cout << "\n"; break; case H: cout<< "\n\nsolucion al buscaminas" << endl ; print(table); system("pause");

break; case S: if(save()){ cout << "\nguardado correctamente" << endl; } else{ cout << "\nno se pudo guardar" << endl; } system("pause"); break; default: cout << "Tecla no reconocida..."; break; } } //al oprimirse enter continua ac flag=isMine(x,y); if(flag){ win=isWinner(); if(win==true){ flag=false; } else{ opcion=DER; } } //bandera=termina(tablero); //verifica si ha ganado } //gana(); if(win==false){ cout<<"\nha perdido, ha pisado una mina"<<endl<<endl; games=1; } else{ cout << "ha ganado " << endl; score += 10; games++; loaded=false; } system("pause"); optionMenu=2; break; } } void fill(int matriz[20][20],int val){ //ciclo para rellenar la matriz de un valor "val" for(int i=1; i<=side; i++){ for(int j=1; j<=side; j++){ matriz[i][j]=val; } } }

//procedimiento que llena de minas el tablero void toMine(){ int i; fill(table,9); //generacion de semilla srand(time(NULL)); int x=1,y=1; for(i=1; i<=mine; i++){ do{ x=(rand()%side)+1; //numero aleatorio para x y=(rand()%side)+1; //numero aleatorio para y }while(table[x][y]!=9); table[x][y]=1; //se coloca una mina identificandola como 1 } } //imprime el tablero void print(int matriz[20][20]){ for(int i = 1 ; i<=side ; i++){ for(int j=1 ; j<=side ; j++){ cout<<"|"; if(matriz[i][j]==9){ //si el valor de la casilla es 0 no la imprime cout<<" "; } else{ cout<<" "<<matriz[i][j]; } } cout<<"|"; cout<<"\n"; } } //funcion que verifica que no se salga la celda del tablero int checkMinMax(int num){ if(num>side){ // si el numero a verificar es mayor al tamao del tablero retorna el tamao return side; } else if(num<1){ // si el numero a verificar es menor al tamao del tablero retorna 1 return 1; } else{ return num; //si esta entre el los valores permitidos, retorna ese valor } } //funcion que determina si piso mina bool isMine(int a, int b){ if(table[a][b]==1){ //si es mina retorna falso a la bandera que permite jugar return false; }

else{ //si no pisa mina for(int i=0; i<3;i++){ for(int j=0 ; j<3 ; j++){ if(table[a+i-1][b+j-1]!=1) tableP[a+i-1][b+j-1]=aroundMine(a+i-1,b+j-1); //verifique las minas alrededor } } return true; } } int aroundMine(int a, int b){ int cont=0; for(int i=0; i<3 ; i++){ for(int j=0 ; j<3 ; j++){ if((a-1+i>0 && b-1+i>0)&&(a+i+1<=side && b+i+1<=side)){ //si no se sale del tablero if(table[a+i-1][b+j-1]==1){ //si hay mina sume en uno el contador de minas cont++; } } } } return cont; } //procedimiento que verifica si gan o no bool isWinner(){ int count; count=0; //cuenta los 9 que hay en el tablero "table" eso indica si faltan oprimir celdas for(int i=1 ; i<=side ; i++){ for(int j=1 ; j<=side ; j++){ if(tableP[i][j]==9){ count++; } } } //cuando la cuenta es igual a minas es porque destapo todos y gana if(count==mine){ //cout<< "ha ganado" << endl; return true; } return false; }

Potrebbero piacerti anche