Campo Minado

Bomba

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