Saludos, hace mucho tiempo que no paso por aquí, de vez en cuando entro a los foros y leo para aprender y para actualizarme. Como regalo de mi visita, compartiré con ustedes un sofisticado buscaminas que hice en C hace un tiempo, pero como ya no programo en C decidí compartirselo a ustedes. Nunca lo terminé del todo, me dio flojera :/ lo que no he terminado es el cronometro y algunas mejoras como inicializar todas las casillas cuando el juego termina.
Para los que no sepan mucho de programación o esten aprendiendo en C, solo diré que el juego esta hecho con dos matrices, una en la que le muestre al usuario y otra interna llamada vectormuerte, es allí donde ocurren los cambios. El código esta bien estructurado y es bastante básico.
El usuario puede elegir 3 niveles cada nivel tendrá minas diferentes y además de eso el usuario puede bloquear o desbloquear casillas, saber cuando hay una mina cerca, es decir la típica jugabilidad es la misma. Se juega por consola. Diviértanse.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <conio.h>
#include <windows.h>
//PROTOTIPO DE FUNCIONES
//FUNCIÓN PARA DARLE LA BIENVENIDA AL USUARIO Y MOSTRARLE LAS REGLAS DEL JUEGO
void Bienvenida()
{
char rsp;
printf("\n Bienvenidos al buscaMinas Bou-Cecere V2.0\n");
printf("\n Sabe usted como jugar BuscaMinas ? Si(Presione cualquier tecla), No(n)\n");
scanf(" %c", &rsp);
if (rsp == 'n'|| rsp == 'N')
{
system("cls");
printf("\n Buscaminas es un juego basado en un tablero, en este caso de 8 filas\n");
printf("\n y 8 columnas. El juego, dependiendo del nivel que usted seleccione, \n");
printf("\n arrojara un numero de minas al tablero. Jugada tras jugada, debera \n");
printf("\n ingresar una coordenada con dos posibilidades: abrir la casilla escogida\n");
printf("\n o colocar una bandera 'B', indicando que cree que ahi se encuentra una mina.\n");
printf("\n Al seleccionar una casilla si se encuentra una mina aparecera una 'X', de\n");
printf("\n de lo contrario aparecera un numero, que indicara el numero de minas que\n");
printf("\n se encuentran en el perimetro; asi: si aparece el numero 1, significa que\n");
printf("\n hay una mina en el perimetro de esa casilla.\n");
printf("\n El objetivo del buscaminas es lograr descubrir las casillas minadas, \n");
printf("\n pero sin activarlas, es decir, localizarlas por descarte, prestando \n");
printf("\n atencion a los cuadros numericos que ayudan a revelar la ubicacion de las \n");
printf("\n minas\n");
printf("\n \n");
printf("\n EL jugador podra marcar las minas para bloquearlas y acumular puntos\n");
printf("\n Si el jugador marca una casilla sin minas, entonces se le sumara un punto\n");
printf("\n La partida habra terminado cuando el jugador active una mina\n");
printf("\n Gana el jugador que obtenga mas puntos siempre y cuando el puntaje sea positivo\n");
system("pause");
}
else if (rsp == 'S'|| rsp == 's')
{
printf("\n Listo para jugar, solo \n");
system("pause");
}
}
//FUNCIÓN PARA ELEGIR EL NIVEL DE DIFICULTAD
void Eleccion(char *nivel){
system("cls");
printf("\n Ingrese el nivel de dificultad en el cual desea jugar:\n");
printf("\n Facil<1>, Intermedio <2>, Dificil <3>\n");
printf("\n Facil: para jugar con 3 minas en tablero.\n");
printf("\n Intermedio: para jugar con 6 minas en tablero.\n");
printf("\n Dificil: para jugar con 10 minas en tablero.\n");
do{ // INICIO VALIDACION
scanf(" %c", &*nivel);
system("cls");
if(*nivel!='1' && *nivel!='2' && *nivel!='3'){
printf("\n El nivel ingresado es incorrecto por favor ingrese un dato valido\n\n");
}
}while( *nivel!='1' && *nivel!='2' && *nivel!='3' ); // FINAL VALIDACION
}
void Inicializar(char vectormina[][8], char vectormuerte[][8])
{
for(int i=0; i<8; i++)// For para la matriz base
{
for(int j=0; j<8; j++)
{
vectormina[i][j]='$';
vectormuerte[i][j]=0;
}
}
}
void Random(char vectormuerte[][8], char *nivel, int i, int j){
//CONDICIONES PARA LA VARIABLE NIVEL
if (*nivel == '1')
{
printf("\n Ha seleccionado el Nivel Facil\n");
system("pause");
srand(time(NULL)); //SEMILLA DEL RANDOM 1
for(int k =1; k <=3; k++)
{
if(vectormuerte[i][j] != 'X'){
i = (rand() % 8);
j = (rand() % 8);
}
else if(vectormuerte[i][j] == 'X')
{
i = (rand() % 7)+1;
j = (rand() % 7)+1;
}
vectormuerte[i][j] = 'X';
}
}
else if (*nivel == '2')
{
printf("\n Ha seleccionado el nivel Intermedio\n");
system("pause");
srand(time(NULL)); //SEMILLA DEL RANDOM 2
for(int k =1; k <=6; k++)
{
if(vectormuerte[i][j] != 'X'){
i = (rand() % 8);
j = (rand() % 8);
}
else if(vectormuerte[i][j] == 'X')
{
i = (rand() % 7)+1;
j = (rand() % 7)+1;
}
vectormuerte[i][j] = 'X';
}
}
else if (*nivel == '3')
{
printf("\n Ha seleccionado el nivel Dificil\n");
system("pause");
srand(time(NULL)); //SEMILLA DEL RANDOM 3
for(int k =1; k <=10; k++)
{
if(vectormuerte[i][j] != 'X'){
i = (rand() % 8);
j = (rand() % 8);
}
else if(vectormuerte[i][j] == 'X')
{
i = (rand() % 7)+1;
j = (rand() % 7)+1;
}
vectormuerte[i][j] = 'X';
}
}
} // FIN DEL VOID RANDOM
void Mostrar(char vectormina[][8])
{
//system("cls");
printf("\n\n");
printf(" ");
for(int i = 1; i <= 8; i++){
printf("( %i )", i);
}
printf("\n");
for(int i = 1; i <= 8; i++){
printf("\n ( %i )", i);
for(int j = 1; j <= 8; j++){
printf("[ %c ]", vectormina[i-1][j-1]);
}
printf("\n");
}
}
void Pregunta(char *condicion)
{
printf("\n Si desea desbloquear una casilla marque la letra 'c'\n");
printf("\n Si desea marcar una casilla marque la letra 'b'\n");
do
{
scanf(" %c", &*condicion);
if( *condicion!='c' && *condicion!='C' && *condicion!='b' && *condicion!='B')
{
printf("\n Opcion equivocada, seleccione una opcion valida ('c') o ('b')\n ");
}
}while( *condicion!='c' && *condicion!='C' && *condicion!='b' && *condicion!='B');
}
void Bandera(char vectormuerte[][8], char vectormina[][8], int *clicki, int *clickj, int *acum)
{
do
{
printf("\n Ingrese la coordenana que desea marcar (en forma de fila y columna)\n");
scanf("%i", &*clicki);
scanf("%i", &*clickj);
if(vectormina[*clicki-1][*clickj-1]!='$'){
system("cls");
printf("\n La coordenada seleccionada ya fue utilizada\n");
Mostrar(vectormina);
}
}while (vectormina[*clicki-1][*clickj-1]!='$');
vectormina[*clicki-1][*clickj-1] = 0;
vectormina[*clicki-1][*clickj-1] = 'B';
//CONDICION PARA SUMAR O RESTAR PUNTOS
if (vectormuerte[*clicki-1][*clickj-1] == 'X')
{
*acum = *acum + 5;
}
else if (vectormuerte[*clicki-1][*clickj-1] != 'X')
{
*acum = *acum -2;
}
}
void Coordenada(char vectormina[][8], char vectormuerte[][8], int *clicki, int *clickj, int posicion, int *acum)
{
do
{
printf("\n Ingrese la coordenada que desea desbloquear (en forma de fila y columna)\n");
scanf("%i", &*clicki);
scanf("%i", &*clickj);
if(vectormina[*clicki-1][*clickj-1]!='$' && vectormina[*clicki-1][*clickj-1]!='B'){
system("cls");
printf("\n La coordenada seleccionada ya fue utilizada\n\n");
Mostrar(vectormina);
}
}while (vectormina[*clicki-1][*clickj-1]!='$' && vectormina[*clicki-1][*clickj-1]!='B');
if (vectormina[*clicki-1][*clickj-1]!='$')
{
*acum++;
}
if (vectormuerte[*clicki-1][*clickj-1] != 'X')
{
*acum++;
if ((*clicki-1)!=0 && (*clicki-1)!=7 && (*clickj-1)!=0 && (*clickj-1)!=7) //Calculo Matriz central
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}
}
}
else if( (*clicki-1)==0 && (*clickj-1)!=0 && (*clickj-1)!=7) //Validacion Fila 0
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
do
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}while( (*clicki-1>0) );
}
}
}
else if( (*clicki-1)==7 && (*clickj-1)!=0 && (*clickj-1)!=7) //Validacion Fila 7
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
do
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}while( (*clicki-1<8) );
}
}
}
else if( (*clickj-1)==0 && (*clicki-1)!=0 && (*clicki-1)!=7) //Validacion columna 0
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
do
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}while( (*clickj-1<0) );
}
}
}
else if( ( (*clickj-1)==7 && (*clicki-1)!=0 && (*clicki-1)!=7)) //Validacion columna 7
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
do
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}while( (*clickj-1<8) );
}
}
}
else if( ( (*clickj-1)==0 && (*clicki-1)==0) ) //Validacion Esquina 1
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
do
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}while( (*clickj-1<0) && (*clicki-1<0) );
}
}
}
else if( ( (*clickj-1)==0 && (*clicki-1)==7) ) //Validacion Esquina 2
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
do
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}while( (*clicki-1<0) && (*clickj-1<8) );
}
}
}
else if( ( (*clickj-1)==7 && (*clicki-1)==0) ) //Validacion Esquina 3
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
do
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}while( (*clicki-1<8) && (*clickj-1<0) );
}
}
}
else if( ( (*clickj-1)==7 && (*clicki-1)==7) ) //Validacion Esquina 4
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
do
{
if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
{
posicion++;
}
}while( (*clicki-1<7) && (*clickj-1<7) );
}
}
}
switch(posicion)
{
case 1:
vectormuerte[*clicki-1][*clickj-1] = '1';
break;
case 2:
vectormuerte[*clicki-1][*clickj-1] = '2';
break;
case 3:
vectormuerte[*clicki-1][*clickj-1] = '3';
break;
case 4:
vectormuerte[*clicki-1][*clickj-1] = '4';
break;
case 5:
vectormuerte[*clicki-1][*clickj-1] = '5';
break;
case 6:
vectormuerte[*clicki-1][*clickj-1] = '6';
break;
case 7:
vectormuerte[*clicki-1][*clickj-1] = '7';
break;
case 8:
vectormuerte[*clicki-1][*clickj-1] = '8';
break;
}
//Con esta instrucción, se desbloquea la casilla seleccionada y se copia el contenido de vectormuerte
}
vectormina[*clicki-1][*clickj-1] = 0;
vectormina[*clicki-1][*clickj-1] = vectormuerte[*clicki-1][*clickj-1];
}
void cronometro(int s, int m, int h)
{
while(1)
{
if (s >=60)
{
s = 0;
m++;
if (m >= 60)
{
m = 0;
h++;
}
}
Sleep(1000); // funcion para que corra el ciclo en milisegundos
s++;
}
getch();
}
main() //PROGRAMA PRINCIPAL
{
char vectormina[8][8],nivel, vectormuerte[8][8], fin, condicion;
int minas=0, clicki=0, clickj=0, posicion=0, acum = 0;
int i=0,j=0;
int s=0, m=0, h=0; //contadores para el cronometro
system("color f");
//LLAMADO DE LAS FUNCIONES DECLARADAS
Bienvenida();
Eleccion(&nivel);
Inicializar(vectormina, vectormuerte);
Random(vectormuerte, &nivel, i, j);
Mostrar(vectormina);
do
{
Pregunta(&condicion);
if (condicion=='b'|| condicion=='B')
{
Bandera( vectormuerte, vectormina, &clicki, &clickj, &acum);
}
else if( condicion=='c' || condicion== 'C')
{
Coordenada(vectormina, vectormuerte, &clicki, &clickj, posicion, &acum);
}
Mostrar(vectormina);
if (vectormuerte[clicki-1][clickj-1] == 'X' && condicion=='c' || vectormuerte[clicki-1][clickj-1] == 'X' && condicion=='C')
{
//LA PARTIDA HABRA TERMINADO
fin = 'X';
for (int i=0; i<8; i++){
for(int j=0; j<8; j++){
if (vectormuerte[i][j]=='X')
{
vectormina[i][j]=0;
vectormina[i][j]= vectormuerte[i][j];
}
}
}
system("cls");
Mostrar(vectormina);
printf("\n\n :::::::::Usted ha perdido !x_x! LA PARTIDA HA FINALIZADO:::::::::\n");
system("pause");
system("cls");
printf("\n El puntaje obtenido en la partida es %i\n", acum);
printf("\n El tiempo jugado fue:\n");
printf("%i %i %i",h,m,s);
printf("\n\n ");
system("pause");
}
} while (fin != 'X');
} //FIN DE LA CONDICION DE LA VARIABLE NIVEL