Ir ao conteúdo
  • Cadastre-se

C Campo Minado em C


Visitante

Posts recomendados

Olá pessoal, tudo bom?

 

Tenho uma atividade da faculdade que a seguinte, tenho que criar um jogo campo minado 5x5, com as seguintes condições:

Se o jogador escolher o nível fácil, o tabuleiro deve ter 5 minas, se for o difícil 12  e o impossível 24. Eu tenho que usar a função rand para isso, mas não estou conseguindo implementar ela no meu código.

 

Só falta essa parte para mim, eu já consegui mostrar o tabuleiro na tela e marcar o  mesmo. Só falta a colocação das minas.

 

Como eu poderia resolver esse problema? Agradeço desde já pela atenção, um cordial abraço!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<string.h>

main(){
    char campominado[5][5],cminado[5][5];
    int linha,coluna;
    int nivel;
    int jogada;
    
    printf("\n\n---------------------BEM VINDO AO CAMPO MINADO 2.0---------------------");//Criação do menu
    printf("\n\nEscolha um nivel de dificuldade:(1)fácil (2)difícil (3)Impossivel: ");
    scanf("%d",&nivel);
    
    if(nivel==1){
     printf("\n\nNeste nivel ha 5 minas no tabuleiro,boa sorte!");
    
     srand(time(NULL));//tentativa de colocar as minas
     for(linha=0;linha<5;linha++){
         for(coluna=0;coluna<5;coluna++){
         cminado[linha][coluna]=rand () %5;
         cminado[linha][coluna]=='*';
    }
}
}
    for(linha=0;linha<5;linha++){//criação do tabuleiro que aparece na tela
     for(coluna=0;coluna<5;coluna++){
    campominado[linha][coluna]=0;
   }

}  
     printf("\n\n");    
     printf(" %c | %c | %c | %c | %c \n",campominado[0][0],campominado[0][1],campominado[0][2],campominado[0][3],campominado[0][4]);
     printf("---+---+---+---+---|\n");
     printf(" %c | %c | %c | %c | %c \n",campominado[1][0],campominado[1][1],campominado[1][2],campominado[1][3],campominado[1][4]);
     printf("---+---+---+---+---|\n");
     printf(" %c | %c | %c | %c | %c \n",campominado[2][0],campominado[2][1],campominado[2][2],campominado[2][3],campominado[2][4]);
     printf("---+---+---+---+---|\n");
     printf(" %c | %c | %c | %c | %c \n",campominado[3][0],campominado[3][1],campominado[3][2],campominado[3][3],campominado[3][4]);
     printf("---+---+---+---+---|\n");
     printf(" %c | %c | %c | %c | %c \n",campominado[4][0],campominado[4][1],campominado[4][2],campominado[4][3],campominado[4][4]);

     for(jogada=1;jogada<4;jogada++){//laço para controlar o nº de jogadas
         printf("\n\nInforma a linha que voce quer jogar: ");
         scanf("%d",&linha);
         printf("\nInforme a coluna que voce quer jogar: ");
         scanf("%d",&coluna);
         
         if(cminado[linha][coluna]=='*'){//condição se marcar o espaço que está a mina, o jogo acaba
             printf("\n\nVoce pisou na mina, buuummmm!");
             printf("\n\nGAME OVER");
             break;
         }
        
         else{
         campominado[linha-1][coluna-1]='X';//condição se marcar um espaço sem mina, vai aparecer o X no tabuleiro
          }
            
     printf("\n\n");    
     printf(" %c | %c | %c | %c | %c \n",campominado[0][0],campominado[0][1],campominado[0][2],campominado[0][3],campominado[0][4]);
     printf("---+---+---+---+---|\n");
     printf(" %c | %c | %c | %c | %c \n",campominado[1][0],campominado[1][1],campominado[1][2],campominado[1][3],campominado[1][4]);
     printf("---+---+---+---+---|\n");
     printf(" %c | %c | %c | %c | %c \n",campominado[2][0],campominado[2][1],campominado[2][2],campominado[2][3],campominado[2][4]);
     printf("---+---+---+---+---|\n");
     printf(" %c | %c | %c | %c | %c \n",campominado[3][0],campominado[3][1],campominado[3][2],campominado[3][3],campominado[3][4]);
     printf("---+---+---+---+---|\n");
     printf(" %c | %c | %c | %c | %c \n",campominado[4][0],campominado[4][1],campominado[4][2],campominado[4][3],campominado[4][4]);
}
     getch();
 }

 

