Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Fernando13 en 20 Junio 2023, 07:41 am



Título: Necesito de ayuda maestros del lenguaje en c
Publicado por: Fernando13 en 20 Junio 2023, 07:41 am
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;
}


Título: Re: Necesito de ayuda maestros del lenguaje en c
Publicado por: Eternal Idol en 20 Junio 2023, 08:52 am
No se hacen tareas ajenas.