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:  
ComputaçãoEng

C Desenvolvido no Dev-C++ para(windows) - CampoMinado v1.01

Recommended Posts

O menu parece estar com erro, pode me ajudar? qualquer opção que seleciono, faz o jogo para.

 

Dev-C++ (windows)

Campo Minado - v1.01

 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
/* Desenvolvido por @ComputaçãoEng*/
/* Protótipos: */
int Menu();               /* Menu do jogo */
int gerar_campo_minado(); /* Gera e mostra campo minado com valores ocultos, caso sua ativação seja status = "falsa": */
int verificar_ativacao(); /* Se ativação for status = "verdadeira", atualiza campo_2: */
int mostra_campo_minado();/* Imprime o campo atualizado... */ 
void Inicio();            /* Abertura do jogo*/
int Campo_1[10][10];      /* Gera valores a serem verificados de 0 a 5... */
int Campo_2[10][10];      /* Armazena os STATUS (ativado (1), desativado (0))... */
int marca_pontos = 0;     /* Marca a pontução feita*/
int para=0;               /* Usado para parar a geração de valores aleatorios*/
/* Desenvolvido por @ComputaçãoEng*/
  
int main(){
	Inicio();
	gerar_campo_minado();
	mostra_campo_minado();
	verificar_ativacao();
	Menu();
system("exit");
}
  
/* Menu de seleção*/
int Menu(){
	printf(" \n Pontuacao MAXIMA : %d ", marca_pontos);
	printf("\n\n");
	printf("     IIIIIIIIIIIIIIIIIIIIIIIII  \n");
	printf("     IIIIIIIIIIIIIIIIIIIIIIIII  \n");
	printf("   IIIIIIII    -MENU-   IIIIIIII\n");
	printf("   IIIIIIII             IIIIIIII\n");
	printf("   IIIIIII  1. RESTART   IIIIIII\n"); /*Reinicia campo minado... */
	printf("   IIIIIII  2. CONTINUE  IIIIIII\n"); /*Continua o campo minado antes da utima ação... */
	printf("   IIIIIII  3. SAIR      IIIIIII\n"); /*Para o joga... */
	printf("   IIIIIIII             IIIIIIII\n");
	printf("   IIIIIIII    -MENU-   IIIIIIII\n");
	printf("     IIIIIIIIIIIIIIIIIIIIIIIII  \n");
	printf("     IIIIIIIIIIIIIIIIIIIIIIIII  \n\n");
	int a;
	printf("  Menu: ");
	scanf("%d", &a);
	if( a == 3){
	 system("exit");
	}else if( a == 2){
		system("cls");
		main();
	}else if( a == 1){
		for(int x=0; x<10 ; x++){
			for(int y=0; y<10 ; y++){
				Campo_2[x][y] = 0;
			}
		}
		marca_pontos = 0;
		para = 0;
		system("cls");
		main();
	}
}
  
/* Se o status for ATIVADO (1), atualiza Campo minado mostrando valor...  */
/* Se o valor da coordenada for ZERO (0), então você encontrou uma mina...*/
int verificar_ativacao(){
	int x, y;
	do{
		printf("\n Coordenada: ");
		scanf("%d %d", &x, &y);
		if(x > 8 || x < 0){
			printf("\n VALOR INVALIDO! ");
			system("cls");
			mostra_campo_minado();
		}else if(Campo_1[x][y] > 0 && Campo_1[x][y] < 5){
			Campo_2[x][y] = 1;
			marca_pontos += Campo_1[x][y]; 
			system("cls");
			mostra_campo_minado();
		}else if(Campo_1[x][y] == 0){
			x = y = 0;
			system("cls");
			break;
		}
	}while(1);
	printf("\n-----------------------------------------------------------------------------------------\n");
	printf("  IIIIIIIIIIII     IIIIIIII      IIIIIIII    IIIIII          IIIIII    IIII  IIII  IIII\n");
	printf("  IIIII   IIIII  IIIIIIIIIIII  IIIIIIIIIIII   IIIIII        IIIIII     IIII  IIII  IIII\n");
	printf("  IIII     IIII  IIII    IIII  IIII    IIII   IIIIIII      IIIIIII     IIII  IIII  IIII\n");
	printf("  IIIII   IIIII  III      III  III      III   IIIIIIII    IIIIIIII     IIII  IIII  IIII\n");
	printf("  IIIIIIIIIII    III      III  III      III   IIII IIII  IIII IIII     IIII  IIII  IIII\n");
	printf("  IIIII   IIIII  III      III  III      III   IIII  IIIIIIII  IIII     IIII  IIII  IIII\n");
	printf("  IIII     IIII  IIII    IIII  IIII    IIII   IIII   IIIIII   IIII                     \n");
	printf("  IIIII   IIIII  IIIIIIIIIIII  IIIIIIIIIIII   IIII    IIII    IIII     IIII  IIII  IIII\n");
	printf("  IIIIIIIIIIII     IIIIIIII      IIIIIIII    IIIIII          IIIIII    IIII  IIII  IIII\n");	
	printf("-------------------------------------------------------------------------------------------\n\n\n");
	Sleep(2000);
	system("cls");
}
                                                         
