Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Calcular dicas num jogo de Campo Minado

Boa tarde, estou tendo dificuldade em implementar uma função ao meu jogo de campo minado onde calculo quantas bombas cada item da matriz esta tocando. Eu utilizo o numero 9 para representar as bombas em minha matriz, e todos os outros valores da matriz são nulos, mas devem subir de 1 em 1 de acordo com quantas bombas estão tocando. Ex.: PRINT.

Ate o momento apenas consegui fazer uma função que escaneia item por item da matriz e que quando encontra uma bomba, adiciona 1 a suas laterais e diagonais, mas mesmo assim o meu programa não parece fazer o desejado, sendo que varias vezes o numero não condiz com o numero de bombas. Gostaria de saber se existe alguma maneira de resolver isso. Agradeço desde já.

Segue o código.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TAM 9

//variaveis gobais

//preview funcoes
void introducao();
void zeraMatriz(int campoMinado[9][9]);
void mostraMatriz(int campoMinado[9][9]);
void sorteiaBombas(int campoMinado[9][9]);
void calculaDicas(int campoMinado[9][9]);
void arrumaBombas(int campoMinado[9][9]);

//funcoes
void introducao() {
    printf("*****************\n");
    printf("** MINESWEEPER **\n");
    printf("*****************\n");
}

void zeraMatriz(int campoMinado[9][9]) {
    int i = 0, j = 0;
    for (int i = 0; i < 9; ++i) {

        for (int j = 0; j < 9; ++j) {
            campoMinado[i][j] = 0;
        }

        j = 0;
    }

}

void mostraMatriz(int campoMinado[9][9]) {
    int i = 0, j = 0;
    for (int i = 0; i < 9; ++i) {

        for (int j = 0; j < 9; ++j) {
            printf("  %d", campoMinado[i][j]);
        }

        printf("\n");
        j = 0;
    }

}

void sorteiaBombas(int campoMinado[TAM][TAM]) {
    int i, j, bombas = 0;

    while(bombas < 10) {
        i = rand() % 9;
        j = rand() % 9;

        if(campoMinado[i][j] == 0){    
            campoMinado[i][j] = 9;
            bombas++;
        }
    }
}

void calculaDicas(int campoMinado[TAM][TAM]) {
    for (int i = 0; i < TAM; ++i)
    {
        for (int j = 0; j < TAM; ++j)
        {
            if (campoMinado[i][j] == 9)
            {
                campoMinado[i][j + 1]++;
                campoMinado[i][j - 1]++;
                campoMinado[i + 1][j]++;
                campoMinado[i - 1][j]++;
                campoMinado[i - 1][j + 1]++;
                campoMinado[i + 1][j + 1]++;
                campoMinado[i - 1][j -1]++;
                campoMinado[i + 1][j - 1]++;
            }
        }
    }
}

void arrumaBombas(int campoMinado[TAM][TAM]) {
    for (int i = 0; i < TAM; ++i)
    {
        for (int j = 0; j < TAM; ++j)
        {
            if (campoMinado[i][j] > 9)
            {
                campoMinado[i][j] = 9;
            }
        }
    }
}


int main() {
    srand(time(NULL));
    introducao();

    int campoMinado[9][9];

    zeraMatriz(campoMinado);

    mostraMatriz(campoMinado);

    printf("\n");
    sorteiaBombas(campoMinado);

    printf("\n\n");
    mostraMatriz(campoMinado);

    calculaDicas(campoMinado);
    arrumaBombas(campoMinado);

    printf("\n\n");

    mostraMatriz(campoMinado);

    //calculardicas
    //mostrartabuleiro
    //loop
    //ler coordenadas
    //ler abrir ou bomba
    //se abrir
    //    -dica --> abrir apenas a casa
    //    -bomba --> morre
    //    -vazio    --> abrir e analisar vizinhos ate a dica
    //se marcar
    //    -marcar
    //ate ganhar ou morrer


    system("pause");
    return 0;
}
1 resposta
solução!

Acebei de descobrir que eu posso utilizar a função arrumaBombas dentro da função calcula dicas, pois sem isso pode ser que uma bomba de valor 9 seja incrementada e passa a não ser considerado bomba.