Forum Pplware

Versão Completa: Ajuda campo minas C
Está de momento a ver uma versão reduzida do nosso conteúdo. Ver versão completa com o formato adequado.
Boas a todos! Bem tou a fazer um jogo do campo de minas em C, que tem como objectivo descobrir todas as minas se descobrir alguma mina perde o jogo. A minha questão é que pretendo estar a jogar e depois guardar o estado do jogo para poder retomar posteriormente carregando este do disco. Eu coloquei as funções de fread e fwrite mas não tou a conseguir o resultado pretendido. Como ainda sou principiante em programação e em C, q uem puder ajudar agradeço! Junto vai um anexo com um resumo do que faz cada função

Código:
//Bibliotecas
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//Constantes
#define TAM 10        //Tamanho da matriz do jogo.
#define MAXMINAS 40   //Numero máximo de minas.

//Funções
void inicializarmatriz(int matriz1[TAM][TAM]){ //Zera a matriz
      
        //Declaração de variaveis
        int i, j;
        //Zera todas as posições da matriz
        for(i=TAM-1; i>=0; i--){
          for(j=TAM; j>=0; j--)
            matriz1[i][j] = 0;  
        }
}

void sortearminas(int nminas, int jogo[TAM][TAM]){ //Sorteia o numero de minas escolhidas dentro do campo

        //Declaração de variaveis
        int i, j, numero=0;
      
        srand(time(NULL));
        // Sorteio das minas
        
        while(nminas > 0){
          //Gera 2 numeros aleatorios de 0 a TAM-1 (tamanho da matriz)
          i = rand() % TAM - 1;
          j = rand() % TAM - 1;
          
          if (jogo[i][j] != -1){
            jogo[i][j] = -1;
            nminas--;
                }
        }
        //Gera os numeros em cada posição
        for(i=0; i<TAM; i++){
          for(j=0; j<TAM; j++){
            if(jogo[i][j] == 0){
              numero = 0;            
              
              //Conta as minas nas casas adjacentes
              if(i-1 >= 0   && jogo[i-1][j] == -1) numero++;                 // Linha acima
              if(i+1 < TAM  && jogo[i+1][j] == -1) numero++;                 // Linha abaixo
              if(j-1 >= 0   && jogo[i][j-1] == -1) numero++;                 // Coluna a esquerda
              if(j+1 < TAM  && jogo[i][j+1] == -1) numero++;                 // Coluna a direita
              if(i-1 >= 0   && j-1 >= 0   && jogo[i-1][j-1] == -1) numero++; // Diagonal superior esquerda
              if(i-1 >= 0   && j+1 < TAM  && jogo[i-1][j+1] == -1) numero++; // Diagonal superior direita
              if(i+1 < TAM  && j-1 >= 0   && jogo[i+1][j-1] == -1) numero++; // Diagonal inferior esquerda
              if(i+1 < TAM  && j+1 < TAM  && jogo[i+1][j+1] == -1) numero++; // Diagonal inferior direita
                              
              jogo[i][j] = numero;                
                        }
                }
        }
}

int validajogo(int jogo[TAM][TAM], int jogadas[TAM][TAM]){ //Validação do jogo (enquanto não encontrar mina o jogo continua)
      
        //Declaração de variaveis
        int i, j, status = 1;
        //Verfifica o estado do jogo
        for(i=0; i<TAM && status == 1; i++){
          for(j=0; j<TAM && status == 1;j++){
            if(jogadas[i][j] == 1 && jogo [i][j] == -1)
              status = 0;        
                }
        }
        return status;
}  

int pontuacao(int jogadas[TAM][TAM]){ //Mostra a pontuação
      
        //Declaração de variaveis
        int pontuacao = 0, i, j;
        //Contagem dos pontos
        for(i=TAM-1; i>=0; i--){
          for(j=TAM-1; j>=0; j--){
            if(jogadas[i][j] == 1)
            pontuacao++;
                }
        }
        return pontuacao;
}  


void mostrarjogo(int jogo[TAM][TAM], int jogadas[TAM][TAM]){ //Mostra o campo inicial
      
        //Declaração de variaveis
        int i, j;
        //Mostra o tabuleiro
        printf("\n  ---------------------------------------------------");
        printf("\n  |      |");
        //Imprime os numeros superiores
        for(i=1; i<=TAM; i++)
          if(i < 10)
            printf("   %d", i);
              
          else
            printf("  %d", i);
      
            printf(" |\n  ---------------------------------------------------");
              
        for(i=0; i<TAM; i++){
          //Imprime os numeros laterais
          if(i+1 < 10)
            printf("\n  |   %d  |", i+1);
          else
            printf("\n  |  %d  |", i+1);
              
        for(j=0; j<TAM; j++){
          switch(jogadas[i][j]){
            case 0:
              //Posição não jogada, mostra um ponto
              printf("   .");
              break;
                                      
            case 1:
              //Posição jogada, mostra espaço vazio ou o numero de minas nas casas adjacentes
              if(jogo[i][j] == 0)
                printf("   0");
                                      
              else
                printf("   %d", jogo[i][j]);
            break;
                                      
            case 2:
              //Mina marcada, mostra um M
              printf("   M");
              break;
                        }        
                }
              printf("  |");
        }
        printf("\n  ---------------------------------------------------\n");
}

