Jogo Campo Minado

Publicado por Eduardo Paim Silveira (última atualização em 09/04/2010)

[ Hits: 22.173 ]

Homepage: http://saidecimadomuro.blogspot.com

Download CampoMinado.cpp




Jogo do Campo Minado em C, 8x8, com possibilidade de escolher o número de bombas e contador de bombas.

  



Esconder código-fonte

// CampoMinado.cpp 
// Eduardo "TheDrummer" Silveira
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <time.h>


void preenche_pos (int mat[10][10])
{
   short l,c;

   for(l=0; l<10; l++)
      for(c=0; c<10; c++)
         mat[l][c] = 5;
}

short escolhe_posicao (short pos)
{
   do{
      printf ("Digite uma posicao para abrir(1 a 8): ");
      scanf ("%hd",&pos);
      fflush (stdin);
      if (pos < 0 || pos > 8)
         printf ("\nValor invalido!\n");
   }while(pos < 0 || pos > 8);
   
   return pos;
}
int conta_minas (int pos[10][10],int minas)
{
   int espacos=0;
   short l,c;

   for(l=1; l<9; l++)
      for(c=1; c<9; c++)
         if (pos[l][c] != 1)
            espacos++;
   return (espacos-minas);
}

void mostra (int mat[10][10],int pos[10][10])
{
   short l,c;

   printf ("\n    1 2 3 4 5 6 7 8");
   for(l=0; l<10; l++){
      if (l > 0 && l < 9)
         printf ("\n%hd ",l);
      else
         printf ("  \n");
      for(c=0; c<10; c++)
         printf((l == 0 && c == 0 || l == 9 && c == 0) ? "  + " : (l == 0 || l == 9 || c == 0 || c == 9) ? "+ " : (pos[l][c] == 0 || pos[l][c] == 1) ? "%d " : "? ",mat[l][c]);
   }
   printf ("\n");
}

void mostra_aberto (int mat[10][10])
{
   short l,c;

   printf ("\n    1 2 3 4 5 6 7 8");
   for(l=0; l<10; l++){
      if (l > 0 && l < 9)
         printf ("\n%hd ",l);
      else
         printf ("  \n");
      for(c=0; c<10; c++)
         printf((l == 0 && c == 0 || l == 9 && c == 0) ? "  + " : (l == 0 || l == 9 || c == 0 || c == 9) ? "+ " : (mat[l][c] == 9) ? "* " : "%d ",mat[l][c]);
   }
   printf ("\n");
}
void abre_vazios (int cm[10][10],int pos[10][10],short l, short c)
{
   short x,y;
   bool continua;

   do{
      for (x = l - 1; x <= l + 1; x++)
         for (y = c - 1; y <= c + 1; y++){
            continua = false;
            if (pos[x][y] != 1){
               continua = true;
               pos[x][y] = 1;
               if (cm[x][y] == 0)
                  abre_vazios(cm,pos,x,y);
            }
         }
   }while(continua);
}

void posicao (int cm[10][10], int minas)
{
   int pos[10][10],sem_minas=64-minas;
   short l=0,c=0;

   preenche_pos(pos);

   do{
      printf ("\nUse a posicao 0,0 para sair.\n");
      printf ("\nLinha: ");
      l = escolhe_posicao(l);
      printf ("\nColuna: ");
      c = escolhe_posicao(c);
         
      if (l == 0 && c == 0){
         exit(0);
      }
      else if (pos[l][c] == 1 || pos[l][c] == 0 && l != 0 && c != 0)
         printf ("\nEsta posicao ja esta aberta!\n");
      else if (cm[l][c] == 9){
         pos[l][c] = 0;
         printf ("\nVoce atingiu uma bomba!\n");
         mostra_aberto(cm);
         break;
      }
      else if (cm[l][c] == 0){
         pos[l][c] = 1;
         abre_vazios(cm,pos,l,c);
         mostra(cm,pos);
         sem_minas = conta_minas(pos,minas);
         printf ("\nRestam %d espacos sem bomba.\n",sem_minas);
      }
      else {
         pos[l][c] = 1;
         mostra(cm,pos);
         sem_minas = conta_minas(pos,minas);
         printf ("\nRestam %d espacos sem bomba.\n",sem_minas);
      }
   }while(sem_minas != 0);
   if (sem_minas == 0)
      printf ("\nParabens! Voce ganhou!\n");
}