Link para o comentário
Compartilhar em outros sites

Na realidade você só precisa, digamos que, no nível fácil, inserir 5 minas na matriz, é dizer, você precisa fazer o sorteio da posição e inserir a mina. Seria muito mais fácil fazer isso se fosse um vetor não é? Pois uma matriz eu preciso de 2 números para escolher a posição onde irá a mina. MAS UMA MATRIZ É UM VETOR!!!! HAHAHAHA
Rode este código:

    int i;
    int v[3][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };

    for(i=0; i<3*3; i++){
        printf("%d, ", v[0][i]);
    }

Para você entender eu sou capaz de percorrer toda a matriz sem necessidade de ter 2 laços for.:D Como é possível isso? Na memória, uma matriz ou array, se encontram todas as casas adjacentes uma das outras, dessa forma: v[0][0], v[0][1], v[0][2], v[1][0], v[1][1], v[1][2], v[2][0], v[2][1], v[2][2]. A memória é unidimensional, não bidimensional, estamos aproveitando a arquitetura da memoria a nosso favor. E é possível aplicar aritmética de ponteiros para cair na posição adequada, alterando o segundo índice da matriz(indice de colinas) e deixando o primeiro(índice de linhas) em zero(v[deixando esse em 0][alterando apenas este]). Como o vetor é de 3 por 3(no meu exemplo), o vetor vai de v[0][0] até v[0][(3*3)-1], o que é a mesma coisa que v[0][0] até v[0][9-1], de 0 a 8 são nove números, por isso o de 9-1, porque de v[0][0] até v[0][8] você tem nove posições.

E por que eu estou dizendo tudo isso? Porque normalmente, você precisaria fazer o sorteio de 2 números! Como falei anteriormente, para escolher a posição e depois inserir a mina você precisa indicar v[y][x](2 valores), mas com esse truque você somente precisa de 1 só número(v[0][este]), deixando o primeiro índice em 0, porque estamos tratando uma matriz como se fosse um vetor(E é!). TADAH!!!

Agora que ja podemos escolher o lugar onde deveria ir uma mina com apenas um indice, é só usar a função rand para escolher esse lugar.
De uma olhada no funcionamento da função rand, aqui lhe deixo um exemplo:

#include<stdio.h>
#include<stdlib.h> //rand
#include <time.h> //time(NULL)
#include <windows.h> //Sleep(milesegundos) um segundo equivale a 1000, Sleep(1000) espera 1 segundo Sleep(2000) espera 2 segundos, etc

int sorteio ( int min, int max ) {
    return rand() % (max + 1 - min) + min ;
}

int main() {
    srand ( time ( 0 ) ); //llamar uma unica vez!!! Ao principio de main, ou o resultado não será satisfatorio

    //Gerando numeros de 1 a 10
    int min = 1;
    int max = 10;
    int num = 0;

    while(1){
        Sleep(1000);
        num = sorteio(min, max);
        printf("%2d, ", num);

        //Comprovando se gerou numero entre min e o max
        if (num < min || num > max){
            printf("\nGerado um numero fora do intervalo entre %d e %d.\n\n", min, max); //Se gerou um numero fora do min e o max cai neste aviso
            getchar();//pausa
            break;
        }//if
    }//while

    return 0;
}