void guardar(int jogo[TAM][TAM]){
    FILE *fout = fopen("minas.txt", "w");
    if(fout){
        fwrite(jogo, sizeof(int)*TAM*TAM, 1, fout);
        fclose(fout);
    }        
}

void carregar(int jogo[TAM][TAM]){
    FILE *fin = fopen("minas.txt", "r");
    if(fin){
        fread(jogo, sizeof(int)*TAM*TAM, 1, fin);
        fclose(fin);
    }
}

void executarjogadas(int x, int y, int jogo[TAM][TAM], int jogadas[TAM][TAM]){ //Executa as possiveis jogadas
      
        //Verifica se as coordenadas estão de acordo com o tamanho do campo
        if(x>=0 && x<TAM && y>=0 && y<TAM){
          if(jogadas[x][y] == 0){
            jogadas[x][y] = 1;
            if(jogo[x][y] == 0){ //Verfifica se não foi jogado ainda nesta posição
              if(x-1 >= 0 && jogo[x-1][y] != -1)
                executarjogadas(x-1, y, jogo, jogadas);  //Executa a jogada na casa da esquerda
                              
              if(x+1 < TAM && jogo[x+1][y] != -1)
                executarjogadas(x+1, y, jogo, jogadas);  //Executa a jogada na casa da direita
                              
              if(y-1 >= 0 && jogo[x][y-1] != -1)
                executarjogadas(x, y-1, jogo, jogadas);  //Executa a jogada na casa de cima
                              
              if(y+1 < TAM && jogo[x][y+1] != -1)
                executarjogadas(x, y+1, jogo, jogadas);  //Executa a jogada na casa de baixo
                              
              if(x-1 >= 0 && y-1 >= 0 && jogo[x-1][y-1] != -1)
                executarjogadas(x-1, y-1, jogo, jogadas); //Executa a jogada na casa diagonal esquerda de cima
                              
              if(x+1 < TAM && y-1 >= 0 && jogo[x+1][y-1] != -1)
                executarjogadas(x+1, y-1, jogo, jogadas);  //Executa a jogada na casa diagonal direita de cima
                              
              if(x-1 >= 0 && y+1 < TAM && jogo[x-1][y+1] != -1)
                executarjogadas(x-1, y+1, jogo, jogadas);  //Executa a jogada na casa diagonal esquerda de baixo
                              
              if(x+1 < TAM && y+1 < TAM && jogo[x+1][y+1] != -1)
                executarjogadas(x+1, y+1, jogo, jogadas);  //Executa a jogada na casa diagonal direita de baixo      
                        }
                }
        }
}

int marcarminas(int x, int y, int jogadas[TAM][TAM], int nminas){ //Marca as minas no campo
      
        //Validação do numero de minas e da posição na matriz
        if(nminas > 0 && x >= 0 && x < TAM && y >= 0 && y < TAM){
          //Se a posição não foi jogada e não há mina marcada, marca a mina
          if(jogadas[x][y] == 0){
            jogadas[x][y] = 2;
            nminas--;
                }
            //Mas se há mina marcada, desmarca a mina
            else if(jogadas[x][y] == 2){
              jogadas[x][y] = 0;
              nminas++;
                }
        }
        //Retorna o novo numero de minas restantes      
        return nminas;
}

void mostrar(int jogo[TAM][TAM]){ //Mostra o jogo realizado pelo jogador assim que perca ou que a opçao sair seja selecionada
      
        //Declaração de variaveis
        int i, j;
      
        //Mostra o tabuleiro
        printf("\n---------------------------------------------------");
        printf("\n|      |");
      
        for(i=1; i<=TAM; i++)
          if(i < 10)
            printf("   %d", i);
          else
            printf("  %d", i);
      
        printf(" |\n---------------------------------------------------");
              
        for(i=0; i<TAM; i++){
          if(i+1 < 10)
            printf("\n|   %d  |", i+1);
              
          else
            printf("\n|  %d  |", i+1);
              
        for(j=0; j<TAM; j++){
          switch(jogo[i][j]){
            case 0:
              printf("   0");
              break;
                                      
            case -1:
              printf("   *");
              break;
                                      
            default:
              printf("   %d", jogo[i][j]);
              break;                        
                        }  
                }
                printf("  |");
        }
        printf("\n---------------------------------------------------\n");
}            

