Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Rodrigombem

C Campo Minado em C

Recommended Posts

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

 

Editado por Simon Viegas
Olá! Favor ler tópico e seguir orientações sobre POSTAGEM DE CÓDIGOS: http://www.clubedohardware.com.br/announcement/27-poste-seus-c%C3%B3digos-corretamente/
  • 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
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 .

Editado por devair1010
  • 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

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

×