Se eu quero gerar números de 1 a 10 como no exemplo, eu atribuo a min = 1 e a max = 10. Se eu quero fazer o sorteio de números para seu vetor seria apenas fazer min=0 e max = (5*5)-1, que é o mesmo que 24, de 0 a 24 são 25 valores como o ja comentado antes, justo o 5*5 valores, mas em C começamos contando do 0, e por isso devemos terminar em 25-1. Sei que sou chato mesmo mas gosto de deixar claro HAHAHA.

Pegue esse código que eu postei e adapte ele para suas necessidades. Valeu?

Tem outro problema. O gerador de códigos não é 100% perfeito, pode repetir valores, ele não lembra os valores anteriores gerados, e poderia ser que o gerador lhe diga que insira 2 bombas na mesma casinha, pois pode repetir 2 valores, fazendo com que em vez de ter 5 minas você tenha 4 ou menos dependendo das vezes que gerou números repetidos. Para solucionar esse problema verifique se há uma bomba na posição que foi sorteada, caso já tenha uma bomba não insira outra :oops:, repita o sorteio para obter uma posição diferente. Beleza?

Com isso você pode terminar seu Campo minado.
Qualquer duvida pergunte.
Sorte!
 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Rodrigombem      para usar o rand você pode colocar assim :

for(linha=0;linha<5;linha++)
    campominado[rand()%5][rand()%5] = '*';