void jogar(char jogador[100], int nminas) // Inicia o jogo
{
       //Declaraçãoo de variaveis
      
       //Matriz do jogo
       int jogo[TAM][TAM];
      
       // Matriz de jogadas
       int jogadas[TAM][TAM];
      
       //Opção do menu
       int op = 0;
      
       //Coordenadas da jogada
       int x, y;
      
       //Numero total de minas
       int minas = nminas;
      
       //Inicializa as matrizes
       inicializarmatriz(jogo);
       inicializarmatriz(jogadas);
      
       //Sortear as minas pelo tabuleiro
       sortearminas(nminas, jogo);
      
       //Inicia o jogo
       while(validajogo(jogo, jogadas) == 1 && pontuacao(jogadas) < TAM*TAM - minas && op != 3){
              
       //Limpa o ecra
       system("cls");
       //Mostra o cabeçalho do jogo
       printf("\n\n  Jogador: "); puts (jogador);
       printf("  Pontuacao: %d\n", pontuacao(jogadas));
       printf("  Numero de Minas restantes: %d \n", nminas);
       printf("  Menu: 1-Jogar | 2-Marcar/Desmarcar mina | 3-Sair e Mostrar jogo");
       //Mostra o tabuleiro
       mostrarjogo(jogo, jogadas);
      
       //Leitura da opção do menu
       printf("  Opcao do menu: ");
       scanf("%d", &op);
              
       //Verifica a opção do menu
       if(op == 1 || op == 2){
                // Leitura das coordenadas
                printf("\n 0 0 Volta ao menu\n  ");
                printf("\n 11 11 Guarda o jogo ");
                printf("\nLinha: ");
                scanf("%d", &x);
                printf("\nColuna: ");
                scanf("%d", &y);
                if(x == 11 && y == 11) guardar(jogo);
                
                if(x == 12 && y == 12) carregar(jogo);
                //Seleciona a opção do menu
                switch(op){
                              case 1:
                                //Executar a jogada
                                executarjogadas(x-1, y-1, jogo, jogadas);
                              break;
                                      
                              case 2:
                                //Marcar mina
                                nminas = marcarminas(x-1, y-1, jogadas, nminas);
                              break;
                        }
                }
        }
      
        //Limpa o ecra
        system("cls");
      
        //Se descobrir todas as minas:
        if(pontuacao(jogadas) == TAM*TAM - minas)
          printf("\n\n\n          PARABENS! GANHOU!         \n\n\n");
      
        //Se a opção for Sair do Jogo
        else if(op == 3){
          printf("\n\n\n        SAIU do JOGO!         \n");
          mostrar(jogo);
          printf("\n\n\n");}      
                
        //Senão, jogo encerrado      
       else{
          printf("\n\n\n          PERDEU!         \n");
          printf("        A sua pontuacao foi: %d\n\n\n", pontuacao(jogadas)-1);
          mostrar(jogo);
        }  
}  

// Programa principal
int main(void)
{
        //Declaração das variaveis
        char jogador[100]; //Nome do jogador
        //Opção do menu
        int op;
        //Numero de minas no jogo
        int nminas=0;
        
        int jogo[TAM][TAM];
        int jogadas[TAM][TAM];        
        
              
        //Leitura do nome do jogador
        printf("Jogo Campo de Minas \n\n");
        printf("Insira o nome do jogador: ");
        gets(jogador);
      
        //Inicia o jogo
        do{
             //Limpa o ecra
             system("cls");
             // Mostra o menu
             printf("Menu principal: \n");
             printf("\n1. Jogar");
             printf("\n2. Carregar jogo anterior");
             printf("\n3. Sair");
              
             //Leitura da opção do menu
             printf("\n\nOpcao: ");
             scanf("%d", &op);
              
             //Validação da opção
             if(op>0 && op<3){
              
               switch(op){
                
                 case 1:
                      
                    //Definir numero de minas
                   do{
                     //Limpa o ecra
                     system ("cls");
                     //Leitura do numero de minas
                     printf("Minimo: 1\nMaximo: %d\n\n", MAXMINAS);
                     printf("Numero de minas: ");
                     scanf("%d", &nminas);            
                     }while(nminas < 1 || nminas > MAXMINAS);        
                   //Opção jogar
                   //Verificação do numero de minas
                   if(nminas>=1 && nminas<=MAXMINAS){
                     // Inicia o jogo
                     jogar(jogador, nminas);
                     printf("Sair? 0-Sim | 1-Nao \n");
                     scanf("%d", &op);
                     if(op == 1) break;
                     else exit(0);
                     nminas = 0;                        
                     }
                     break;
                
                 case 2:
                   //Opção carregar jogo anterior
                   carregar(jogo);
                 break;
                        }      
                }      
        }
        while(op!=3);      
        return 0;
}
A tua dificuldade está portanto em escrever para e ler de um ficheiro, é isso? Coloca aqui o conteúdo das funções que dizes não funcionar. Só assim é possível dar feedback.
URL's de Referência