void calcula (int mat[10][10])
{
   short l,c,x,y;

   for(l=0; l<10; l++)
      for(c=0; c<10; c++)
         if (mat[l][c] == 9)
            for (x = l - 1; x <= l + 1; x++)
               for (y = c - 1; y <= c + 1; y++)
                  if (mat[x][y] != 9)
                     mat[x][y] += 1;
}

void gerador (int mat[10][10],int minas)
{
   short l,c,cont=0;
   int gerado;
   srand(time(NULL));

   do{      
      gerado = rand() % 8 + 1;
      l = gerado;
      gerado = rand() % 8 + 1;
      c = gerado;
      if (mat[l][c] != 9){
         mat[l][c] = 9;
         cont++;
      }
   }while (cont < minas);
}

void preenche (int mat[10][10])
{
   short l,c;

   for(l=0; l<10; l++)
      for(c=0; c<10; c++)
         mat[l][c] = ((l == 0 || l == 9 || c == 0 || c == 9) ? '+' : 0);
}

void main ()
{
   int cm[10][10],minas;
   short l,c;

   do{
      printf ("Digite a quantidade de minas (1 ate 60): ");
      scanf ("%d",&minas);
      fflush (stdin);
      if (minas < 1 || minas > 60)
         printf ("\nValor invalido!\n\n");
   }while(minas < 1 || minas > 60);

   preenche(cm);
   gerador(cm,minas);
   calcula(cm);
   posicao(cm,minas);

   getchar();
}

Scripts recomendados

Comando switch

Fazendo o somatório de 1 até N

Usando medidas de comprimento

[C] Agenda - LDE

Utilizando acentuação na linguagem C


  

Comentários
[1] Comentário enviado por cesar em 18/04/2011 - 13:36h

Legal Eddie, só que não funcionou aqui :P

Não compila, kk

[2] Comentário enviado por cesar em 18/04/2011 - 13:40h

Esquece, já consegui :P

tive que alterar o main, para funcionar:

int main(void)


[]'s

[3] Comentário enviado por eduardo em 18/04/2011 - 13:44h

kkkkkkkkkkkkkkkkkk

É que como na aula usava o Visual C++, usávamos o void main() (pois o main não deve retornar um valor, ao menos nesse caso). Dependendo o compilador pode dar erro.

E ai, o que achou?

[4] Comentário enviado por danielccosta63 em 06/05/2016 - 14:02h

/home/daniel/campominado.c:4:19: fatal error: tchar.h: No such file or directory
#include <tchar.h>
^
compilation terminated.
[Finished in 0.1s with exit code 1]
[shell_cmd: g++ "/home/daniel/campominado.c" -o "/home/daniel/campominado"]
[dir: /home/daniel]
[path: /home/daniel/.rvm/gems/ruby-2.3.0/bin:/home/daniel/.rvm/gems/ruby-2.3.0@global/bin:/home/daniel/.rvm/rubies/ruby-2.3.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/daniel/.rvm/bin:/home/daniel/.rvm/bin]


deu esse erro de compilação, alguem me ajuda a consertar

[5] Comentário enviado por eduardo em 06/05/2016 - 14:27h


[4] Comentário enviado por danielccosta63 em 06/05/2016 - 14:02h

/home/daniel/campominado.c:4:19: fatal error: tchar.h: No such file or directory
#include &lt;tchar.h&gt;
^
compilation terminated.
[Finished in 0.1s with exit code 1]
[shell_cmd: g++ "/home/daniel/campominado.c" -o "/home/daniel/campominado"]
[dir: /home/daniel]
[path: /home/daniel/.rvm/gems/ruby-2.3.0/bin:/home/daniel/.rvm/gems/ruby-2.3.0@global/bin:/home/daniel/.rvm/rubies/ruby-2.3.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/daniel/.rvm/bin:/home/daniel/.rvm/bin]


deu esse erro de compilação, alguem me ajuda a consertar


Olá Daniel. Provavelmente está faltando a biblioteca tchar.h no teu C.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts