Campo minado é um popular jogo de computador para um jogador. Foi inventado por Robert Donner em 1989 e tem como objectivo revelar um campo de minas sem que alguma seja detonada. Este jogo tem sido reescrito para as mais diversas plataformas, sendo a sua versão mais popular a que vem nativamente com o Microsoft Windows.
Índice
- 1 Versão 1: Campo Minado Simplificado
- 1.1 Passo 1:Escolhendo o Mapa
- 1.2 Passo 2: Construindo Mapa na Memoria
- 1.3 Passo 3: Implantando Bombas
- 1.4 Passo 4: Explodindo o Usuário
- 1.5 Exempolo Final Versão 1
- 2 Versão 2: Campo Minado MATRIZ
- 2.1 Passo 1: Construindo terreno
- 2.2 Passo 2: Escolhendo numero de Bombas
- 2.3 Passo 3: Sorteando e Implantando Bombas
- 2.4 Passo 4:Explodindo o Usuário Novamente
- 2.5 Exemplo Final Versão
Na primeira versão de um programa para CAMPO MINADO, queremos somente que o jogador consiga escolher o máximo de posições sem bombas.
Versão 1: Campo Minado Simplificado
Nesta versão vamos implementar a dificuldade fácil do jogo. Nosso campo em vez de ser um terreno de dimensão quadrada NxN, sera um terreno Nx1, como um corredor.
Passo 1:Escolhendo o Mapa
A primeira coisa a se fazer é escolher qual o tamanho do nosso terreno a ser construído. Jogador entra com o número do mapa e o número de bombas. O número de bombas b deve ser entre 0 e N, onde N é o número de casas do mapa.
int bomba; //VARIAVEL PARA GUARDAR NUMERO DE BOMBAS int N; //VARIAVEL PARA GUARDAR DIMENSAO DO TERRENO scanf("%d",&N); scanf("%d",&bomba); while(bomba<0 && bomba>N) { printf("Numero suficiente ou excedente de bombas!\n"); scanf("%d",&bomba); }
Para ler o número de casas do mapa e o número de bombas veja [[scanf|aqui]].
Passo 2: Construindo Mapa na Memoria
Você precisa alocar um array de inteiro começado com 0 em todas as casas do vetor.A função calloc aloca o endereço de memória com as posições do vetores setadas com 0.
int *M; // esta variável vai representar o terreno M = (int*)calloc(N *sizeof(int)); /*Alocação do Terreno*/
Para ler mais sobre alocação dinâmica veja [[Memória_e_alocação_dinâmica|aqui]].
Passo 3: Implantando Bombas
Nesse passo iremos implantar as bombas no terreno. Boa sorte e CUIDADO com as bombas.
Vamos implantar as bombas aleatoriamente. Sorteie a posição de cada bomba no vetor, considerando que cada uma tenha a posição diferente das demais. Para sortear a posição vamos usar uma função chamada rand(), para utiliza-la precisamos incluir a biblioteca stdlib.h no nosso código. Precisamos relembrar que N é a dimensão do nosso terreno, assim o numero gerado deve ser de 0 ate N. Precisamos tomar o cuidado para não repetir uma bomba no mesmo local, com isso as chaces de viver são baixíssimas. Ao sortear o numero da posição da nova bomba coloque -1 no vetor do nosso terreno para representar que tem bomba.
#include <stdlib.h> int pos; //variavel para guardar posição sorteada. while(bomba > 0) { pos = rand() % M; if(M[pos] == 0) { M[pos] = -1; bomba --; } }
Passo 4: Explodindo o Usuário
Nesse passo iremos jogar e tentar explodir algum amigo azarado.
O jogador entra com o número das casas
- Se Tiver Bomba: Escreva a ‘PONTUAÇÃO FINAL’ e ‘GAME OVER’.
- Senão: Incremente 1 em pontos e altere o mapa da tela, colocando X à posição da casa escolhida anteriormente.
Crie um mecanismo para que não possibilite o jogador escolher uma casa já escolhida anteriormente.
int vida = 1; int pontos = 0; int pos_jogador; while(vida == 1 ) { printf("Pontos: %d",pontos); printf("\n["); for(i = 0; i < N; i++) { if(M[i] == 1) //Se posição ja foi escolhida pelo jogador printf("x "); printf("_ "); } printf("]\n"); for(i = 0; i < N; i++) printf(" %d",i); printf("Jogador:"); scanf("%d",&pos_jogador); if(M[pos_jogador] == -1) //Pisou na Bomba? { printf("PONTUAÇÃO FINAL: %d\n", pontuação); printf(" GAME OVER\n"); } else { M[pos_jogador] = 1; pontos++; } }
Exempolo Final Versão 1
- dimensão de mapa 10
- número de bombas 6 posições sorteadas[0,3,5,8,6,2] (o jogador não deve ter o conhecimento das posições sorteadas)
MAPA:
Visão do Jogador Visão Sistema [_ _ _ _ _ _ _ _ _ _] [-1 0 0 -1 0 -1 -1 0 -1 0] 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
TELA DE JOGO:
Pontos: 0 [_ _ _ _ _ _ _ _ _ _] 0 1 2 3 4 5 6 7 8 9 Jogador: 2 Pontos: 1 [_ _ x _ _ _ _ _ _ _] 0 1 2 3 4 5 6 7 8 9 Jogador: 7 Pontos: 2 [_ _ x _ _ _ _ X _ _] 0 1 2 3 4 5 6 7 8 9 Jogador: 5 PONTUAÇÃO FINAL: 2 GAME OVER
Versão 2: Campo Minado MATRIZ
Utilizando a mesma mecânica da versão anterior, agora utilize uma matriz.
Passo 1: Construindo terreno
O número do tamanho do mapa, correspondera ao tamanho da matriz QUADRADA, ou seja, NxN onde N é o tamanho de linhas e colunas da matriz.
int **M; // esta variável vai representar o terreno M = (int**) calloc(dim *sizeof(int*)); //Alocação de uma dimensão do terreno for(int i = 0; i < N; i++) M[i] = (int*) calloc(dim *sizeof(int)); //Alocação da segunda dimensão //do terreno
Passo 2: Escolhendo numero de Bombas
Atendendo às mesmas regras de números de bombas, agora a randomização deve ser para a posição de coluna e de linha.
- Como o tamanho que passamos e o N, assim o tamanho do mapa é N*N, o número de bombas deve ser 0 < B < N*N.
#include <stdlib.h> int pos; //variável para guardar posição sorteada. while(bomba<0 && bomba>(N*N)) { printf("Numero suficiente ou excedente de bombas!\n"); scanf("%d",&bomba); }
Passo 3: Sorteando e Implantando Bombas
Como estamos utilizando um terreno matricial, a posição da bomba deve ser [linha x coluna].
#include <stdlib.h> int posi; //variavel para guardar linha i sorteada. int posj; //variavel para guardar coluna j sorteada. while(bomba > 0) { posi = rand() % N; posj = rand() % N; if(M[posi][posj] == 0) { M[posi][posj] = -1; bomba --; } }
Passo 4:Explodindo o Usuário Novamente
As regras continuam as mesmas, 1 bomba e adeus. Como estamos utilizando matriz, agora o jogar deve passar a posição [linha x coluna] escolhida do mapa.
int vida = 1; int pontos = 0; int posi_jogador; //variavel para guardar posição linha i do jogador. int posj_jogador; //variavel para guardar posição coluna j do jogador. while(vida == 1 ) { printf("Pontos: %d",pontos); for(i = 0; i < N; i++) printf(" %d",i); for(i = 0; i < N; i++) { printf("\n%d [",i); if(M[posi_jogador][posj_jogador] == 1) //Se posição ja foi //escolhida pelo jogador printf("x "); printf("_ "); printf("]\n"); } printf("Jogador:"); scanf("%d %d",&posi_jogador,&posj_jogador); //Recolhendo posição do Jogador if(M[posi_jogador][posj_jogador] == -1) //Pisou na Bomba? { printf("PONTUAÇÃO FINAL: %d\n", pontuação); printf(" GAME OVER\n"); } else { M[posi_jogador][posj_jogador] = 1; //Alivio, ainda esta vivo, pontos++; //Ganha um ponto. } }
Exemplo Final Versão 2
- dimensao de mapa 5
- número de bombas 6 posições sorteadas[(0,4),(3,2),(2,1),(1,1),(4,3)] (o jogador não deve ter o conhecimento das posições sorteadas)
MAPA:
Visão do Jogador Visão Sistema 0 1 2 3 4 0 1 2 3 4 0[_ _ _ _ _] 0[_ _ _ _ -1] 1[_ _ _ _ _] 1[_ -1 _ _ _] 2[_ _ _ _ _] 2[_ -1 _ _ _] 3[_ _ _ _ _] 3[_ _ -1 _ _] 4[_ _ _ _ _] 4[_ _ _ -1 _]
TELA DE JOGO:
Pontos: 0 0 1 2 3 4 0[_ _ _ _ _] 1[_ _ _ _ _] 2[_ _ _ _ _] 3[_ _ _ _ _] 4[_ _ _ _ _] Jogador: 2 3 Pontos: 1 0 1 2 3 4 0[_ _ _ _ _] 1[_ _ _ _ _] 2[_ _ _ x _] 3[_ _ _ _ _] 4[_ _ _ _ _] Jogador: 4 1 Pontos: 2 0 1 2 3 4 0[_ _ _ _ _] 1[_ _ _ _ _] 2[_ _ _ x _] 3[_ _ _ _ _] 4[_ X _ _ _] Jogador: 4 3 PONTUAÇÃO FINAL: 2 GAME OVER