/* Imprime Campo minado na tela... */
int mostra_campo_minado(){
	printf("\n           Pontos: %d", marca_pontos);
	printf("\n\n");
	printf("        1  2  3  4  5  6  7  8 \n");
	for(int x=0 ; x<10 ; x++){
		if( x > 0 && x <9){
			printf("  %d ", x);
		}else{
			printf("    ");
		}
		for(int y=0 ; y<10 ; y++){
			if(Campo_1[x][y] == 8){
				putchar(219);
				putchar(219);
				putchar(219);		
			}else if(Campo_2[x][y] == 1){
				putchar(32);
				printf("%d", Campo_1[x][y]);
				putchar(32);
			}else{
				putchar(32);
				putchar('*');
				putchar(32);
			}
		}
		printf("\n");
	}
}
  
/* Gera Valores aleatórios para o campo minado... */
int gerar_campo_minado(){
	if(para == 0){
		for(int x=0 ; x <10 ; x++){
			for(int y=0 ; y <10 ; y++){
				Campo_1[x][y] = rand()%5;
				if( x == 0 || x == 9 || y == 0 || y == 9){
					Campo_1[x][y] = 8;
				}
			}
		}
		para++;
	}
	
}
  
 /* Abertura */
void Inicio(){
	if(para == 0){	
		printf("\n");
		printf("\n");
		printf("	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n");
		printf("	IIII              IIII              IIII\n");
		printf("	IIII     IIIIII   IIII   IIIIII     IIII\n");
		printf("	IIII      IIII    IIII    IIII      IIII\n");
		printf("	IIII      IIII    IIII    IIII      IIII\n");
		printf("	IIIIII    IIII            IIII    IIIIII\n");
		printf("	IIIIII    IIIIIIIIIIIIIIIIIIII    IIIIII\n");
		printf("	IIIIII    IIII            IIII    IIIIII\n");
		printf("	IIII      IIII    IIII    IIII      IIII\n");
		printf("	IIII      IIII    IIII    IIII      IIII\n");
		printf("	IIII     IIIIII   IIII   IIIIII     IIII\n");
		printf("	IIII              IIII              IIII\n");
		printf("	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n");
		printf("\n");
		for(int load=0; load<100 ; load = load + 1 + rand()%40 ){
			printf("Loading %d%% : ", load);
			for(int pt=0; pt<40 ; pt++){
				putchar(219);
				for(int timer=0; timer < 4000000 ; timer++);
			}
			printf("\r");
			for(int limpa=0; limpa<100 ; limpa++ ){
				putchar(32);
			}
			printf("\r");
		}
		system("cls");
	}
/* Desenvolvido por @ComputaçãoEng*/
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ComputaçãoEng para o jogo continuar você precisa colocar um laço de repetição que pode ser o do / while  que vai repetir a parte do código que você precisa, e se quiser parar o jogo então digite ESC , ou quando ganhar o jogo . esse loop seria assim :

int main(){
    int op;
    do{
        Inicio();
        gerar_campo_minado();
        mostra_campo_minado();
        verificar_ativacao();
        Menu();
        printf("Tecle ESC Para Parar\n");
        if(kbhit())op = getch();
    }while(op != 27);/* 27 é o código ASCII de ESC */
    system("exit");
    return 0;
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também fiz um campo minado, vai meu código abaixo:

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

//Tamanho do Campo Minado
#define TAM 9

//Número de Minas
#define N_MINAS 10

/*Define cada área do campo
Valores:
  -1     ->  Área contém Mina (*)
  0 a 8  ->  Quantidade de Minas ao redor da área
Estados:
  0      ->  Não revelado
  1      ->  Revelado
*/
typedef struct {char valor, estado;} area;


//Arma minas no campo e coloca valores nas casas sem minas
void armarminas(area campominado[TAM][TAM]) {
    int v[TAM*TAM], i, j, n, m, x, y, c;

    //Preenche vetor com números de 0 a TAM*TAM:
    for (i=0; i < TAM*TAM; i++){
        v[i] = i;
    }

    //Embaralha números no vetor usando o algoritmo Knuth Fisher-Yates:
    for (i = TAM*TAM-1; i>0; i--){
        n = rand() % (i+1);
        m = v[i];
        v[i] = v[n];
        v[n] = m;
    }

    //Usa os primeros N números do vetor para determinar as posições onde
    //as minas vão:
    for(i=0; i<N_MINAS; i++){
        campominado[v[i]/TAM][v[i]%TAM].valor = -1; //-1 = Posição contém mina
    }

    //Define o número de cada área do campo minado que não contém uma mina,
    //ou seja quantas minas existem ao redor de cada área:
    for (i = 0; i<TAM; i++){
        for (j = 0; j<TAM; j++){
            //se a área não tem mina:
            if (campominado[i][j].valor != -1){
                //Conta quantas minas tem ao redor da área e atribui ao valor
                //da área:
                c = 0;
                for (x = i-1; x < i+2; x++){
                    for (y = j-1; y < j+2; y++){
                        if (x>=0 && x<TAM && y>=0 && y<TAM && campominado[x][y].valor < 0)
                            c++;
                    }
                }
                campominado[i][j].valor = c;
            }
        }
    }
}

//Imprime na tela o campo minado
void imprimircampo(area campominado[TAM][TAM]){
    int i, j;

    //Limpa a tela:
    for (i = 0; i<4; i++){
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }

    printf("Colunas  ");
    for (i = 0; i<TAM; i++){
        printf(" %c", 'A'+i);
    }
    printf("\n----------");
    for (i = 0; i<TAM; i++){
        printf("--");
    }
    printf("\nLinhas|\n");

    for (i = 0; i<TAM; i++){
        printf("  %2d  |  ", i+1);
        for (j = 0; j<TAM; j++){
            if(campominado[i][j].estado == 0) printf(" %c", 254); //Não revelado
            else if(campominado[i][j].valor < 0) printf(" *"); //Mina
            else if(campominado[i][j].valor) printf(" %hhd", campominado[i][j].valor); //Número Minas ao redor
            else printf(" ."); //Área sem minas ao redor
        }
        printf("\n");
    }
}

//Se não há minas ao redor da área automaticamente limpa as áreas ao redor
void limpaareasvazias(area campominado[TAM][TAM], int l, int c){
    int i, j;
    for (i = l-1; i<l+2; i++){
        for (j = c-1; j<c+2; j++){
            //Se a posição existe e a área não foi revelada:
            if (i>=0 && i<TAM && j>=0 && j<TAM && campominado[i][j].estado == 0){
                campominado[i][j].estado = 1; //Revela área
                //Se a nova área também não tem minas ao redor:
                if(campominado[i][j].valor == 0){
                    limpaareasvazias(campominado, i, j);
                }
            }
        }
    }
}

int main()
{
    srand(time(NULL));

    int i, j, k, l, c, parar = 0, venceu;
    area campominado[TAM][TAM] = {0};


    armarminas(campominado);

    while(!parar){
        imprimircampo(campominado);

        printf("\nDigite a coluna e linha (ex: A1): ");
        scanf("%c%d", &c, &l);
        getchar();
        c = toupper(c)-'A';
        l--;
        //Se não for uma posição válida:
        if(c<0 || c>=TAM || l<0 || l>=TAM)
            continue;

        //Se não tiver mina:
        if(campominado[l][c].valor > 0){
            campominado[l][c].estado = 1;
        }
        else if(campominado[l][c].valor == 0){
            campominado[l][c].estado = 1;
            limpaareasvazias(campominado, l, c);
        }
        //Se tem mina:
        else {
            parar = 1; //Parar
            venceu = 0; //Perdeu
            //Revela todas as minas:
            for (i = 0; i<TAM; i++){
                for (j = 0; j<TAM; j++){
                    if(campominado[i][j].valor < 0)
                        campominado[i][j].estado = 1;
                }
            }
        }

        //Conta o número de casas não reveladas:
        k = 0;
        for(i=0; i<TAM; i++){
            for(j=0; j<TAM; j++){
                if(campominado[i][j].estado == 0)
                    k++;
            }
        }
        //Se a quantidade de casas não reveladas é igual ao número de minas:
        if(k == N_MINAS && !parar){
            parar = 1; //Parar
            venceu = 1; //Venceu
        }
    }

    imprimircampo(campominado);
    if(venceu)
        printf("\n *** PARABENS voce VENCEU *** \n");
    else
        printf("\n !!! BOOM !!! \n");

    return 0;
}

É possível mudar o tamanho e o número de minas modificando as constantes definidas no começo do código. Está configurado para o nível fácil do campo minado do Windows, com campo 9x9 e 10 minas, mas poderia por exemplo modificar para o nível médio do campo minado do Windows que tem dimensão 16x16 e 40 minas.

Editado por isrnick
  • Curtir 1
  • Obrigado 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segunda versão do meu campo minado, agora com 4 modos de jogo (fácil, médio, difícil e personalizado):

 

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

//Tamanho Máximo do Campo Minado
#define TAM 30

int tl = 9, tc = 9, nm = 10;

/*Define cada área do campo
Valores:
  -1     ->  Área contém Mina (*)
  0 a 8  ->  Quantidade de Minas ao redor da área
Estados:
  0      ->  Não revelado
  1      ->  Revelado
*/
typedef struct {char valor, estado;} area;

//Arma minas no campo e coloca valores nas casas sem minas
void armarminas(area campominado[TAM][TAM]) {
    int v[tl*tc], i, j, n, m, x, y, c;

    //Preenche vetor com números de 0 a tl*tc:
    for (i=0; i < tl*tc; i++){
        v[i] = i;
    }

    //Embaralha números no vetor usando o algoritmo Knuth Fisher-Yates:
    for (i = tl*tc-1; i>0; i--){
        n = rand() % (i+1);
        m = v[i];
        v[i] = v[n];
        v[n] = m;
    }
    
    //Zera todas as areas do campo minado
    for (i = 0; i<tl; i++){
        for (j = 0; j<tc; j++){
            campominado[i][j].estado = 0;
            campominado[i][j].valor = 0;
        }
    }
    
    
    //Usa os primeros N números do vetor para determinar as posições onde
    //as minas vão:
    for(i=0; i<nm; i++){
        printf(" %d", v[i]);
        campominado[v[i]/tc][v[i]%tc].valor = -1; //-1 = Posição contém mina
    }
    printf("\n");

    //Define o número de cada área do campo minado que não contém uma mina,
    //ou seja quantas minas existem ao redor de cada área:
    for (i = 0; i<tl; i++){
        for (j = 0; j<tc; j++){
            //se a área não tem mina:
            if (campominado[i][j].valor != -1){
                //Conta quantas minas tem ao redor da área e atribui ao valor
                //da área:
                c = 0;
                for (x = i-1; x < i+2; x++){
                    for (y = j-1; y < j+2; y++){
                        if (x>=0 && x<tl && y>=0 && y<tc && campominado[x][y].valor < 0)
                            c++;
                    }
                }
                campominado[i][j].valor = c;
            }
        }
    }
}

//Imprime na tela o campo minado
void imprimircampo(area campominado[TAM][TAM]){
    int i, j;

    //Limpa a tela:
    for (i = 0; i<4; i++){
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }

    printf("Colunas  ");
    for (i = 0; i<tc; i++){
        printf(" %c", 'A'+i);
    }
    printf("\n----------");
    for (i = 0; i<tc; i++){
        printf("--");
    }
    printf("\nLinhas|\n");

    for (i = 0; i<tl; i++){
        printf("  %2d  |  ", i+1);
        for (j = 0; j<tc; j++){
            if(campominado[i][j].estado == 0) printf(" %c", 254); //Não revelado
            else if(campominado[i][j].valor < 0) printf(" %c", 15); //(" *"); //Mina
            else if(campominado[i][j].valor) printf(" %hhd", campominado[i][j].valor); //Número Minas ao redor
            else printf(" ."); //Área sem minas ao redor
        }
        printf("\n");
    }
}

//Se não há minas ao redor da área automaticamente limpa as áreas ao redor
void limpaareasvazias(area campominado[TAM][TAM], int l, int c){
    int i, j;
    for (i = l-1; i<l+2; i++){
        for (j = c-1; j<c+2; j++){
            //Se a posição existe e a área não foi revelada:
            if (i>=0 && i<tl && j>=0 && j<tc && campominado[i][j].estado == 0){
                campominado[i][j].estado = 1; //Revela área
                //Se a nova área também não tem minas ao redor:
                if(campominado[i][j].valor == 0){
                    limpaareasvazias(campominado, i, j);
                }
            }
        }
    }
}

int main()
{
    srand(time(NULL));

    int i, j, k, op, l;
    char c, ch, parar = 0, venceu;
    area campominado[TAM][TAM] = {0};


    do {
        printf("\n ======== CAMPO MINADO ========\n\n");

        printf(" 1 - fácil   ->  9 x  9 : 10 minas\n");
        printf(" 2 - Medio   -> 16 x 16 : 40 minas\n");
        printf(" 3 - difícil -> 16 x 30 : 99 minas\n");
        printf(" 4 - Personalizado\n");
        printf(" 0 - Sair\n\n");

        printf(" Opcao: ");
        scanf("%d", &op);
        while ((ch = getchar()) != '\n' && ch != EOF);

        switch(op){
            case 1:
                tl = 9;
                tc = 9;
                nm = 10;
                break;
            case 2:
                tl = 16;
                tc = 16;
                nm = 40;
                break;
            case 3:
                tl = 16;
                tc = 30;
                nm = 99;
                break;
            case 4:
                printf("\n  - Numero de linhas [9 a 30]: ");
                scanf("%d", &tl);
                if(tl < 9)
                    tl = 9;
                if(tl > 30)
                    tl = 30;
                printf("  - Numero de colunas [9 a 30]: ");
                scanf("%d", &tc);
                if(tc < 9)
                    tc = 9;
                if(tc > 30)
                    tc = 30;
                printf("  - Numero de minas [1 a %d]: ", (tl*tc - tl - tc + 1));
                scanf("%d", &nm);
                if(nm < 1)
                    nm = 1;
                if(nm > (tl*tc - tl - tc + 1))
                    nm = tl*tc - tl - tc + 1;
                while ((ch = getchar()) != '\n' && ch != EOF);
                printf("\n Campo minado personalizado -> %2d x %2d : %d minas\n ", tl, tc, nm);
                while ((ch = getchar()) != '\n' && ch != EOF);
                break;
            case 0:
                continue;
            default:
                continue;

        }

        armarminas(campominado);

        parar = 0;
        while(!parar){
            imprimircampo(campominado);

            printf("\nDigite a coluna e linha (ex: A1): ");
            scanf("%c%d", &c, &l);
            while ((ch = getchar()) != '\n' && ch != EOF);
            c = toupper(c)-'A';
            l--;
            //Se não for uma posição válida:
            if(c<0 || c>=tc || l<0 || l>=tl)
                continue;

            //Se não tiver mina:
            if(campominado[l][c].valor > 0){
                campominado[l][c].estado = 1;
            }
            else if(campominado[l][c].valor == 0){
                campominado[l][c].estado = 1;
                limpaareasvazias(campominado, l, c);
            }
            //Se tem mina:
            else {
                parar = 1; //Parar
                venceu = 0; //Perdeu
                //Revela todas as minas:
                for (i = 0; i<tl; i++){
                    for (j = 0; j<tc; j++){
                        if(campominado[i][j].valor < 0)
                            campominado[i][j].estado = 1;
                    }
                }
            }

            //Conta o número de casas não reveladas:
            k = 0;
            for(i=0; i<tl; i++){
                for(j=0; j<tc; j++){
                    if(campominado[i][j].estado == 0)
                        k++;
                }
            }
            //Se a quantidade de casas não reveladas é igual ao número de minas:
            if(k == nm && !parar){
                parar = 1; //Parar
                venceu = 1; //Venceu
            }
        }

        imprimircampo(campominado);
        if(venceu)
            printf("\n *** PARABENS voce VENCEU *** \n");
        else
            printf("\n !!! BOOM !!! \n");
        while ((ch = getchar()) != '\n' && ch != EOF);

        //Limpa a tela:
        for (i = 0; i<4; i++){
            printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        }
    }while(op != 0);

    return 0;
}

 

Editado por isrnick
  • Obrigado 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






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

×