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;
}