Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Visitante

C Campo Minado em C

Recommended Posts

Visitante

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();
 }

 

  • Curtir 1

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  •    3
    Visitante
    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?

    • Curtir 2

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro 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
    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×