Ir ao conteúdo

Posts recomendados

Postado

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

 

Postado

@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 1
Postado
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?

Postado

@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
  • 3 anos depois...
Postado

@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 . , . .,, . ..

Postado

@devair1010 Desse jeito tá perfeito já, só achei que seria do tradicional e pensei que estava algo errado, mas eu tenho uma outra dúvida, eu acho que está repetindo bombas na mesma posição, você tem uma ideia de como resolver isso?

 

Postado

O algoritmo de embaralhamento Fisher-Yates é um método de gerar números aleatórios preenchendo um vetor que depois pode ser usado para pegar valores "aleatórios" sem repetição.

 

 

 

  • Curtir 2
Postado

@devair1010

 for(linha=0;linha<bombas;linha++)
            campo[rand()%5][rand()%5] = '*';
            if(campo[linha][coluna]=='*')
            linha--;

Tentei dessa maneira e não deu certo, como você sugere? Não estou conseguindo.

Postado

@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");

 

Postado

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

 

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!