assim na posição escolhida randomicamente será coloca a mina,        então seu código com algumas modificações ficaria assim :

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<string.h>
#include <locale.h>
#include <windows.h>
void gotoxy(int x,int y)
{
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
int main(){
    setlocale(LC_ALL,"");
    srand(time(NULL));
    char campominado[5][5],cminado[5][5];
    int linha,coluna,i,j,k,flag=0,minas,nivel,jogada;
    printf("\n\n---------------------BEM VINDO AO CAMPO MINADO 2.0---------------------");/*//Criação do menu*/
    printf("\n\nEscolha um nível de dificuldade:\n\n(1) - fácil \n(2) - difícil \n(3) - Impossível: \n\n     -%c ",16);
    do{
        scanf("%d",&nivel);
    }while(nivel <1 || nivel > 3);
    for(i=0;i<5;i++)/*//criação do tabuleiro que aparece na tela*/
        for(j=0;j<5;j++)
            campominado[i][j]=0;

    if(nivel==1){
        printf("\n\nNeste nivel ha 5 minas no tabuleiro,boa sorte!     tecle ");
        minas=5;
    }
    else{
        if(nivel==2){
            printf("\n\nNeste nivel ha 12 minas no tabuleiro,boa sorte!     tecle ");
            minas = 12;
        }
        else{
            printf("\n\nNeste nivel ha 24 minas no tabuleiro,boa sorte!     tecle ");
            minas = 24;
        }
    }

    for(linha=0;linha<minas;linha++)
        campominado[rand()%5][rand()%5] = '*';
    getch();
    system("cls");
    printf("\n\n                  Colunas\n             0   1   2   3   4\n");
    printf("Liinha 0 ->    |   |   |   |   \n");
    printf("            ---+---+---+---+---\n");
    printf("Liinha 1 ->    |   |   |   |   \n");
    printf("            ---+---+---+---+---\n");
    printf("Liinha 2 ->    |   |   |   |   \n");
    printf("            ---+---+---+---+---\n");
    printf("Liinha 3 ->    |   |   |   |   \n");
    printf("            ---+---+---+---+---\n");
    printf("Liinha 4 ->    |   |   |   |   \n");
    for(jogada=1;jogada<4;jogada++){/* laço para controlar o nº de jogadas */
        do{
            gotoxy(5,15);
            printf("                                            \n");
            printf("                                              ");
            gotoxy(5,15);
            printf("Informa a linha que voce quer jogar: ");
            scanf("%d",&linha);
            printf("     Informe a coluna que voce quer jogar: ");
            scanf("%d",&coluna);
        }while((linha<0||linha>4) || (coluna<0||coluna>4));
        if(campominado[linha][coluna]=='*'){/* condição se marcar o espaço que está a mina, o jogo acaba */
            printf("\n\nVoce pisou na mina, buuummmm!");
            printf("\n\n       GAME OVER");
            flag=1;
            break;
        }
         else{
         campominado[linha][coluna]='X';/* condição se marcar um espaço sem mina, vai aparecer o X no tabuleiro */
        }
        for(i=0;i<5;i++){                /* quantidade de linhas */
            k=13;                        /* primeira posição */
            for(j=0;j<5;j++){            /* quantidade de colunas */
                if(campominado[i][j] !='*')/* verifica se nessa posição não eh mina */
                {
                    gotoxy(k,i*2+4);      /* coloca o cursor nessa posição */
                    printf("%c",campominado[i][j]);/* imprime o que está nessa posição */
                }
                k+=4;                     /* vai para a proxima posição no desenho na tela */
            }
        }
    }
    gotoxy(0,22);
    if(flag==0)printf("    Parabéns,  Você Venceu . . . !\n");
    printf("\n          Finalizar . . . !\n\n");
    getch();
    return 0;
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

9 horas atrás, devair1010 disse:

@Rodrigombem      para usar o rand você pode colocar assim :


for(linha=0;linha<5;linha++)
    campominado[rand()%5][rand()%5] = '*';

poder você pode. Mas o que você fará quando sair uma casinha repetida e for inseridos 2 asteriscos na mesma posição? Deve ser criado um sistema para não repetir ou caso contrario corre o risco de inserir 4 ou menos asteriscos caso aparecerem repetições. A única forma que conheço é ir averiguando si a casinha já possui um asterisco, ou "anotar" as posições sorteadas, porém essa ultima é ainda pior.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

agora, vangodp disse:

poder você pode. Mas o que você fará quando sair uma casinha repetida e for inseridos 2 asteriscos na mesma posição? Deve ser criado um sistema para não repetir ou caso contrario corre o risco de inserir 4 ou menos asteriscos caso aparecerem repetições. A única forma que conheço é ir averiguando si a casinha já possui um asterisco, ou "anotar" as posições sorteadas, porém essa ultima é ainda pior.

Ok, muito obrigado pela ajuda, vou tentar resolver agora.

Obrigado!

adicionado 1 minuto depois
10 horas atrás, devair1010 disse:

@Rodrigombem      para usar o rand você pode colocar assim :


for(linha=0;linha<5;linha++)
    campominado[rand()%5][rand()%5] = '*';

assim na posição escolhida randomicamente será coloca a mina,        então seu código com algumas modificações ficaria assim :


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<string.h>
#include <locale.h>
#include <windows.h>
void gotoxy(int x,int y)
{
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
int main(){
    setlocale(LC_ALL,"");
    srand(time(NULL));
    char campominado[5][5],cminado[5][5];
    int linha,coluna,i,j,k,flag=0,minas,nivel,jogada;
    printf("\n\n---------------------BEM VINDO AO CAMPO MINADO 2.0---------------------");/*//Criação do menu*/
    printf("\n\nEscolha um nível de dificuldade:\n\n(1) - fácil \n(2) - difícil \n(3) - Impossível: \n\n     -%c ",16);
    do{
        scanf("%d",&nivel);
    }while(nivel <1 || nivel > 3);
    for(i=0;i<5;i++)/*//criação do tabuleiro que aparece na tela*/
        for(j=0;j<5;j++)
            campominado[i][j]=0;

    if(nivel==1){
        printf("\n\nNeste nivel ha 5 minas no tabuleiro,boa sorte!     tecle ");
        minas=5;
    }
    else{
        if(nivel==2){
            printf("\n\nNeste nivel ha 12 minas no tabuleiro,boa sorte!     tecle ");
            minas = 12;
        }
        else{
            printf("\n\nNeste nivel ha 24 minas no tabuleiro,boa sorte!     tecle ");
            minas = 24;
        }
    }

    for(linha=0;linha<minas;linha++)
        campominado[rand()%5][rand()%5] = '*';
    getch();
    system("cls");
    printf("\n\n                  Colunas\n             0   1   2   3   4\n");
    printf("Liinha 0 ->    |   |   |   |   \n");
    printf("            ---+---+---+---+---\n");
    printf("Liinha 1 ->    |   |   |   |   \n");
    printf("            ---+---+---+---+---\n");
    printf("Liinha 2 ->    |   |   |   |   \n");
    printf("            ---+---+---+---+---\n");
    printf("Liinha 3 ->    |   |   |   |   \n");
    printf("            ---+---+---+---+---\n");
    printf("Liinha 4 ->    |   |   |   |   \n");
    for(jogada=1;jogada<4;jogada++){/* laço para controlar o nº de jogadas */
        do{
            gotoxy(5,15);
            printf("                                            \n");
            printf("                                              ");
            gotoxy(5,15);
            printf("Informa a linha que voce quer jogar: ");
            scanf("%d",&linha);
            printf("     Informe a coluna que voce quer jogar: ");
            scanf("%d",&coluna);
        }while((linha<0||linha>4) || (coluna<0||coluna>4));
        if(campominado[linha][coluna]=='*'){/* condição se marcar o espaço que está a mina, o jogo acaba */
            printf("\n\nVoce pisou na mina, buuummmm!");
            printf("\n\n       GAME OVER");
            flag=1;
            break;
        }
         else{
         campominado[linha][coluna]='X';/* condição se marcar um espaço sem mina, vai aparecer o X no tabuleiro */
        }
        for(i=0;i<5;i++){                /* quantidade de linhas */
            k=13;                        /* primeira posição */
            for(j=0;j<5;j++){            /* quantidade de colunas */
                if(campominado[i][j] !='*')/* verifica se nessa posição não eh mina */
                {
                    gotoxy(k,i*2+4);      /* coloca o cursor nessa posição */
                    printf("%c",campominado[i][j]);/* imprime o que está nessa posição */
                }
                k+=4;                     /* vai para a proxima posição no desenho na tela */
            }
        }
    }
    gotoxy(0,22);
    if(flag==0)printf("    Parabéns,  Você Venceu . . . !\n");
    printf("\n          Finalizar . . . !\n\n");
    getch();
    return 0;
}

 

Muito Obrigado pela ajuda.

Você poderia me explicar por que você utilizou a função gotoxy? E a variável k?

Link para o comentário
Compartilhar em outros sites

@Rodrigombem     a função gotoxy é para diminuir o tamanho do código,  assim o tabuleiro só precisa ser impresso uma vez, e na hora de imprimir o que está na matriz a função gotoxy  posiciona o cursor na posição adequada do tabuleiro, e a variável k é usada para indicar as colunas no tabuleiro pois a primeira coluna onde será impresso um caractere no tabuleiro é a coluna 13 e vai de 4 em 4 colunas, por isso +=4 .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...

@Kairuus Muniz    Olá , Sim , realmente esse jogo é extremamente simples ,  apenas hum esboço ,  e essa Questão de apenas três JoGadas , com Verteza seja por causa do LOop For em que está incluso os comandos de fazer as jogadas  ,  e como a variáveL   "jogada"    de coNtrole do loop que foi estabelecida pelo author do código OriGinal     @Rodrigombem  @Rodrigombem7 ,  vai de 1 até enquanto for menor que 4 ou seja vai de 1 até 3 , assim estipulou se que sejam apenas três acertos para vencer o jogo ,  mas dependendo de suas necessidades pode se modificar a condição do loop for para outros valores ,  como por exemplo :  se for fazer igual ao jogo original do Windows ,  precisa colocar um Loop etheRno , e ir verificando se ainda resta alguma posição do tabuleiro que que não tenha nenhuma bomba e ainda esteja vazia , e caso não exista nenhuma então aí sim mostrar a mensagem de vitória do Jogador .   então se você puder ;  exponha sua ideia  , de Quais as Regras que você quer desse jogo .  e se você tiver um código mais elaborado com mais opções e detalhes , como colocar som e cores

// antes da funcao main
void sonorizacao(int);        // protótipo da funcao
void textcolor_2(int,int);    // protótipo da funcao

// na funcao main
textcolor_2(14,0);            // chama a funcao e escrever com letras amarelas em fundo preto
sonorizacao(2000);            // valor da nota musical a ser apresentada

// Após a funcao main
void textcolor_2(int letras, int fundo)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                 letras + (fundo << 4));
}
void  sonorizacao(int s)
{
    for(int i=0; i<4; i++)
        Beep(s,150);          // frequencia da nota musical e tempo de pausa
}

e puder poste ele aqui e ajudaremos , caso precise de alguma correção . , . .,, . ..

Link para o comentário
Compartilhar em outros sites

@Kairuus Muniz    alguns comandos a mais dariam melhor resultado , e poderia ser assim  :

else{
    if(nivel==2){
        printf("\n\nNeste nivel ha 12 minas no tabuleiro,boa sorte!     tecle ");
        minas = 12;
    }
    else
    {
        printf("\n\nNeste nivel ha 24 minas no tabuleiro,boa sorte!     tecle ");
        minas = 24;
    }
}
for(linha=0;linha<minas;linha++)
{
    int cont = 0;
    label_1:
    inr lin  = rand()%5; // escolher uma linha de zero ate 4
    inr col  = rand()%5; // escolher uma coluna de zero ate 4
    //campominado[rand()%5][rand()%5] = '*';
    if(campominado[lin][col] == '*')
    {
        cont++;
        if(cont > 2000)
        {
            for(int x=0; x<5; x++)
            {
                for(int y=0; y<5; y++)
                {
                    if(campominado[x][y] == ' ')
                    {
                        campominado[x][y] = '*';
                        x = 5;  // sair do loop externo 
                        break;  // sair desse loop interno
                    }
                } 
            }
        }
        else
        {
            goto label_1;
        }
    }
}
getch();
system("cls");

 

Link para o comentário
Compartilhar em outros sites

Para exemplificar o que o @mauro_b disse, seria dessa maneira.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    char tabuleiro[10][10];
    int bombas[10*10];      /* Mesmo tamanho do tabuleiro */
    int linha, coluna;

    /* Inicia o tabuleiro */
    for (linha = 0; linha < 10; linha++) {
        for (coluna = 0; coluna < 10; coluna++) {
            tabuleiro[linha][coluna] = '-';         /* Marca como vazio */
        }
    }

    /* Inicia as bombas */
    for (linha = 0; linha < 10*10; linha++) {
        bombas[linha] = linha;
    }

    /* Inicia o gerador de numeros aletorios com a data e hora do sistema */
    srand(time(NULL));
    /* Embaralha o local das bombas */
    /* Utlizando o algoritomo Fisher–Yates */
    for (linha = 0; linha < 10*10; linha++) {
        int indice, temporario = bombas[linha];
        indice = rand()%(10*10);
        bombas[linha] = bombas[indice];
        bombas[indice] = temporario;
    }

    /* Coloca 20 bombas no tabuleiro */
    for (linha = 0; linha < 20; linha++) {
        /* bombas[linha]%10 = linha */
        /* bombas[linha]/10 = coluna */
        tabuleiro[bombas[linha]%10][bombas[linha]/10] = '*';
    }

    /* Mostra o tabuleiro */
    for (linha = 0; linha < 10; linha++) {
        for (coluna = 0; coluna < 10; coluna++) {
            printf("%c|", tabuleiro[linha][coluna]);
        }
        printf("\n");
    }
    getchar();
    return(0);
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...