Para praticar o que estamos aprendendo aqui no nosso Curso de Programação C, vamos nesta aula definir a estrutura do nosso CAMPO MINADO. Quais estruturas de dados usaremos e se será necessário criar algum novo tipo de dado.
Caso tenha perdido a aula anterior, aqui está o link: JOGO CAMPO MINADO Parte 1.
A primeira decisão que precisamos tomar é como representar nosso jogo campo minado, quais e quantas estruturas utilizar.
Como precisamos saber três informações sobre cada posição (se está aberta ou fechada, se é bomba ou não e a quantidade de bombas vizinhas) vamos criar uma estrutura chamada Celula.
typedef struct{ int eBomba; int estaAberta; int vizinhos; }Celula;
Agora podemos criar uma matriz de células. Assim, cada posição da nossa matriz terá três campos. Esta matriz será uma variável global.
// variáveis globais Celula jogo[10][10]; int l, c, tam = 10;
Antes de iniciar nosso jogo precisamos inicializar nossa matriz, ou seja, dizer que:
– todas as posições estão fechadas;
– não há bombas;
– e zero bombas vizinhas.
// procedimento para inicializar a matriz do jogo void inicializarJogo(){ for(l = 0; l < tam; l++){ for(c = 0; c < tam; c++){ jogo[l][c].eBomba = 0; jogo[l][c].estaAberta = 0; jogo[l][c].vizinhos = 0; } } }
Com a matriz inicializada precisamos agora sortear bombas. Para isso vamos elaborar um procedimento que sorteia n bombas para nosso jogo campo minado. Como as coordenadas podem ser sorteadas mais de uma vez (se repetir), para garantir que sejam sorteadas exatamente n bombas verificamos se a coordenada sorteada já é uma bomba, se for, decrementamos a variável i, para que outra coordenada seja sorteada.
// procedimento para sortear n bombas void sortearBombas(int n){ int i; srand(time(NULL)); for(i = 1; i <= n; i++){ l = rand() % tam; c = rand() % tam; if(jogo[l][c].eBomba == 0) jogo[l][c].eBomba = 1; else i--; } }
Código parcial em C para o Jogo Campo Minado
#include <stdio.h> #include <stdlib.h> #include <time.h> /* Aula 178: Estrutura do Campo Minado Código escrito por Wagner Gaspar Abril de 2021 CELULA eBomba 0 ou 1 estaAberta 0 ou 1 vizinhos 0 a 4 */ typedef struct{ int eBomba; int estaAberta; int vizinhos; }Celula; // variáveis globais Celula jogo[10][10]; int l, c, tam = 10; // procedimento para inicializar a matriz do jogo void inicializarJogo(){ for(l = 0; l < tam; l++){ for(c = 0; c < tam; c++){ jogo[l][c].eBomba = 0; jogo[l][c].estaAberta = 0; jogo[l][c].vizinhos = 0; } } } // procedimento para sortear n bombas void sortearBombas(int n){ int i, bombas = 0; srand(time(NULL)); for(i = 1; i <= n; i++){ l = rand() % tam; c = rand() % tam; if(jogo[l][c].eBomba == 0){ jogo[l][c].eBomba = 1; bombas++; } else i--; } } // ------------------ CONTINUA NA AULA SEGUINTE ------------------- int main() { inicializarJogo(); sortearBombas(20); return 0; }