Elabore este código en C, tengo varios problemas con el. (estoy desesperado por ello ya intente de todo)
El código es el juego de buscaminas, en pantalla una vez que se corre el juego se muestra el tablero con las minas expuestas. la idea es que no se muestren estas minas. también no se tiene nunca un ganador o perdedor. ojala me pudieran ayudar, de este código depende mi calificación del semestre.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define EASY 5
#define MEDIUM 10
#define HARD 15
#define MINAS 10
// Función para imprimir el encabezado
void encabezado() {
printf("\n\t ____ _ _ ____ ____ _ __ __ _ _ _ ____ ");
printf("\n\tU | __\") u U |\"|u| | / __\"| u U /\"___| U /\"\\ u U|' \\/ '|u ___ | \\ |\"| U /\"\\ u / __\"| u ");
printf("\n\t \\| _ \\ / \\| |\\| | \\___ \\/ \\| | u \\/ _ \\/ \\| |\\/| |/ |_\"_| <| \\| |> \\/ _ \\/ <\\___ \\/ ");
printf("\n\t | |_) | | |_| | u___) | | |/__ / ___ \\ | | | | | | U| |\\ |u / ___ \\ u___) | ");
printf("\n\t |____/ <<\\___/ |____/>> \\____| /_/ \\_\\ |_| |_| U/| |\\u |_| \\_| /_/ \\_\\ |____/>> ");
printf("\n\t _|| \\\\_ (__) )( )( (__) _// \\\\ \\\\ >> <<,-,,-..-,_|___|_,-.|| \\\\,-.\\\\ >> )( (__) ");
printf("\n\t(__) (__) (__) (__) (__) (__) (__) (__) (./ \\.)\\_)-' '-(_/ (_\") (_/(__) (__)(__) ");
printf("\nEcho por: Mares Muñoz Moises Fernando y Emmanuel Guzman Palomo\n");
}
// Función para inicializar el tablero
void inicializarTablero(char **tablero, int size) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
*(*(tablero + i) + j) = ' ';
}
}
}
// Función para imprimir el tablero
void imprimirTablero(char **tablero, int size, int mostrarMinas) {
printf("\n--- Tablero ---\n\n ");
for (int j = 0; j < size; j++) printf("%2d ", j);
printf("\n");
for (int i = 0; i < size; i++) {
printf("%2d ", i);
for (int j = 0; j < size; j++) {
char cell = *(*(tablero + i) + j);
if (cell == -1) printf(mostrarMinas ? " * " : " # "); // Esto muestra un espacio en blanco en lugar de un asterisco
else if (cell == ' ') printf(" . ");
else printf(" %d ", cell);
}
printf("\n");
}
printf("\n");
}
// Función para colocar las minas en el tablero
void colocarMinas(char **tablero, int size, int minas) {
srand(time(NULL));
for (int minasColocadas = 0; minasColocadas < minas;) {
int fila = rand() % size;
int columna = rand() % size;
if (*(*(tablero + fila) + columna) == ' ') {
*(*(tablero + fila) + columna) = -1;
minasColocadas++;
}
}
}
// Función para contar el número de minas adyacentes a una casilla
int contarMinasAdyacentes(char **tablero, int size, int fila, int columna){
int contador = 0;
for (int i = fila - 1; i <= fila + 1; i++) {
for (int j = columna - 1; j <= columna + 1; j++) {
if (i >= 0 && i < size && j >= 0 && j < size && *(*(tablero + i) + j) == -1) contador++;
}
}
return contador;
}
// Función para revelar casillas vacías adyacentes
void revelarCasillasVacias(char **tablero, int size, int fila, int columna) {
if (fila >= 0 && fila < size && columna >= 0 && columna < size && *(*(tablero + fila) + columna) == ' ') {
*(*(tablero + fila) + columna) = contarMinasAdyacentes(tablero, size, fila, columna);
if (*(*(tablero + fila) + columna) == 0) {
*(*(tablero + fila) + columna) = '.'; // Cambia la representación de la casilla vacía a un punto
for (int i = fila - 1; i <= fila + 1; i++) {
for (int j = columna - 1; j <= columna + 1; j++) {
if (i != fila || j != columna) revelarCasillasVacias(tablero, size, i, j);
}
}
}
}
}
char** crearTablero(int size) {
char** tablero = (char**) malloc(size * sizeof(char*));
for (int i = 0; i < size; i++) {
tablero = (char*) malloc(size * sizeof(char));
}
return tablero;
}
void liberarTablero(char** tablero, int size) {
for (int i = 0; i < size; i++) {
free(tablero);
}
free(tablero);
}
int main() {
encabezado();
int option, size, minas;
do {
printf("Elige un nivel de dificultad:\n1. Fácil\n2. Intermedio\n3. Difícil\n4. Salir\n");
scanf("%d", &option);
switch(option) {
case 1:
size = EASY;
minas = 10;
break;
case 2:
size = MEDIUM;
minas = 30;
break;
case 3:
size = HARD;
minas = 50;
break;
case 4:
printf("¡Gracias por jugar!\n");
return 0;
default:
printf("Opción no válida.\n");
continue;
}
char **tablero = crearTablero(size);
inicializarTablero(tablero, size); // Inicializa el tablero antes de colocar las minas
colocarMinas(tablero, size, minas); // Coloca las minas después de inicializar el tablero
int gameOver = 0;
while (!gameOver) {
imprimirTablero(tablero, size, 0);
int fila, columna;
printf("Ingresa la fila (0-%d): ", size - 1);
scanf("%d", &fila);
printf("Ingresa la columna (0-%d): ", size - 1);
scanf("%d", &columna);
if (fila < 0 || fila >= size || columna < 0 || columna >= size) {
printf("Coordenadas no validas. Por favor, intentalo de nuevo.\n");
continue;
}
if (*(*(tablero + fila) + columna) != ' ') {
printf("La casilla ya ha sido revelada. Intenta de nuevo.\n");
continue;
}
if (*(*(tablero + fila) + columna) == -1) {
gameOver = 1;
printf("¡Has perdido!\n");
break;
}
else {
revelarCasillasVacias(tablero, size, fila, columna);
int casillasNoReveladas = 0;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (*(*(tablero + i) + j) == ' ' || *(*(tablero + i) + j) == '.') casillasNoReveladas++;
}
}
if (casillasNoReveladas == minas) {
gameOver = 1;
printf("¡Has ganado!\n");
break;
}
}
}
imprimirTablero(tablero, size, 1);
liberarTablero(tablero, size);
printf("¿Quieres jugar de nuevo?\n1. Sí\n2. No\n");
scanf("%d", &option);
} while(option != 2);
printf("¡Gracias por jugar!\n");
return 0;
}